diff --git a/gamesrv/slotspkg/slots/slotsmgr.go b/gamesrv/slotspkg/slots/slotsmgr.go index 1c142e5..d0c0c14 100644 --- a/gamesrv/slotspkg/slots/slotsmgr.go +++ b/gamesrv/slotspkg/slots/slotsmgr.go @@ -26,6 +26,7 @@ func (sm *SlotsMgr) Update() { func (sm *SlotsMgr) Shutdown() { plugin.Close() + module.UnregisteModule(sm) } func init() { module.RegisteModule(SlotsMgrSington, time.Hour, 0) diff --git a/gamesrv/thirteen/scene.go b/gamesrv/thirteen/scene.go index af3c1b7..3395455 100644 --- a/gamesrv/thirteen/scene.go +++ b/gamesrv/thirteen/scene.go @@ -84,6 +84,8 @@ type SceneEx struct { testPokers []int64 // 测试牌堆 logid string ctrlType int // 1控赢 2控输 0不控 + cardsArr [][13]int + cardsGroup []map[int]*rule.Group } func NewThirteenWaterSceneData(s *base.Scene) *SceneEx { @@ -125,6 +127,8 @@ func (this *SceneEx) Clear() { this.PlayerBackup = make(map[int32]*PlayerData) this.LeaveNum = 0 this.ctrlType = 0 + this.cardsArr = nil + this.cardsGroup = nil for i := 0; i < this.GetPlayerNum(); i++ { if this.seats[i] != nil { @@ -520,10 +524,9 @@ func (this *SceneEx) GetScore(player *PlayerEx) { } } -// 发送玩家的所有牌和所有牌型 -func (this *SceneEx) SendToPlayerCards(s *base.Scene) { +func (this *SceneEx) SendToPlayerCardsBySnid(snid int32) { for _, player := range this.players { - if player != nil && player.IsGameing() { + if player != nil && player.IsGameing() && (snid == 0 || player.SnId == snid) { all, k := AllGroupToProto(player.allGroup) pack := &thirteen.SCThirteenPlayerCards{ Cards: common.CopySliceIntToInt32(player.cards[:]), @@ -554,7 +557,7 @@ func (this *SceneEx) SendToPlayerCards(s *base.Scene) { } proto.SetDefaults(Send) logger.Logger.Trace("SCThirteenWaterPlayerCards:", Send) - s.Broadcast(int(thirteen.TWMmoPacketID_PACKET_SCThirteenPlayerCards), Send, player.GetSid()) + this.Broadcast(int(thirteen.TWMmoPacketID_PACKET_SCThirteenPlayerCards), Send, player.GetSid()) } } } @@ -1351,11 +1354,11 @@ func (this *SceneEx) SendHandCardOdds() { this.poker.Init() - cardsArr := make([][13]int, this.poker.N*4) - cardsGroup := make([]map[int]*rule.Group, this.poker.N*4) - for k := range cardsArr { - cardsArr[k] = this.poker.Get13Crads() - cardsGroup[k] = this.logic.Suggest(cardsArr[k]) + this.cardsArr = make([][13]int, this.poker.N*4) + this.cardsGroup = make([]map[int]*rule.Group, this.poker.N*4) + for k := range this.cardsArr { + this.cardsArr[k] = this.poker.Get13Crads() + this.cardsGroup[k] = this.logic.Suggest(this.cardsArr[k]) } f := func(players *[]*PlayerEx) { @@ -1382,16 +1385,16 @@ func (this *SceneEx) SendHandCardOdds() { var group map[int]*rule.Group if p.odds > 0 { // 拿好牌 - cards = cardsArr[0] - cardsArr = cardsArr[1:] - group = cardsGroup[0] - cardsGroup = cardsGroup[1:] + cards = this.cardsArr[0] + this.cardsArr = this.cardsArr[1:] + group = this.cardsGroup[0] + this.cardsGroup = this.cardsGroup[1:] } else { // 拿坏牌 - cards = cardsArr[len(cardsArr)-1] - cardsArr = cardsArr[:len(cardsArr)-1] - group = cardsGroup[len(cardsGroup)-1] - cardsGroup = cardsGroup[:len(cardsGroup)-1] + cards = this.cardsArr[len(this.cardsArr)-1] + this.cardsArr = this.cardsArr[:len(this.cardsArr)-1] + group = this.cardsGroup[len(this.cardsGroup)-1] + this.cardsGroup = this.cardsGroup[:len(this.cardsGroup)-1] } p.cards = cards p.allGroup = group @@ -1409,7 +1412,7 @@ func (this *SceneEx) SendHandCardOdds() { } if isGood || isBad { // 按从大到小排序 - this.cardsSort(cardsArr, cardsGroup) + this.cardsSort(this.cardsArr, this.cardsGroup) // 发好牌 if isGood { @@ -1431,10 +1434,10 @@ func (this *SceneEx) SendHandCardOdds() { if v == nil || !v.IsGameing() || v.cards[0] != -1 { continue } - v.cards = cardsArr[0] - v.allGroup = cardsGroup[0] - cardsArr = cardsArr[1:] - cardsGroup = cardsGroup[1:] + v.cards = this.cardsArr[0] + v.allGroup = this.cardsGroup[0] + this.cardsArr = this.cardsArr[1:] + this.cardsGroup = this.cardsGroup[1:] } for _, player := range this.players { diff --git a/gamesrv/thirteen/scenepolicy.go b/gamesrv/thirteen/scenepolicy.go index a577c4f..1a2f6c6 100644 --- a/gamesrv/thirteen/scenepolicy.go +++ b/gamesrv/thirteen/scenepolicy.go @@ -85,7 +85,13 @@ func (this *PolicyThirteen) OnPlayerEnter(s *base.Scene, p *base.Player) { p.Pos = pos p.ExtraData = playerEx playerEx.Clear() - if sceneEx.Gaming { + if sceneEx.Gaming && sceneEx.GetSceneState().GetState() != rule.ThirteenWaterSceneStateSendCards && + sceneEx.GetSceneState().GetState() != rule.ThirteenWaterSceneStateOptCard { // 发牌,理牌阶段也可以加入本局游戏 + p.MarkFlag(base.PlayerState_WaitNext) + p.UnmarkFlag(base.PlayerState_Ready) + } + if sceneEx.Gaming && sceneEx.GetSceneState().GetState() == rule.ThirteenWaterSceneStateOptCard && + int(rule.ThirteenWaterOptCardTimeout.Seconds())-s.GetSceneState().GetTimeout(s) < 15 { p.MarkFlag(base.PlayerState_WaitNext) p.UnmarkFlag(base.PlayerState_Ready) } @@ -495,6 +501,27 @@ func (this *BaseState) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, par } func (this *BaseState) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) { + if sceneEx, ok := s.ExtraData.(*SceneEx); ok { + switch evtcode { + case base.PlayerEventLeave: + case base.PlayerEventEnter: + // 发牌和选牌阶段,给玩家发牌 + if s.GetSceneState().GetState() == rule.ThirteenWaterSceneStateSendCards || + s.GetSceneState().GetState() == rule.ThirteenWaterSceneStateOptCard { + if p.IsGameing() { + playerEx, ok := p.ExtraData.(*PlayerEx) + if ok && len(sceneEx.cardsArr) > 0 && playerEx.cards[0] == -1 { + playerEx.cards = sceneEx.cardsArr[0] + playerEx.allGroup = sceneEx.cardsGroup[0] + sceneEx.cardsArr = sceneEx.cardsArr[1:] + sceneEx.cardsGroup = sceneEx.cardsGroup[1:] + sceneEx.SendToPlayerCardsBySnid(p.SnId) + logger.Logger.Tracef("游戏开始后给玩家发牌, sceneId=%v, player=%v, cards=%v", s.GetSceneId(), p.SnId, playerEx.cards) + } + } + } + } + } } //===================================== @@ -731,7 +758,7 @@ func (this *StateSendCard) OnEnter(s *base.Scene) { //} sceneEx.SendHandCardOdds() } - sceneEx.SendToPlayerCards(s) + sceneEx.SendToPlayerCardsBySnid(0) } } @@ -1085,8 +1112,35 @@ func (this *StateShow) OnEnter(s *base.Scene) { logger.Logger.Tracef("(this *StateShow) OnEnter, sceneid=%v currpos:%v", s.GetSceneId(), sceneEx.currOpPos) sceneEx.ShowCards() // 每人看牌5秒,特殊牌型不算; - var n int - var has bool + //var n int + //var has bool + //for _, v := range sceneEx.players { + // if v != nil && v.IsGameing() && v.cardsO != nil { + // n++ + // if v.cardsO.PokerType == 1 { // 有青龙 + // has = true + // } + // } + //} + //n -= sceneEx.specialTypeNum + //sceneEx.specialTime = time.Second * time.Duration(n*5) + //// pk动画 2秒 + //sceneEx.specialTime += time.Second * 2 + //// 特殊牌型 4.5秒;至尊青龙5.5秒 + //if sceneEx.specialTypeNum > 0 { + // if has { + // sceneEx.specialTime += time.Millisecond * 5500 + // } else { + // sceneEx.specialTime += time.Millisecond * 4500 + // } + //} + + sceneEx.specialTime = 0 + // pk动画 2秒 + sceneEx.specialTime += time.Second * 2 + // 2人且有特殊牌型,直接播放特殊牌型动画' + var n int // 玩家数量 + var has bool // 是否有青龙 for _, v := range sceneEx.players { if v != nil && v.IsGameing() && v.cardsO != nil { n++ @@ -1095,18 +1149,16 @@ func (this *StateShow) OnEnter(s *base.Scene) { } } } - n -= sceneEx.specialTypeNum - sceneEx.specialTime = time.Second * time.Duration(n*5) - // pk动画 2秒 - sceneEx.specialTime += time.Second * 2 - // 特殊牌型 4.5秒;至尊青龙5.5秒 - if sceneEx.specialTypeNum > 0 { + if n == 2 && sceneEx.specialTypeNum > 0 { if has { sceneEx.specialTime += time.Millisecond * 5500 } else { sceneEx.specialTime += time.Millisecond * 4500 } + } else { + sceneEx.specialTime = time.Second * time.Duration(5) } + logger.Logger.Tracef("show cards: %v %v", n, sceneEx.specialTime) if sceneEx.specialTime <= 0 { sceneEx.specialTime = time.Second diff --git a/go.mod b/go.mod index e040bc4..1ae0dd7 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,6 @@ require ( go.etcd.io/etcd/client/v3 v3.5.16 go.mongodb.org/mongo-driver v1.17.1 golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c - google.golang.org/grpc v1.67.1 google.golang.org/protobuf v1.35.1 gorm.io/driver/mysql v1.5.7 gorm.io/gorm v1.25.12 @@ -112,6 +111,7 @@ require ( golang.org/x/time v0.7.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/grpc v1.67.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect