private void MakeDie(uPomelos vic) { vic.isDie = true; if (target.lives.Contains(vic)) { target.lives.Remove(vic); } if (target.villagers.Contains(vic)) { target.villagers.Remove(vic); } else if (target.hunters.Contains(vic)) { target.hunters.Remove(vic); } else if (target.prophets.Contains(vic)) { target.prophets.Remove(vic); } else if (target.witches.Contains(vic)) { target.witches.Remove(vic); } else if (target.wolves.Contains(vic)) { target.wolves.Remove(vic); } }
/// <summary> /// 等待玩家发言完毕 /// </summary> /// <returns>The for speech.</returns> protected IEnumerator WaitForSpeech(uPomelos player, float facTime) { for (float timer = 0f; !player.endSpeech && timer <= facTime; timer += Time.deltaTime) { yield return(null); } }
private IEnumerator MoveSheriff(uPomelos player) { yield return(target.StartCoroutine(SendChat("你有 " + moveTime.ToString() + "s 的时间选择撕毁警徽或移交警徽,输入 -1 撕毁警徽,输入玩家编号进行移交。", player))); SetupPlayer(player, UnityEngine.UI.InputField.ContentType.IntegerNumber); player.isSheriff = false; // 移除警长身份 target.sherif = null; serverManager.SetReceivePlayer(player, null); yield return(target.StartCoroutine(WaitForSpeech(player, moveTime))); ResetPlayer(target.players); int v = player.inputValue; uPomelos tmp = serverManager.GetPlayer(v, target.lives); if (tmp == null || tmp.isDie) { // 撕毁警徽 target.hasSheriff = false; target.sherif = null; yield return(target.StartCoroutine(SendChat("玩家 " + player.playerName + " 撕毁了警徽。", target.players))); } else { tmp.isSheriff = true; target.hasSheriff = true; yield return(target.StartCoroutine(SendChat("玩家将警徽移交给了 " + tmp.playerName + "。", target.players))); } }
protected void ResetPlayer(uPomelos player) { // 设置为无人接收信息 serverManager.SetReceivePlayer(player, null); // 禁用玩家输入系统 serverManager.TogglePlayerInput(false, UnityEngine.UI.InputField.ContentType.Standard, player); }
/// <summary> /// Sets the type of the player input. /// </summary> /// <param name="type">Type.</param> /// <param name="players">Players.</param> public void SetPlayerInputType(UnityEngine.UI.InputField.ContentType type, uPomelos player) { if (player == null) { return; } player.RpcModifyInputType(type); }
//============================================ 服务器通信函数============================================= /// <summary> /// 发送信息到客户端 /// </summary> /// <param name="chat">信息.</param> /// <param name="recevier">接收玩家.</param> public void SendChat(Chat chat, uPomelos recevier) { if (recevier == null) { return; } recevier.RpcShowChat(chat); // 客户端进行信息显示 }
/// <summary> /// 发送信息到客户端 /// </summary> /// <param name="chat">信息.</param> /// <param name="recevier">接收玩家.</param> public void SendSystemChat(string msg, uPomelos recevier) { if (recevier == null) { return; } recevier.RpcShowChat(new Chat(-1, "System", msg, ChatSkin.Default)); // 客户端进行信息显示 }
protected void SetupPlayer(uPomelos player, UnityEngine.UI.InputField.ContentType type) { // 禁用所有玩家输入系统 serverManager.TogglePlayerInput(false, type, target.players); // 设置玩家发言的接收列表为本身 serverManager.SetReceivePlayer(player, target.players); // 启用玩家输入系统 serverManager.TogglePlayerInput(true, type, player); }
public override void OnLobbyServerSceneLoadedForPlayer(NetworkManager manager, GameObject lobbyPlayer, GameObject gamePlayer) { LobbyPlayer lobby = lobbyPlayer.GetComponent <LobbyPlayer>(); uPomelos player = gamePlayer.GetComponent <uPomelos>(); // 在此处进行初始化 player.behaviourName = lobby.playerName; // 更新角色命名 //player.behaviourId = m_Manager.AddPlayer (player); // 添加至服务器列表 // ServerManager.instance.SendSystemChat ("正在等待其他玩家...", player); }
/// <summary> /// Setups the new game. /// </summary> /// <returns>The new game.</returns> private IEnumerator SetupNewGame() { // 为了防止一些玩家连接超时,在这里特判一下 for (float timer = 0; timer < 30f; timer += Time.deltaTime) { if (FindObjectsOfType <uPomelos> ().Length == playersCount) { break; } yield return(null); } // 添加所有角色 uPomelos[] pls = FindObjectsOfType <uPomelos> (); foreach (var p in pls) { AddPlayer(p); } // 因为 Client Rpc 需要在所有客户端初始化后才能调用,在这里判断是否客户端已经初始化。 float checkTime = 1f, lsTime = 0f; // 为了减少资源占用。 for (float timer = 0; timer < 30f; timer += Time.deltaTime) { bool allready = true; if (timer - lsTime >= checkTime) { foreach (var p in players) { allready &= p.hasStart; } if (allready) { break; } lsTime = timer; } yield return(null); } if (players.Count < playersCount) { // 有玩家未加入 m_ServerManager.SendSystemChat("一些玩家连接失败,他们将加入游戏但不进行操作。", players); int rmCount = playersCount - players.Count; for (int i = 0; i < rmCount; i++) { uPomelos dis = new uPomelos(); dis.isRobot = true; AddPlayer(dis); } } StartNewGame(); }
private IEnumerator Kill() { // 回合等待 yield return(new WaitForSeconds(waitTime)); if (save == false) { foreach (var p in target.witches) { serverManager.SendSystemChat("输入要投毒的玩家编号使用毒药,不输入或输入错误视为不使用。你拥有 " + p.poisonCount.ToString() + " 瓶毒药。", p); } SetupPlayer(target.witches, UnityEngine.UI.InputField.ContentType.IntegerNumber); // 投票类环节无人接收信息。 serverManager.SetReceivePlayer(target.witches, null); // 等待一定时间,判断所有女巫玩家是否过麦 float facTime = target.witches.Count > 0 ? killTime : Random.Range(0f, robotRandomTime); yield return(target.StartCoroutine(WaitForSpeech(target.witches, facTime))); ResetPlayer(target.witches); uPomelos kill = null; foreach (var p in target.witches) { // 有药水 kill = serverManager.GetPlayer(p.inputValue, target.players); if (kill != null && kill.isDie == false && p.poisonCount > 0) { p.poisonCount--; // 减去一瓶药水 serverManager.SendSystemChat("您使用一瓶毒药杀死了该玩家。", p); kill.killBy = 2; if (kill.behaviourClass == uPomelos.PlayerClasses.Hunter) { serverManager.SendSystemChat("女巫将毒药投给了你,这表示你死亡后将不能使用技能。", kill); } target.victims.Add(kill); break; } } serverManager.SendSystemChat((kill == null ? "没有女巫使用毒药。" : "某个女巫使用毒药杀死了 " + kill.playerName + " 玩家"), target.witches); } else { serverManager.SendSystemChat("由于有女巫使用了解药,所以今晚无法使用毒药。", target.witches); } }
/// <summary> /// 统计预言家的验人信息 /// </summary> private IEnumerator CountProphetCheck() { List <uPomelos> check = serverManager.GetMaxCountInputPlayer(target.prophets); // 没有检验的玩家 if (check.Count < 1) { yield return(target.StartCoroutine(SendChat("本回合你们没有查验玩家。", target.prophets))); } else { uPomelos test = check [Random.Range(0, check.Count)]; yield return(target.StartCoroutine(SendChat("你们检验的玩家 " + test.playerName + " 的身份是 " + (test.behaviourClass == uPomelos.PlayerClasses.Wolf ? "坏人" : "好人"), target.prophets))); } }
/// <summary> /// 设置信息发送者的接收者 /// </summary> /// <param name="sender">Sender.</param> /// <param name="receiver">Receiver.</param> public void SetReceivePlayer(uPomelos sender, List <uPomelos> receiver) { if (sender == null) { return; } if (receiver == null) { receiver = new List <uPomelos> () { sender } } ; sender.canReceiveChatList = receiver; }
/// <summary> /// Gets the max count input player. /// </summary> /// <returns>The max count input player.</returns> /// <param name="players">Players.</param> public List <uPomelos> GetMaxCountInputPlayer(List <uPomelos> players, bool sheriffAdv = false) { if (players == null) { return(null); } RemoveEmpty(players); int maxCount = -1; Dictionary <int, int> dic = new Dictionary <int, int> (); foreach (var p in players) { int input = p.inputValue; // 得到 input value uPomelos up = GetPlayer(input, GameManager.instance.players); if (up == null || up.isDie) { continue; } if (!dic.ContainsKey(input)) { dic.Add(input, 0); } // 因为警长有1.5票 等价于 警长有3票,其他人2票 if (sheriffAdv == true && p.isSheriff) { ++dic [input]; // 警长特殊票 } dic [input] += 2; // 普通投票 if (++dic [input] > maxCount) { maxCount = dic [input]; } } List <uPomelos> res = new List <uPomelos> (); foreach (var d in dic) { if (d.Value == maxCount) { res.Add(GetPlayer(d.Key, GameManager.instance.lives)); } } RemoveEmpty(res); return(res); }
private IEnumerator HandleBySheriff() { uPomelos sheriff = target.sherif; firstIdx = 0; offset = 1; startBehaviour = target.lives.Count - 1; if (sheriff != null) { yield return(target.StartCoroutine(SendChat("你有 " + thinkTime.ToString() + "s 的时间决定发言顺序,输入 1 从警右发言,输入 -1 从警左发言。", sheriff))); SetupPlayer(sheriff, UnityEngine.UI.InputField.ContentType.IntegerNumber); serverManager.SetReceivePlayer(sheriff, null); yield return(target.StartCoroutine(WaitForSpeech(sheriff, thinkTime))); ResetPlayer(target.players); int v = sheriff.inputValue; startBehaviour = target.lives.IndexOf(sheriff); if (v == -1) { // 警左发言 yield return(target.StartCoroutine(SendChat("警长决定由警左开始发言。", target.players))); firstIdx = (startBehaviour - 1 + target.lives.Count) % target.lives.Count; offset = -1; } else { //警右发言 yield return(target.StartCoroutine(SendChat("警长决定由警右开始发言。", target.players))); firstIdx = ((startBehaviour + 1) % target.lives.Count); offset = 1; } } }
/// <summary> /// 统计狼人的杀人信息 /// </summary> private IEnumerator CountWolfKill() { List <uPomelos> kill = serverManager.GetMaxCountInputPlayer(target.wolves); // 空刀 if (kill.Count < 1) { yield return(target.StartCoroutine(SendChat("本回合你们进行了空刀,你们没有杀害玩家。", target.wolves))); } else { uPomelos die = kill [Random.Range(0, kill.Count)]; yield return(target.StartCoroutine(SendChat("你们在本回合中你们杀害了" + die.behaviourId.ToString() + "号玩家", target.wolves))); if (!target.victims.Contains(die)) { target.victims.Add(die); // 将玩家添加入死亡列表 } } }
private IEnumerator LastWord(uPomelos vic) { // 猎人死亡 if (vic.behaviourClass == uPomelos.PlayerClasses.Hunter && vic.killBy != 2) { yield return(target.StartCoroutine(ShootPlayer(vic))); } yield return(target.StartCoroutine(SendChat("你需要留下遗言,按下结束停止发言。", vic))); SetupPlayer(vic, UnityEngine.UI.InputField.ContentType.Standard); float facTime = vic.isRobot ? 3f : lastWdTime; yield return(target.StartCoroutine(WaitForSpeech(vic, facTime))); ResetPlayer(target.players); if (vic.isSheriff == true) { yield return(MoveSheriff(vic)); } }
private IEnumerator ShootPlayer(uPomelos hunter) { yield return(target.StartCoroutine(SendChat("你拥有 " + skillTime.ToString() + "s 的时间输入你要杀死的玩家编号,输入错误视为不发动技能。", hunter))); SetupPlayer(hunter, UnityEngine.UI.InputField.ContentType.IntegerNumber); yield return(target.StartCoroutine(WaitForSpeech(hunter, skillTime))); ResetPlayer(target.players); uPomelos kill = serverManager.GetPlayer(hunter.inputValue, target.players); if (kill == null || kill.isDie) { // 空刀 yield return(target.StartCoroutine(SendChat("玩家选择不发动英雄技能。", target.players))); } else { yield return(target.StartCoroutine(SendChat("猎人使用技能击杀了玩家:" + kill.playerName, target.players))); target.victims.Add(kill); } }
/// <summary> /// 以系统身份发送消息 /// </summary> /// <param name="msg">Message.</param> protected IEnumerator SendChat(string msg, uPomelos receiver) { yield return(new WaitForSeconds(waitTime)); serverManager.SendSystemChat(msg, receiver); }
// public void AddPlayer(uPomelos player) { players.Add(player); lives.Add(player); player.behaviourId = players.Count; }
/// <summary> /// 启用/禁用玩家输入 /// </summary> /// <param name="active">If set to <c>true</c> active.</param> /// <param name="players">Players.</param> public void TogglePlayerInput(bool active, UnityEngine.UI.InputField.ContentType type, uPomelos player) { if (player == null) { return; } if (player.isDie) { player.RpcToggleInput(false, type); } else { player.RpcToggleInput(active, type); } }