game_sync/worldsrv/scenelimit.go

164 lines
4.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"fmt"
"mongo.games.com/game/common"
)
var sceneLimitMgr = SceneLimitManager{
SameRoomData: make(map[string][][]int32),
}
type SceneLimitManager struct {
SameRoomData map[string][][]int32 //用户的同房数据保存了用户一局游戏中房间人员的SNID
}
func (m *SceneLimitManager) Key(gameid, snid int32) string {
return fmt.Sprintf("%v-%v", snid, gameid)
}
// LimitSamePlace 连续同局检测
func (m *SceneLimitManager) LimitSamePlace(player *Player, s *Scene) bool {
if player.IsRob {
return false
}
key := m.Key(int32(s.gameId), player.SnId)
var logArr = m.SameRoomData[key]
var samePlaceLimit = int(s.dbGameFree.GetSamePlaceLimit())
if len(logArr) > samePlaceLimit {
logArr = logArr[len(logArr)-samePlaceLimit:]
m.SameRoomData[key] = logArr
}
//新用户的防伙牌数据中,有没有场景中用户的检查
for _, value := range s.players {
if value.IsRob {
continue
}
limitCount := 0
for _, log := range logArr {
if common.InSliceInt32(log, value.SnId) {
limitCount++
}
}
if limitCount >= samePlaceLimit {
return true
}
}
//场景中用户的防伙牌数据中,有没有新用户的检查
for _, value := range s.players {
if value.IsRob {
continue
}
key := m.Key(int32(s.gameId), value.SnId)
var logArr = m.SameRoomData[key]
limitCount := 0
for _, log := range logArr {
if common.InSliceInt32(log, player.SnId) {
limitCount++
}
}
if limitCount >= samePlaceLimit {
return true
}
}
return false
}
// LimitSamePlaceBySnid 连续同局检测
// limit 最大同局数
func (m *SceneLimitManager) LimitSamePlaceBySnid(member []*Player, player *Player, gameId, limit int32) bool {
if player.IsRob {
return false
}
key := m.Key(gameId, player.SnId)
var logArr = m.SameRoomData[key]
var samePlaceLimit = int(limit)
if len(logArr) > samePlaceLimit {
logArr = logArr[len(logArr)-samePlaceLimit:]
m.SameRoomData[key] = logArr
}
//新用户的防伙牌数据中,有没有场景中用户的检查
for _, value := range member {
if value.IsRob {
continue
}
limitCount := 0
for _, log := range logArr {
if common.InSliceInt32(log, value.SnId) {
limitCount++
}
}
if limitCount >= samePlaceLimit {
return true
}
}
//场景中用户的防伙牌数据中,有没有新用户的检查
for _, value := range member {
if value.IsRob {
continue
}
key := m.Key(gameId, value.SnId)
var logArr = m.SameRoomData[key]
limitCount := 0
for _, log := range logArr {
if common.InSliceInt32(log, player.SnId) {
limitCount++
}
}
if limitCount >= samePlaceLimit {
return true
}
}
return false
}
// ReceiveData 同局记录
func (m *SceneLimitManager) ReceiveData(gameid int32, data []int32) {
for _, value := range data {
key := m.Key(gameid, value)
m.SameRoomData[key] = append(m.SameRoomData[key], data)
}
}
// LimitAvgPlayer 人数的平均分配问题
func (m *SceneLimitManager) LimitAvgPlayer(s *Scene, totlePlayer int) bool {
scenePlayerCount := s.GetTruePlayerCnt()
switch {
case totlePlayer > 1 && totlePlayer < 15:
//4、如果游戏场的同时在线人数2-14人时系统每2个人分一个桌如果有剩余的没有分桌随机找一个桌子进行分配
// 如果有机器人系统加入机器人并且保证同桌机器人数量1-3个
if scenePlayerCount > 2 {
return true
}
case totlePlayer >= 15 && totlePlayer < 22:
//5、如果游戏场的同时在线人数15-21人系统每3个人分一个桌如果有剩余的没有分桌随机找一个桌子进行分配
// 如果有机器人系统加入机器人并且保证同桌机器人数量1-3个
if scenePlayerCount > 3 {
return true
}
case totlePlayer >= 22 && totlePlayer < 29:
//6、如果游戏场的同时在线人数22-28人系统每4个人分一个桌如果有剩余的没有分桌随机找一个桌子进行分配
// 如果有机器人系统加入机器人并且保证同桌机器人数量1-3个
if scenePlayerCount > 4 {
return true
}
case totlePlayer >= 29 && totlePlayer < 35:
//7、如果游戏场的同时在线人数29-35人系统每5个人分一个桌如果有剩余的没有分桌随机找一个桌子进行分配
if scenePlayerCount > 5 {
return true
}
case totlePlayer >= 35 && totlePlayer < 42:
//8、如果游戏场的同时在线人数36-42人系统每6个人分一个桌如果有剩余的没有分桌随机找一个桌子进行分配
if scenePlayerCount > 6 {
return true
}
case totlePlayer >= 43:
//9、如果游戏场的同时在线人数43人以上时系统每7个人分一个桌如果有剩余的没有分桌随机找一个桌子进行分配
if scenePlayerCount > 7 {
return true
}
}
return false
}