From 551f66145faa208763a6a42d4f321d5ac98b974a Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 20 Mar 2016 22:15:58 +1100 Subject: [PATCH] Cleanup parts of the core in zombie survival and fix some bugs with it. --- Commands/Fun/CmdTeam.cs | 12 +- Commands/Fun/ZombieSurvival/CmdAlive.cs | 64 +++--- Commands/Fun/ZombieSurvival/CmdInfected.cs | 70 +++---- Commands/Fun/ZombieSurvival/CmdReferee.cs | 83 +++----- Commands/Fun/ZombieSurvival/CmdZombieGame.cs | 2 +- Commands/World/CmdGoto.cs | 2 +- Games/ZombieSurvival/ZombieGame.Core.cs | 198 ++++++++++--------- Games/ZombieSurvival/ZombieGame.Game.cs | 35 ++-- Games/ZombieSurvival/ZombieGame.cs | 101 +++++----- Levels/Level.cs | 5 +- Player/Player.Handlers.cs | 3 +- Player/Player.Timers.cs | 7 +- Server/Properties.cs | 8 +- Server/Server.Tasks.cs | 10 +- Server/Server.cs | 8 +- util/VolatileArray.cs | 7 + 16 files changed, 305 insertions(+), 310 deletions(-) diff --git a/Commands/Fun/CmdTeam.cs b/Commands/Fun/CmdTeam.cs index 686b2f72a..80184b715 100644 --- a/Commands/Fun/CmdTeam.cs +++ b/Commands/Fun/CmdTeam.cs @@ -20,8 +20,7 @@ using MCGalaxy.Games; namespace MCGalaxy.Commands { - public sealed class CmdTeam : Command { - + public sealed class CmdTeam : Command { public override string name { get { return "team"; } } public override string shortcut { get { return ""; } } public override string type { get { return CommandTypes.Games; } } @@ -29,6 +28,7 @@ namespace MCGalaxy.Commands { public override LevelPermission defaultRank { get { return LevelPermission.Guest; } } public override void Use(Player p, string message) { + if (p == null) { MessageInGameOnly(p); return; } if (message == "") { Help(p); return; } string[] args = message.Split(' '); @@ -49,6 +49,12 @@ namespace MCGalaxy.Commands { HandleLeave(p, args); break; case "members": HandleMembers(p, args); break; + default: + Team team = p.GameTeam; + if (team == null) { + Player.SendMessage(p, "You need to be in a team first to send a team message."); return; + } + team.Chat(p, message); break; } } @@ -175,7 +181,6 @@ namespace MCGalaxy.Commands { } public override void Help(Player p) { - //.. team message? Player.SendMessage(p, "%T/team owner %H-Sets the player who has owner priveliges for the team."); Player.SendMessage(p, "%T/team kick [name] %H-Removes that player from the team you are in."); Player.SendMessage(p, "%T/team color [color] %H-Sets the color of the team name shown in chat."); @@ -185,6 +190,7 @@ namespace MCGalaxy.Commands { Player.SendMessage(p, "%T/team invite [name] %H-Invites that player to join your team."); Player.SendMessage(p, "%T/team leave %H-Removes you from the team you are in."); Player.SendMessage(p, "%T/team members [name] %H-Lists the players within that team."); + Player.SendMessage(p, "%HAnything else is sent as a message to all members of the team."); } } } \ No newline at end of file diff --git a/Commands/Fun/ZombieSurvival/CmdAlive.cs b/Commands/Fun/ZombieSurvival/CmdAlive.cs index 046d3a5c0..8ec715994 100644 --- a/Commands/Fun/ZombieSurvival/CmdAlive.cs +++ b/Commands/Fun/ZombieSurvival/CmdAlive.cs @@ -1,26 +1,25 @@ /* - Copyright 2010 MCLawl Team - Written by Valek (Modified for use with MCGalaxy) + Copyright 2010 MCLawl Team - Written by Valek (Modified for use with MCGalaxy) - Dual-licensed under the Educational Community License, Version 2.0 and - the GNU General Public License, Version 3 (the "Licenses"); you may - not use this file except in compliance with the Licenses. You may - obtain a copy of the Licenses at - - http://www.osedu.org/licenses/ECL-2.0 - http://www.gnu.org/licenses/gpl-3.0.html - - Unless required by applicable law or agreed to in writing, - software distributed under the Licenses are distributed on an "AS IS" - BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - or implied. See the Licenses for the specific language governing - permissions and limitations under the Licenses. + Dual-licensed under the Educational Community License, Version 2.0 and + the GNU General Public License, Version 3 (the "Licenses"); you may + not use this file except in compliance with the Licenses. You may + obtain a copy of the Licenses at + + http://www.osedu.org/licenses/ECL-2.0 + http://www.gnu.org/licenses/gpl-3.0.html + + Unless required by applicable law or agreed to in writing, + software distributed under the Licenses are distributed on an "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the Licenses for the specific language governing + permissions and limitations under the Licenses. */ using MCGalaxy.Games; -namespace MCGalaxy.Commands -{ - public sealed class CmdAlive : Command - { +namespace MCGalaxy.Commands { + + public sealed class CmdAlive : Command { public override string name { get { return "alive"; } } public override string shortcut { get { return "alive"; } } public override string type { get { return CommandTypes.Games; } } @@ -29,25 +28,20 @@ namespace MCGalaxy.Commands public override bool Enabled { get { return Server.ZombieModeOn; } } public CmdAlive() { } - public override void Use(Player p, string message) - { - if (ZombieGame.alive.Count == 0) - { - Player.SendMessage(p, "No one is alive."); - } - else - { - Player.SendMessage(p, "Players who are " + Colors.green + "alive " + Server.DefaultColor + "are:"); - string playerstring = ""; - ZombieGame.alive.ForEach(delegate(Player player) - { - playerstring = playerstring + player.group.color + player.name + Server.DefaultColor + ", "; - }); - Player.SendMessage(p, playerstring); + public override void Use(Player p, string message) { + Player[] alive = Server.zombie.Alive.Items; + if (alive.Length == 0) { + Player.SendMessage(p, "No one is alive."); return; } + + Player.SendMessage(p, "Players who are " + Colors.green + "alive %Sare:"); + string list = ""; + foreach (Player pl in alive) + list = list + pl.group.color + pl.DisplayName + "%S, "; + Player.SendMessage(p, list); } - public override void Help(Player p) - { + + public override void Help(Player p) { Player.SendMessage(p, "/alive - shows who is alive"); } } diff --git a/Commands/Fun/ZombieSurvival/CmdInfected.cs b/Commands/Fun/ZombieSurvival/CmdInfected.cs index 542e87b38..96600d759 100644 --- a/Commands/Fun/ZombieSurvival/CmdInfected.cs +++ b/Commands/Fun/ZombieSurvival/CmdInfected.cs @@ -1,53 +1,47 @@ /* - Copyright 2011 MCForge - - Dual-licensed under the Educational Community License, Version 2.0 and - the GNU General Public License, Version 3 (the "Licenses"); you may - not use this file except in compliance with the Licenses. You may - obtain a copy of the Licenses at - - http://www.opensource.org/licenses/ecl2.php - http://www.gnu.org/licenses/gpl-3.0.html - - Unless required by applicable law or agreed to in writing, - software distributed under the Licenses are distributed on an "AS IS" - BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - or implied. See the Licenses for the specific language governing - permissions and limitations under the Licenses. -*/ + Copyright 2011 MCForge + + Dual-licensed under the Educational Community License, Version 2.0 and + the GNU General Public License, Version 3 (the "Licenses"); you may + not use this file except in compliance with the Licenses. You may + obtain a copy of the Licenses at + + http://www.opensource.org/licenses/ecl2.php + http://www.gnu.org/licenses/gpl-3.0.html + + Unless required by applicable law or agreed to in writing, + software distributed under the Licenses are distributed on an "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the Licenses for the specific language governing + permissions and limitations under the Licenses. + */ using MCGalaxy.Games; -namespace MCGalaxy.Commands -{ - public sealed class CmdInfected : Command - { +namespace MCGalaxy.Commands { + + public sealed class CmdInfected : Command { public override string name { get { return "infected"; } } public override string shortcut { get { return "dead"; } } public override string type { get { return CommandTypes.Games; } } public override bool museumUsable { get { return true; } } public override LevelPermission defaultRank { get { return LevelPermission.Banned; } } - public override bool Enabled { get { return Server.ZombieModeOn; } } + public override bool Enabled { get { return Server.ZombieModeOn; } } public CmdInfected() { } - public override void Use(Player p, string message) - { - if (ZombieGame.infectd.Count == 0) - { - Player.SendMessage(p, "No one is infected"); - } - else - { - Player.SendMessage(p, "Players who are " + Colors.red + "infected %Sare:"); - string playerstring = ""; - ZombieGame.infectd.ForEach(delegate(Player player) - { - playerstring = playerstring + Colors.red + player.DisplayName + "%S, "; - }); - Player.SendMessage(p, playerstring); + public override void Use(Player p, string message) { + Player[] infected = Server.zombie.Infected.Items; + if (infected.Length == 0) { + Player.SendMessage(p, "No one is infected"); return; } + + Player.SendMessage(p, "Players who are " + Colors.red + "infected %Sare:"); + string list = ""; + foreach (Player pl in infected) + list = list + Colors.red + pl.DisplayName + "%S, "; + Player.SendMessage(p, list); } - public override void Help(Player p) - { + + public override void Help(Player p) { Player.SendMessage(p, "/infected - shows who is infected"); } } diff --git a/Commands/Fun/ZombieSurvival/CmdReferee.cs b/Commands/Fun/ZombieSurvival/CmdReferee.cs index 2a840a311..58c6a89f4 100644 --- a/Commands/Fun/ZombieSurvival/CmdReferee.cs +++ b/Commands/Fun/ZombieSurvival/CmdReferee.cs @@ -1,26 +1,25 @@ /* - Copyright 2011 MCForge - - Dual-licensed under the Educational Community License, Version 2.0 and - the GNU General Public License, Version 3 (the "Licenses"); you may - not use this file except in compliance with the Licenses. You may - obtain a copy of the Licenses at - - http://www.opensource.org/licenses/ecl2.php - http://www.gnu.org/licenses/gpl-3.0.html - - Unless required by applicable law or agreed to in writing, - software distributed under the Licenses are distributed on an "AS IS" - BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - or implied. See the Licenses for the specific language governing - permissions and limitations under the Licenses. + Copyright 2011 MCForge + + Dual-licensed under the Educational Community License, Version 2.0 and + the GNU General Public License, Version 3 (the "Licenses"); you may + not use this file except in compliance with the Licenses. You may + obtain a copy of the Licenses at + + http://www.opensource.org/licenses/ecl2.php + http://www.gnu.org/licenses/gpl-3.0.html + + Unless required by applicable law or agreed to in writing, + software distributed under the Licenses are distributed on an "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the Licenses for the specific language governing + permissions and limitations under the Licenses. */ using MCGalaxy.Games; -namespace MCGalaxy.Commands -{ - public sealed class CmdReferee : Command - { +namespace MCGalaxy.Commands { + + public sealed class CmdReferee : Command { public override string name { get { return "ref"; } } public override string shortcut { get { return ""; } } public override string type { get { return CommandTypes.Moderation; } } @@ -29,54 +28,36 @@ namespace MCGalaxy.Commands public override bool Enabled { get { return Server.ZombieModeOn; } } public CmdReferee() { } - public override void Use(Player p, string message) - { + public override void Use(Player p, string message) { if (p == null) { MessageInGameOnly(p); return; } - if (p.referee) - { + if (p.referee) { p.referee = false; LevelPermission perm = Group.findPlayerGroup(name).Permission; Player.GlobalDespawn(p, false); Player.SendChatFrom(p, p.FullName + " %Sis no longer a referee", false); - if (Server.zombie.RoundInProgress) - { + + if (Server.zombie.RoundInProgress) { Server.zombie.InfectPlayer(p); - } - else - { + } else { Player.GlobalDespawn(p, false); Player.GlobalSpawn(p, p.pos[0], p.pos[1], p.pos[2], p.rot[0], p.rot[1], false); - ZombieGame.infectd.Remove(p); - ZombieGame.alive.Add(p); + Server.zombie.Infected.Remove(p); + Server.zombie.Alive.Add(p); p.color = p.group.color; } - } - else - { + } else { p.referee = true; Player.SendChatFrom(p, p.FullName + " %Sis now a referee", false); Player.GlobalDespawn(p, false); + Server.zombie.Alive.Remove(p); + Server.zombie.Infected.Remove(p); + p.color = p.group.color; if (Server.zombie.RoundInProgress) - { - p.color = p.group.color; - try - { - ZombieGame.infectd.Remove(p); - ZombieGame.alive.Remove(p); - } - catch { } - Server.zombie.InfectedPlayerDC(); - } - else - { - ZombieGame.infectd.Remove(p); - ZombieGame.alive.Remove(p); - p.color = p.group.color; - } + Server.zombie.AssignFirstZombie(); } } - public override void Help(Player p) - { + + public override void Help(Player p) { Player.SendMessage(p, "/referee - Turns referee mode on/off."); } } diff --git a/Commands/Fun/ZombieSurvival/CmdZombieGame.cs b/Commands/Fun/ZombieSurvival/CmdZombieGame.cs index 58b771c37..c3d8a5347 100644 --- a/Commands/Fun/ZombieSurvival/CmdZombieGame.cs +++ b/Commands/Fun/ZombieSurvival/CmdZombieGame.cs @@ -87,7 +87,7 @@ namespace MCGalaxy.Commands Player.SendMessage(p, "There is no Zombie Survival game currently in progress."); return; } Server.s.Log("Zombie Survival ended forcefully by " + p.name); - Server.zombie.aliveCount = 0; + Server.zombie.Alive.Clear(); Server.zombie.ResetState(); } diff --git a/Commands/World/CmdGoto.cs b/Commands/World/CmdGoto.cs index df4e90aad..d6f48cc34 100644 --- a/Commands/World/CmdGoto.cs +++ b/Commands/World/CmdGoto.cs @@ -152,7 +152,7 @@ namespace MCGalaxy.Commands { return true; } - void CheckGamesJoin(Player p, Level oldLvl) { + internal static void CheckGamesJoin(Player p, Level oldLvl) { Server.lava.PlayerJoinedLevel(p, oldLvl); Server.zombie.PlayerJoinedLevel(p, oldLvl); diff --git a/Games/ZombieSurvival/ZombieGame.Core.cs b/Games/ZombieSurvival/ZombieGame.Core.cs index 34f8cf365..4d1059e12 100644 --- a/Games/ZombieSurvival/ZombieGame.Core.cs +++ b/Games/ZombieSurvival/ZombieGame.Core.cs @@ -64,23 +64,24 @@ namespace MCGalaxy.Games { if (Status == ZombieGameStatus.NotStarted) return; List players = DoRoundCountdown(); RoundInProgress = true; - - theEnd: Random random = new Random(); + + pickFirst: int firstinfect = random.Next(players.Count()); - Player player = null; - if (queZombie) player = PlayerInfo.Find(nextZombie); - else player = players[firstinfect]; + Player first = null; + if (queZombie) first = PlayerInfo.Find(nextZombie); + else first = players[firstinfect]; + queZombie = false; - if (player.level.name != currentLevelName) goto theEnd; + if (!first.level.name.CaselessEq(CurrentLevelName)) goto pickFirst; - Player.GlobalMessage(player.color + player.name + " %Sstarted the infection!"); - player.infected = true; - UpdatePlayerColor(player, Colors.red); + CurrentLevel.ChatLevel(first.color + first.name + " %Sstarted the infection!"); + first.infected = true; + UpdatePlayerColor(first, Colors.red); RoundInProgress = true; int roundMins = random.Next(5, 8); - Player.GlobalMessage("The round will last for " + roundMins + " minutes!"); + CurrentLevel.ChatLevel("The round will last for " + roundMins + " minutes!"); RoundEnd = DateTime.UtcNow.AddMinutes(roundMins); timer = new System.Timers.Timer(roundMins * 60 * 1000); timer.Elapsed += new ElapsedEventHandler(EndRound); @@ -88,14 +89,12 @@ namespace MCGalaxy.Games { Player[] online = PlayerInfo.Online.Items; foreach (Player p in online) { - if (p != player) alive.Add(p); + if (p != first) Alive.Add(p); } - infectd.Clear(); - if (queZombie) infectd.Add(PlayerInfo.Find(nextZombie)); - else infectd.Add(player); - aliveCount = alive.Count; - DoCoreGame(players, random); + Infected.Clear(); + Infected.Add(first); + DoCoreGame(random); if (Status == ZombieGameStatus.NotStarted) { Status = ZombieGameStatus.LastRound; return; @@ -111,19 +110,19 @@ namespace MCGalaxy.Games { Server.s.Log(logMessage); RoundStart = DateTime.UtcNow.AddSeconds(30); - Player.GlobalMessage("%4Round Start:%f 30..."); + CurrentLevel.ChatLevel("%4Round Start:%f 30..."); Thread.Sleep(20000); if (!Server.ZombieModeOn) return null; - Player.GlobalMessage("%4Round Start:%f 10..."); + CurrentLevel.ChatLevel("%4Round Start:%f 10..."); Thread.Sleep(10000); if (!Server.ZombieModeOn) return null; - Player.GlobalMessage("%4Round Start:%f 5..."); + CurrentLevel.ChatLevel("%4Round Start:%f 5..."); Thread.Sleep(1000); if (!Server.ZombieModeOn) return null; - Player.GlobalMessage("%4Round Start:%f 4..."); + CurrentLevel.ChatLevel("%4Round Start:%f 4..."); Thread.Sleep(1000); if (!Server.ZombieModeOn) return null; - Player.GlobalMessage("%4Round Start:%f 3..."); + CurrentLevel.ChatLevel("%4Round Start:%f 3..."); Thread.Sleep(1000); if (!Server.ZombieModeOn) return null; - Player.GlobalMessage("%4Round Start:%f 2..."); + CurrentLevel.ChatLevel("%4Round Start:%f 2..."); Thread.Sleep(1000); if (!Server.ZombieModeOn) return null; - Player.GlobalMessage("%4Round Start:%f 1..."); + CurrentLevel.ChatLevel("%4Round Start:%f 1..."); Thread.Sleep(1000); if (!Server.ZombieModeOn) return null; int nonRefPlayers = 0; List players = new List(); @@ -132,7 +131,7 @@ namespace MCGalaxy.Games { foreach (Player p in online) { if (p.referee) { p.color = p.group.color; - } else if (p.level.name == currentLevelName) { + } else if (p.level.name.CaselessEq(CurrentLevelName)) { p.color = p.group.color; players.Add(p); nonRefPlayers++; @@ -140,64 +139,65 @@ namespace MCGalaxy.Games { } if (nonRefPlayers >= 2) return players; - Player.GlobalMessage(Colors.red + "ERROR: Need 2 or more players to play"); + CurrentLevel.ChatLevel(Colors.red + "ERROR: Need 2 or more players to play"); } } - void DoCoreGame(List players, Random random) { - while (aliveCount > 0) { - aliveCount = alive.Count; - infectd.ForEach( - delegate(Player pKiller) - { - UpdatePlayerColor(pKiller, Colors.red); - alive.ForEach( - delegate(Player pAlive) - { - UpdatePlayerColor(pAlive, pAlive.group.color); - if (Math.Abs(pAlive.pos[0] - pKiller.pos[0]) > HitboxPrecision - || Math.Abs(pAlive.pos[1] - pKiller.pos[1]) > HitboxPrecision - || Math.Abs(pAlive.pos[2] - pKiller.pos[2]) > HitboxPrecision) - return; - - if (!pAlive.infected && pKiller.infected && !pAlive.referee && !pKiller.referee && - pKiller != pAlive && pKiller.level.name == currentLevelName && pAlive.level.name == currentLevelName) - { - pAlive.infected = true; - infectd.Add(pAlive); - alive.Remove(pAlive); - players.Remove(pAlive); - pAlive.blockCount = 25; - if (lastPlayerToInfect == pKiller.name) { - infectCombo++; - if (infectCombo >= 2) { - pKiller.SendMessage("You gained " + (4 - infectCombo) + " " + Server.moneys); - pKiller.money += 4 - infectCombo; - Player.GlobalMessage(pKiller.FullName + " is on a rampage! " + (infectCombo + 1) + " infections in a row!"); - } - } else { - infectCombo = 0; - } - lastPlayerToInfect = pKiller.name; - pKiller.playersInfected++; - Player.GlobalMessage(String.Format( - messages[random.Next(messages.Length)], - Colors.red + pKiller.DisplayName + Colors.yellow, - Colors.red + pAlive.DisplayName + Colors.yellow)); - - BountyData bounty; - if (Bounties.TryGetValue(pAlive.name, out bounty)) - Bounties.Remove(pAlive.name); - if (bounty != null) { - Player.GlobalMessage(pKiller.FullName + " %Scollected the bounty of &a" + - bounty.Amount + " %S" + Server.moneys + " on " + pAlive.FullName + "%S."); - bounty.Origin.money = Math.Max(0, bounty.Origin.money - bounty.Amount); - pKiller.money += bounty.Amount; - } - UpdatePlayerColor(pAlive, Colors.red); + void DoCoreGame(Random random) { + Player[] alive = null; + while ((alive = Alive.Items).Length > 0) { + Player[] infected = Infected.Items; + foreach (Player pKiller in infected) { + UpdatePlayerColor(pKiller, Colors.red); + bool aliveChanged = false; + foreach (Player pAlive in alive) { + UpdatePlayerColor(pAlive, pAlive.group.color); + if (Math.Abs(pAlive.pos[0] - pKiller.pos[0]) > HitboxPrecision + || Math.Abs(pAlive.pos[1] - pKiller.pos[1]) > HitboxPrecision + || Math.Abs(pAlive.pos[2] - pKiller.pos[2]) > HitboxPrecision) + continue; + + if (!pAlive.infected && pKiller.infected && !pAlive.referee && !pKiller.referee && pKiller != pAlive + && pKiller.level.name.CaselessEq(CurrentLevelName) && pAlive.level.name.CaselessEq(CurrentLevelName)) + { + pAlive.infected = true; + Infected.Add(pAlive); + Alive.Remove(pAlive); + aliveChanged = true; + pAlive.blockCount = 25; + + if (lastPlayerToInfect == pKiller.name) { + infectCombo++; + if (infectCombo >= 2) { + pKiller.SendMessage("You gained " + (4 - infectCombo) + " " + Server.moneys); + pKiller.money += 4 - infectCombo; + CurrentLevel.ChatLevel(pKiller.FullName + " is on a rampage! " + (infectCombo + 1) + " infections in a row!"); } - }); - }); + } else { + infectCombo = 0; + } + + lastPlayerToInfect = pKiller.name; + pKiller.playersInfected++; + CurrentLevel.ChatLevel(String.Format( + messages[random.Next(messages.Length)], + Colors.red + pKiller.DisplayName + Colors.yellow, + Colors.red + pAlive.DisplayName + Colors.yellow)); + + BountyData bounty; + if (Bounties.TryGetValue(pAlive.name, out bounty)) + Bounties.Remove(pAlive.name); + if (bounty != null) { + CurrentLevel.ChatLevel(pKiller.FullName + " %Scollected the bounty of &a" + + bounty.Amount + " %S" + Server.moneys + " on " + pAlive.FullName + "%S."); + bounty.Origin.money = Math.Max(0, bounty.Origin.money - bounty.Amount); + pKiller.money += bounty.Amount; + } + UpdatePlayerColor(pAlive, Colors.red); + } + } + if (aliveChanged) alive = Alive.Items; + } Thread.Sleep(50); } } @@ -211,11 +211,11 @@ namespace MCGalaxy.Games { public void EndRound(object sender, ElapsedEventArgs e) { if (Status == ZombieGameStatus.NotStarted) return; - Player.GlobalMessage("%4Round End:%f 5"); Thread.Sleep(1000); - Player.GlobalMessage("%4Round End:%f 4"); Thread.Sleep(1000); - Player.GlobalMessage("%4Round End:%f 3"); Thread.Sleep(1000); - Player.GlobalMessage("%4Round End:%f 2"); Thread.Sleep(1000); - Player.GlobalMessage("%4Round End:%f 1"); Thread.Sleep(1000); + CurrentLevel.ChatLevel("%4Round End:%f 5"); Thread.Sleep(1000); + CurrentLevel.ChatLevel("%4Round End:%f 4"); Thread.Sleep(1000); + CurrentLevel.ChatLevel("%4Round End:%f 3"); Thread.Sleep(1000); + CurrentLevel.ChatLevel("%4Round End:%f 2"); Thread.Sleep(1000); + CurrentLevel.ChatLevel("%4Round End:%f 1"); Thread.Sleep(1000); HandOutRewards(); } @@ -225,34 +225,37 @@ namespace MCGalaxy.Games { RoundEnd = DateTime.MinValue; Bounties.Clear(); if (Status == ZombieGameStatus.NotStarted) return; - Player.GlobalMessage(Colors.lime + "The game has ended!"); - if (aliveCount == 0) Player.GlobalMessage(Colors.maroon + "Zombies have won this round."); - else if (aliveCount == 1) Player.GlobalMessage(Colors.green + "Congratulations to the sole survivor:"); - else Player.GlobalMessage(Colors.green + "Congratulations to the survivors:"); + + Player[] alive = Alive.Items; + CurrentLevel.ChatLevel(Colors.lime + "The game has ended!"); + if (alive.Length == 0) CurrentLevel.ChatLevel(Colors.maroon + "Zombies have won this round."); + else if (alive.Length == 1) CurrentLevel.ChatLevel(Colors.green + "Congratulations to the sole survivor:"); + else CurrentLevel.ChatLevel(Colors.green + "Congratulations to the survivors:"); timer.Enabled = false; string playersString = ""; Player[] online = null; - if (aliveCount == 0) { + if (alive.Length == 0) { online = PlayerInfo.Online.Items; foreach (Player pl in online) ResetPlayer(pl, ref playersString); } else { - alive.ForEach(pl => ResetPlayer(pl, ref playersString)); + foreach (Player pl in alive) + ResetPlayer(pl, ref playersString); } - Player.GlobalMessage(playersString); + CurrentLevel.ChatLevel(playersString); online = PlayerInfo.Online.Items; Random rand = new Random(); foreach (Player pl in online) { int money = 0; - if (pl.level.name != currentLevelName) continue; + if (!pl.level.name.CaselessEq(CurrentLevelName)) continue; bool inBlock = pl.CheckIfInsideBlock(); - if (!inBlock && aliveCount == 0) { + if (!inBlock && alive.Length == 0) { money = rand.Next(1, 5 + pl.playersInfected); - } else if (!inBlock && (aliveCount == 1 && !pl.infected)) { + } else if (!inBlock && (alive.Length == 1 && !pl.infected)) { money = rand.Next(5, 15); } else if (inBlock) { money = -1; @@ -276,7 +279,8 @@ namespace MCGalaxy.Games { pl.money++; } } - try {alive.Clear(); infectd.Clear(); } catch{ } + Alive.Clear(); + Infected.Clear(); } void ResetPlayer(Player p, ref string playersString) { @@ -284,7 +288,7 @@ namespace MCGalaxy.Games { p.infected = false; p.playersInfected = 0; - if (p.level.name == currentLevelName) { + if (p.level.name.CaselessEq(CurrentLevelName)) { p.color = p.group.color; playersString += p.group.color + p.DisplayName + Colors.white + ", "; } @@ -309,7 +313,7 @@ namespace MCGalaxy.Games { string level2 = levels[r.Next(0, levels.Count)]; if (lastLevel1 == level || lastLevel2 == level2 || lastLevel1 == level2 || - lastLevel2 == level || currentLevelName == level || currentLevelName == level2) { + lastLevel2 == level || CurrentLevelName == level || CurrentLevelName == level2) { goto LevelChoice; } else if (selectedLevel1 == "") { selectedLevel1 = level; goto LevelChoice; @@ -325,7 +329,7 @@ namespace MCGalaxy.Games { if (initialChangeLevel) { Server.votingforlevel = true; - Player.GlobalMessage(" " + Colors.black + "Level Vote: %S" + selectedLevel1 + ", " + selectedLevel2 + + CurrentLevel.ChatLevel(" " + Colors.black + "Level Vote: %S" + selectedLevel1 + ", " + selectedLevel2 + " or random " + "(" + Colors.lime + "1%S/" + Colors.red + "2%S/" + Colors.blue + "3%S)"); System.Threading.Thread.Sleep(15000); Server.votingforlevel = false; diff --git a/Games/ZombieSurvival/ZombieGame.Game.cs b/Games/ZombieSurvival/ZombieGame.Game.cs index 306ee069e..c78da8f79 100644 --- a/Games/ZombieSurvival/ZombieGame.Game.cs +++ b/Games/ZombieSurvival/ZombieGame.Game.cs @@ -41,7 +41,7 @@ namespace MCGalaxy.Games { p.lastXblock = x; p.lastYblock = y; p.lastZblock = z; if (action == 1 || (action == 0 && p.painting)) { - if (p.level.name != Server.zombie.currentLevelName || p.referee) return false; + if (!p.level.name.CaselessEq(CurrentLevelName) || p.referee) return false; if (p.blockCount == 0 ) { p.SendMessage("You have no blocks left."); @@ -84,31 +84,38 @@ namespace MCGalaxy.Games { } public override void PlayerLeftServer(Player p) { - InfectedPlayerDC(); + Alive.Remove(p); + Infected.Remove(p); + AssignFirstZombie(); } public override void PlayerJoinedServer(Player p) { if (Status == ZombieGameStatus.NotStarted) return; Player.SendMessage(p, "There is a Zombie Survival game currently in-progress! " + - "Join it by typing /g " + Server.zombie.currentLevelName); + "Join it by typing /g " + CurrentLevelName); } - public override void PlayerJoinedLevel(Player p, Level oldLevl) { - if (Server.zombie.RoundInProgress && p.level.name == currentLevelName) - Server.zombie.InfectedPlayerLogin(p); - if (p.level.name == currentLevelName) { - double startLeft = (RoundStart - DateTime.UtcNow).TotalSeconds; - if (startLeft >= 0) - p.SendMessage("%a" + (int)startLeft + " %Sseconds left until the round starts. %aRun!"); + public override void PlayerJoinedLevel(Player p, Level oldLvl) { + Server.s.Log("CHECK " + p.name); + if (RoundInProgress && p.level.name.CaselessEq(CurrentLevelName)) { + if (Status != ZombieGameStatus.NotStarted && p != null) { + p.SendMessage("You joined in the middle of a round. &cYou are now infected!"); + p.blockCount = 50; + InfectPlayer(p); + } + } + + if (p.level.name.CaselessEq(CurrentLevelName)) { + double startLeft = (RoundStart - DateTime.UtcNow).TotalSeconds; + if (startLeft >= 0) + p.SendMessage("%a" + (int)startLeft + " %Sseconds left until the round starts. %aRun!"); //p.SendMessage(CpeMessageType.BottomRight1, "%SYou have &a" + p.money + " %S" + Server.moneys); return; } p.SendMessage(CpeMessageType.BottomRight1, ""); - if(ZombieGame.alive.Contains(p)) - ZombieGame.alive.Remove(p); - if (ZombieGame.infectd.Contains(p)) - ZombieGame.infectd.Remove(p); + Alive.Remove(p); + Infected.Remove(p); } } } diff --git a/Games/ZombieSurvival/ZombieGame.cs b/Games/ZombieSurvival/ZombieGame.cs index 845ab9935..110c0f490 100644 --- a/Games/ZombieSurvival/ZombieGame.cs +++ b/Games/ZombieSurvival/ZombieGame.cs @@ -60,12 +60,24 @@ namespace MCGalaxy.Games { /// Time at which the next round is scheduled to end. public DateTime RoundEnd; - public int aliveCount = 0; public static System.Timers.Timer timer; public bool initialChangeLevel = false; - public string lastLevelName = "", currentLevelName = ""; - public static List alive = new List(); - public static List infectd = new List(); + + /// The name of the level that the last round of zombie survival was played on. + public string LastLevelName = ""; + + /// The name of the level that the current round of zombie survival is being played on. + public string CurrentLevelName = ""; + + /// The level that the current round of zombie survival is being played on. + public Level CurrentLevel = null; + + /// List of alive/human players. + public VolatileArray Alive = new VolatileArray(false); + + /// List of dead/infected players. + public VolatileArray Infected = new VolatileArray(false); + static string[] messages = new string[] { "{0} WIKIWOO'D {1}", "{0} stuck their teeth into {1}", "{0} licked {1}'s brain ", "{0} danubed {1}", "{0} made {1} meet their maker", "{0} tripped {1}", "{0} made some zombie babies with {1}", "{0} made {1} see the dark side", "{0} tweeted {1}", @@ -102,84 +114,68 @@ namespace MCGalaxy.Games { t.Start(); } - public void InfectedPlayerDC() { - if (Status == ZombieGameStatus.NotStarted) return; - //This is for when the first zombie disconnects + /// If there are no infected players left, randomly selected one of the alive players to continue the infection. + public void AssignFirstZombie() { + if (Status == ZombieGameStatus.NotStarted || !RoundInProgress || Infected.Count > 0) return; Random random = new Random(); - if ((Status != ZombieGameStatus.NotStarted && RoundInProgress) && infectd.Count <= 0) { - if (alive.Count == 0) return; - int index = random.Next(alive.Count); - - while (alive[index].referee || alive[index].level.name == Server.zombie.currentLevelName) { - if (index >= alive.Count - 1) index = 0; - else index++; + Player[] alive = Alive.Items; + if (alive.Length == 0) return; + int index = random.Next(alive.Length); + + while (alive[index].referee || !alive[index].level.name.CaselessEq(CurrentLevelName)) { + if (index >= alive.Length - 1) { + index = 0; + alive = Alive.Items; + if (alive.Length == 0) return; + } else { + index++; } - - Player zombie = alive[index]; - Player.GlobalMessage(zombie.FullName + " %Scontinued the infection!"); - InfectPlayer(zombie); } + + Player zombie = alive[index]; + Player.GlobalMessage(zombie.FullName + " %Scontinued the infection!"); + InfectPlayer(zombie); } - public bool InfectedPlayerLogin(Player p) { - if (Status == ZombieGameStatus.NotStarted || p == null) return false; - if (p.level.name != Server.zombie.currentLevelName) return false; - p.SendMessage("You have joined in the middle of a round. You are now infected!"); - p.blockCount = 50; - try - { - Server.zombie.InfectPlayer(p); - } - catch { } - return true; - } - - public void InfectPlayer(Player p) - { + public void InfectPlayer(Player p) { if (!RoundInProgress || p == null) return; - infectd.Add(p); - alive.Remove(p); + Infected.Add(p); + Alive.Remove(p); p.infected = true; UpdatePlayerColor(p, Colors.red); - aliveCount = alive.Count; } - public void DisinfectPlayer(Player p) - { + public void DisinfectPlayer(Player p) { if (!RoundInProgress || p == null) return; - infectd.Remove(p); - alive.Add(p); + Infected.Remove(p); + Alive.Add(p); p.infected = false; UpdatePlayerColor(p, p.group.color); - aliveCount = alive.Count; } void ChangeLevel(string next) { - currentLevelName = next; + CurrentLevelName = next; queLevel = false; nextLevel = ""; Command.all.Find("load").Use(null, next.ToLower() + " 0"); + CurrentLevel = LevelInfo.Find(next); Player.GlobalMessage("The next map has been chosen - " + Colors.red + next.ToLower()); Player.GlobalMessage("Please wait while you are transfered."); string oldLevel = Server.mainLevel.name; if (Server.ZombieOnlyServer) - Server.mainLevel = LevelInfo.Find(next); + Server.mainLevel = CurrentLevel; Player[] online = PlayerInfo.Online.Items; foreach (Player pl in online) { - if (pl.level.name != next && pl.level.name == lastLevelName) { + if (!pl.level.name.CaselessEq(next) && pl.level.name.CaselessEq(LastLevelName)) { pl.SendMessage("Going to the next map!"); Command.all.Find("goto").Use(pl, next); } } - if (lastLevelName != "") - Command.all.Find("unload").Use(null, lastLevelName); - lastLevelName = next; - } - - public bool IsInZombieGameLevel(Player p) { - return p.level.name == currentLevelName; + if (LastLevelName != "") + Command.all.Find("unload").Use(null, LastLevelName); + LastLevelName = next; } public void ResetState() { @@ -190,6 +186,9 @@ namespace MCGalaxy.Games { RoundInProgress = false; RoundStart = DateTime.MinValue; RoundEnd = DateTime.MinValue; + LastLevelName = ""; + CurrentLevelName = ""; + CurrentLevel = null; } } } diff --git a/Levels/Level.cs b/Levels/Level.cs index 0064b7cd1..8c71c6342 100644 --- a/Levels/Level.cs +++ b/Levels/Level.cs @@ -280,8 +280,9 @@ namespace MCGalaxy public static event OnLevelLoaded LevelLoaded; public bool ShouldSaveLevelFile() { - if (Server.ZombieModeOn && (name == Server.zombie.currentLevelName - || name == Server.zombie.lastLevelName)) return false; + if (Server.ZombieModeOn && + (name.CaselessEq(Server.zombie.CurrentLevelName) + || name.CaselessEq(Server.zombie.LastLevelName))) return false; if (Server.lava.active && Server.lava.HasMap(name)) return false; return true; } diff --git a/Player/Player.Handlers.cs b/Player/Player.Handlers.cs index 6453396eb..ba78e0c3f 100644 --- a/Player/Player.Handlers.cs +++ b/Player/Player.Handlers.cs @@ -20,6 +20,7 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; +using MCGalaxy.Commands; using MCGalaxy.Games; using MCGalaxy.SQL; @@ -531,7 +532,6 @@ namespace MCGalaxy { } Server.s.Log(name + " [" + ip + "] has joined the server."); - Server.zombie.PlayerJoinedServer(this); try { ushort x = (ushort)((0.5 + level.spawnx) * 32); @@ -554,6 +554,7 @@ namespace MCGalaxy { Server.ErrorLog(e); Server.s.Log("Error spawning player \"" + name + "\""); } + CmdGoto.CheckGamesJoin(this, null); Loading = false; } diff --git a/Player/Player.Timers.cs b/Player/Player.Timers.cs index f5e0ed7c5..5efaf3c62 100644 --- a/Player/Player.Timers.cs +++ b/Player/Player.Timers.cs @@ -101,12 +101,7 @@ namespace MCGalaxy { string suffix = players.Length == 1 ? " player online" : " players online"; SendMessage("There are currently &a" + players.Length + suffix); - try { - ZombieGame.alive.Remove(this); - ZombieGame.infectd.Remove(this); - } catch { - } - if ( Server.lava.active ) + if (Server.lava.active) SendMessage("There is a &aLava Survival " + Server.DefaultColor + "game active! Join it by typing /ls go"); extraTimer.Dispose(); } diff --git a/Server/Properties.cs b/Server/Properties.cs index 03074982b..341883e35 100644 --- a/Server/Properties.cs +++ b/Server/Properties.cs @@ -613,6 +613,12 @@ namespace MCGalaxy { Chat.standardTokens.Remove(token); Chat.disabledTokens = value; } break; + case "enable-http-api": + try { + Server.EnableHttpApi = bool.Parse(value); + } + catch { Server.s.Log("Invalid " + key + ". Using default."); } + break; } } @@ -745,7 +751,7 @@ namespace MCGalaxy { w.WriteLine("main-name = " + Server.level); w.WriteLine("default-texture-url = " + Server.defaultTerrainUrl); w.WriteLine("default-texture-pack-url = " + Server.defaultTexturePackUrl); - //w.WriteLine("guest-goto = " + Server.guestGoto); + w.WriteLine("enable-http-api = " + Server.EnableHttpApi); w.WriteLine(); w.WriteLine("# irc bot options"); w.WriteLine("irc = " + Server.irc.ToString().ToLower()); diff --git a/Server/Server.Tasks.cs b/Server/Server.Tasks.cs index 3e2d55783..5715ca263 100644 --- a/Server/Server.Tasks.cs +++ b/Server/Server.Tasks.cs @@ -150,10 +150,12 @@ namespace MCGalaxy { void InitRest() { try { - APIServer = new WebServer(SendResponse, "http://localhost:8080/api/"); - APIServer.Run(); - InfoServer = new WebServer(WhoIsResponse, "http://localhost:8080/whois/"); - InfoServer.Run(); + if (EnableHttpApi) { + APIServer = new WebServer(SendResponse, "http://localhost:8080/api/"); + APIServer.Run(); + InfoServer = new WebServer(WhoIsResponse, "http://localhost:8080/whois/"); + InfoServer.Run(); + } } catch { Server.s.Log("Failed to start local API server"); } diff --git a/Server/Server.cs b/Server/Server.cs index 40f4e19b9..12636d4c7 100644 --- a/Server/Server.cs +++ b/Server/Server.cs @@ -71,8 +71,7 @@ namespace MCGalaxy public static WebServer APIServer; public static WebServer InfoServer; public static DateTime StartTime, StartTimeLocal; - - public static int speedPhysics = 250; + public static bool EnableHttpApi = false; public static Version Version { get { return System.Reflection.Assembly.GetAssembly(typeof(Server)).GetName().Version; } } @@ -184,7 +183,6 @@ namespace MCGalaxy public static bool pub = true; public static bool verify = true; public static bool worldChat = true; - // public static bool guestGoto = false; //Spam Prevention public static bool checkspam = false; @@ -647,8 +645,8 @@ namespace MCGalaxy p.LeaveServer(msg, msg); } } - APIServer.Stop(); - InfoServer.Stop(); + if (APIServer != null) APIServer.Stop(); + if (InfoServer != null) InfoServer.Stop(); //PlayerInfo.players.ForEach(delegate(Player p) { p.Kick("Server shutdown. Rejoin in 10 seconds."); }); Player.connections.ForEach( delegate(Player p) diff --git a/util/VolatileArray.cs b/util/VolatileArray.cs index 41c43dee6..346f21949 100644 --- a/util/VolatileArray.cs +++ b/util/VolatileArray.cs @@ -65,5 +65,12 @@ namespace MCGalaxy { Items = newItems; } } + + public void Clear() { + lock (locker) { + if (useList) list.Clear(); + Items = new T[0]; + } + } } }