using System; using System.Collections.Generic; using Server; using MrWu.Debug; using Server.Data; using MrWu.Basic; using System.Threading; using GameData; using Game.Player; using System.Collections.Concurrent; namespace Game.Robot { /// /// 机器人控制器 /// public class RobotController { /// /// 机器人控制器 /// public static RobotController instance { get; internal set; } /// /// 机器人数量 /// public int RobotCnt { get; private set; } /// /// 闲置的机器人数量 /// public int idleRobotCnt { get; private set; } /// /// 初始机器人的最小游戏币 /// public readonly int minMoney; /// /// 初始机器人的最大游戏币 /// public readonly int maxMoney; public static readonly object _lock = new object(); /// /// 随机值 /// public readonly Random Random = new Random(unchecked((int)DateTime.UtcNow.Ticks)); private GameManager gamemgr; internal RobotController(GameManager gamemgr, int minMoney, int maxMoney) { this.gamemgr = gamemgr; this.minMoney = minMoney; this.maxMoney = maxMoney; robotPars = new RobotPar[ServerConfigManager.Instance.TingCnt]; int len = robotPars.Length; for (int i = 0; i < len; i++) { robotPars[i] = new RobotPar(i); } } /// /// 机器人登录 /// /// private void RobotLogin(int tingid) { if (tingid < 0 || tingid >= gamemgr.tingCnt) return; int roomid = -1; foreach (var room in gamemgr.rooms) { foreach (var tid in room.config.Tings) { if (tid == tingid) { roomid = room.id; break; } } if (roomid >= 0) break; } if (roomid < 0) { Debug.Error("怎么可能未获取到对应的房间!"); return; } PlayerDataAsyc pl = CreateRobot(); if (pl == null) return; int result = PlayerCollection.Instance.AddPlayer(pl); if (result != 1) { return; } Shadow.Shadow shadow = gamemgr.shadowPool.GetRandomShadow(); pl.gameid = gamemgr.config.GameId; pl.state = (int)PlayerState.INGame; pl.nickname = shadow == null ? ("auysn" + Random.Next(10000)) : shadow.name; pl.avatar = shadow?.photo; pl.exp = Random.Next(5000, 50000); AddRobot(pl, roomid, tingid); //去排队 } /// /// 创建一个机器人 /// /// private PlayerDataAsyc CreateRobot() { PlayerDataAsyc pl = new PlayerDataAsyc(); pl.userid = robotuserid; pl.money = BaseFun.random.Next(minMoney, maxMoney); pl.ip = $"106.{BaseFun.random.Next(225, 231)}.{BaseFun.random.Next(1, 255)}.{BaseFun.random.Next(1, 255)}"; RobotCnt++; // Debug.Info("机器人的金钱:" + pl.money + "," + pl.userid + "," + pl.nickname + ",min:" + minMoney + ",max:" + maxMoney); return pl; } /// /// /// protected int _robotuserid = -10000; /// /// /// protected int robotuserid { get { return Interlocked.Decrement(ref _robotuserid); } } /// /// 添加到闲置机器人的数量 /// /// /// public int AddIdleRobotCnt(int cnt) { idleRobotCnt += cnt; return idleRobotCnt; } #region 机器人分片管理 按厅分 /// /// 机器人分区 /// private readonly RobotPar[] robotPars; /// /// 获取分区中机器人的数量 /// /// 分区id /// public int GetParCount(int id) { return robotPars[id].Count; } /// /// 获取分区中的机器人数量 /// /// /// public int GetParSumCount(int id) { return robotPars[id].SumCount; } /// /// 获取闲置的机器人数量 /// /// public int GetCount() { int count = 0; foreach (var item in robotPars) { count += item.Count; } return count; } /// /// 获取总的机器人数量 /// /// public int GetSumCount() { int count = 0; foreach (var item in robotPars) { count += item.SumCount; } return count; } /// /// 获取一个机器人 /// /// 分区id /// public PlayerDataAsyc GetRobot(int id) { return robotPars[id].GetRobot(); } /// /// 放回一个机器人 /// /// /// 分区id public void PushRobot(PlayerDataAsyc pl, int id) { robotPars[id].PushRobot(pl); } /// /// 放回一些机器人 /// /// /// public void PushRobot(IEnumerable pls, int id) { robotPars[id].PushRobot(pls); } /// /// 主动添加一个机器人 /// /// /// /// public void AddRobot(PlayerDataAsyc pl, int roomid, int id) { robotPars[id].AddRobot(pl, roomid); } #endregion /// /// 一个机器人分区 /// private class RobotPar { /// /// 常驻机器人数量 /// private const int PerCount = 30; private int id; /// /// 没用上的机器人,改为线程安全的集合 /// public readonly ConcurrentQueue robots = new ConcurrentQueue(); public RobotPar(int id) { this.id = id; } /// /// 当前的机器人数量 /// public int Count { get { return robots.Count; } } /// /// 总的机器人数量 /// public int SumCount { get; private set; } /// /// 获取机器人 /// public PlayerDataAsyc GetRobot() { //Debug.Log("获取机器人:{0}", len); PlayerDataAsyc pl = null; if (Count > 0) { robots.TryDequeue(out pl); } Debug.Info("机器人数量:" + Count + "," + PerCount + "pl :" + (pl == null) + (pl == null ? "" : "id:" + pl.userid)); if (Count < PerCount) { //机器人不足去补充 instance.RobotLogin(id); SumCount++; } if (pl != null && pl.MatchObj != null) { Debug.Fatal($"拿到了比赛的机器人:userid:{pl.userid}"); pl = null; } return pl; } /// /// 放入机器人 /// /// public void PushRobot(PlayerDataAsyc pl) { //Debug.Error("放回机器人列表:" + pl.ToString()); if (pl == null) { Debug.Error("放回的机器人是空!!!"); return; } if (pl.state > 1 || pl.deskid >= 0 || pl.MatchObj != null) { Debug.Info("放回的机器人有数据 userid:" + pl.userid + " state:" + pl.state + " deskid:" + pl.deskid + "true:" + (pl.MatchObj == null)); return; } pl.RobotInit(); robots.Enqueue(pl); } /// /// 放入机器人 /// /// public void PushRobot(IEnumerable pls) { foreach (var item in pls) { item.RobotInit(); robots.Enqueue(item); } } /// /// 添加机器人 /// /// /// 房间id public void AddRobot(PlayerDataAsyc pl, int roomid) { pl.roomid = roomid; pl.tingid = id; lock (_lock) { robots.Enqueue(pl); } Debug.Log("添加到机器人列表厅:{0},机器人id:{1},机器人数量:{2}", id, pl.userid, robots.Count); } } } }