From 2176efcdf06acb6134cdce3e999448d968b1cdad Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Mon, 23 Dec 2024 18:00:22 +0800 Subject: [PATCH] =?UTF-8?q?modify=20=E8=B8=A2=E5=87=BA=E6=88=BF=E9=97=B4?= =?UTF-8?q?=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/base/player.go | 2 +- gamesrv/tienlen/playerdata_tienlen.go | 1 + gamesrv/tienlen/scenedata_tienlen.go | 4 ++ gamesrv/tienlen/scenepolicy_tienlen.go | 51 +++++++++++++++++++++++--- 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/gamesrv/base/player.go b/gamesrv/base/player.go index 7582869..0bf54af 100644 --- a/gamesrv/base/player.go +++ b/gamesrv/base/player.go @@ -337,7 +337,7 @@ func (this *Player) OnRehold(newSid int64, newSess *netlib.Session) { func (this *Player) OnDropLine() { this.UnmarkFlag(PlayerState_Online) - if !this.scene.Gaming && this.IsReady() && !this.scene.IsMatchScene() { + if !this.scene.Gaming && this.IsReady() && !this.scene.IsMatchScene() && !this.scene.IsCustom() { this.UnmarkFlag(PlayerState_Ready) } this.SyncFlag() diff --git a/gamesrv/tienlen/playerdata_tienlen.go b/gamesrv/tienlen/playerdata_tienlen.go index eb536c3..f5b10f5 100644 --- a/gamesrv/tienlen/playerdata_tienlen.go +++ b/gamesrv/tienlen/playerdata_tienlen.go @@ -32,6 +32,7 @@ type TienLenPlayerData struct { cardScore int // 手牌评分 playerPool int // 个人水池分 handlId timer.TimerHandle + isPlaying bool // 本局参与游戏 } func (this *TienLenPlayerData) init() { diff --git a/gamesrv/tienlen/scenedata_tienlen.go b/gamesrv/tienlen/scenedata_tienlen.go index 331a337..4af0bea 100644 --- a/gamesrv/tienlen/scenedata_tienlen.go +++ b/gamesrv/tienlen/scenedata_tienlen.go @@ -10,6 +10,7 @@ import ( "time" "mongo.games.com/goserver/core/logger" + "mongo.games.com/goserver/core/timer" tienlenApi "mongo.games.com/game/api3th/smart/tienlen" "mongo.games.com/game/common" @@ -260,6 +261,9 @@ func (this *TienLenSceneData) delPlayer(p *base.Player) { if p, exist := this.players[p.SnId]; exist { this.seats[p.GetPos()] = nil delete(this.players, p.SnId) + if p.handlId > 0 { + timer.StopTimer(p.handlId) + } } } func (this *TienLenSceneData) OnPlayerLeave(p *base.Player, reason int) { diff --git a/gamesrv/tienlen/scenepolicy_tienlen.go b/gamesrv/tienlen/scenepolicy_tienlen.go index 3df9299..e876f3e 100644 --- a/gamesrv/tienlen/scenepolicy_tienlen.go +++ b/gamesrv/tienlen/scenepolicy_tienlen.go @@ -167,22 +167,28 @@ func (this *ScenePolicyTienLen) OnPlayerDropLine(s *base.Scene, p *base.Player) p.MarkFlag(base.PlayerState_Auto) p.SyncFlag() } else { + playerEx, ok := p.GetExtraData().(*TienLenPlayerData) + if !ok || playerEx == nil { + return + } if sceneEx.IsCustom() { // 如果是等待状态,付费且准备的玩家不踢出,付费没有准备的延迟踢出,未付费的直接踢出 switch sceneEx.GetSceneState().GetState() { case rule.TienLenSceneStateWaitPlayer: - playerEx, ok := p.GetExtraData().(*TienLenPlayerData) - if !ok || playerEx == nil { - return - } if s.GetCustom().GetCostType() == 2 && playerEx.GetSnId() != s.GetCreator() { s.PlayerLeave(p, common.PlayerLeaveReason_DropLine, true) - } else if !playerEx.IsMarkFlag(base.PlayerState_Ready) { + } else { playerEx.handlId, _ = timer.AfterTimer(func(h timer.TimerHandle, ud interface{}) bool { s.PlayerLeave(p, common.PlayerLeaveReason_DropLine, true) return true }, nil, time.Minute) } + + case rule.TienLenSceneStateBilled: + if (s.GetCustom().GetCostType() == 2 && playerEx.GetSnId() != s.GetCreator()) || !playerEx.IsMarkFlag(base.PlayerState_Ready) { + s.PlayerLeave(p, common.PlayerLeaveReason_DropLine, true) + } + default: } } else { @@ -713,7 +719,7 @@ func (this *SceneBaseStateTienLen) OnPlayerOp(s *base.Scene, p *base.Player, opc return true } - if sceneEx.IsCustom() && sceneEx.GetSceneState().GetState() == rule.TienLenSceneStateWaitPlayer { + if sceneEx.IsCustom() && sceneEx.GetSceneState().GetState() == rule.TienLenSceneStateBilled { // 玩家继续 if !playerEx.IsMarkFlag(base.PlayerState_Ready) { playerEx.MarkFlag(base.PlayerState_Ready) @@ -1040,6 +1046,7 @@ func (this *SceneHandCardStateTienLen) OnEnter(s *base.Scene) { // 首次进入赠送记牌器 sceneEx.SendFirstGiveTimeItem(playerEx.Player) + playerEx.isPlaying = true playerEx.GameTimes++ sceneEx.curGamingPlayerNum++ if playerEx.IsRob { @@ -2930,6 +2937,16 @@ func (this *SceneBilledStateTienLen) OnLeave(s *base.Scene) { if sceneEx.IsMatchScene() { continue } + + // 没有继续的踢出房间 + if !player_data.IsRobot() && sceneEx.IsCustom() && + !player_data.IsMarkFlag(base.PlayerState_Ready) && player_data.isPlaying { + sceneEx.PlayerLeave(player_data.Player, common.PlayerLeaveReason_LongTimeNoOp, true) + hasLeave = true + continue + } + player_data.isPlaying = false + if !player_data.IsOnLine() { sceneEx.PlayerLeave(player_data.Player, common.PlayerLeaveReason_DropLine, true) hasLeave = true @@ -3020,6 +3037,28 @@ func (this *SceneBilledStateTienLen) OnTick(s *base.Scene) { //if sceneEx.IsCustom() && sceneEx.NumOfGames >= int(sceneEx.TotalOfGames) { // newTime += time.Second * 20 //} + if sceneEx.IsCustom() { + newTime = 60 * time.Second + } + + if sceneEx.IsCustom() { + // 所有参与游戏的玩家都准备了 + var has bool + for _, player := range sceneEx.players { + if player.isPlaying && !player.IsMarkFlag(base.PlayerState_Ready) { + has = true + break + } + } + if !has { + if sceneEx.CanStart() == true { + s.ChangeSceneState(rule.TienLenSceneStateWaitStart) + } else { + s.ChangeSceneState(rule.TienLenSceneStateWaitPlayer) + } + return + } + } if time.Now().Sub(sceneEx.StateStartTime) > newTime { //开始前再次检查开始条件