diff --git a/MCGalaxy/Commands/Fun/CmdCountdown.cs b/MCGalaxy/Commands/Fun/CmdCountdown.cs index eef1cffc3..342a7a82d 100644 --- a/MCGalaxy/Commands/Fun/CmdCountdown.cs +++ b/MCGalaxy/Commands/Fun/CmdCountdown.cs @@ -54,7 +54,7 @@ namespace MCGalaxy.Commands.Fun { case "players": HandlePlayers(p, game); return; case "rules": - HandleRules(p, arg1); return; + HandleRules(p); return; case "download": case "generate": @@ -148,7 +148,7 @@ namespace MCGalaxy.Commands.Fun { } } - void HandleRules(Player p, string target) { + void HandleRules(Player p) { Player.Message(p, "The aim of the game is to stay alive the longest."); Player.Message(p, "Don't fall in the lava!"); Player.Message(p, "Blocks on the ground will disapear randomly, first going yellow, then orange, then red and finally disappearing."); diff --git a/MCGalaxy/Commands/Fun/CmdTntWars.cs b/MCGalaxy/Commands/Fun/CmdTntWars.cs index f6e951094..335f0eb59 100644 --- a/MCGalaxy/Commands/Fun/CmdTntWars.cs +++ b/MCGalaxy/Commands/Fun/CmdTntWars.cs @@ -179,60 +179,17 @@ namespace MCGalaxy.Commands.Fun { } void DoRules(Player p, string[] text) { - if (String.IsNullOrEmpty(text[1])) { - Player.Message(p, "TNT Wars Rules:"); - SendRules(p); return; - } - if (!CheckExtraPerm(p, 1)) return; - - switch (text[1]) { - case "all": - case "a": - Player[] players = PlayerInfo.Online.Items; - foreach (Player pl in players) { - Player.Message(pl, "TNT Wars Rules: (sent to all players by " + p.ColoredName + " %S)"); - SendRules(pl); - } - Player.Message(p, "TNT Wars: Sent rules to all players"); - return; - - case "level": - case "l": - foreach (Player pl in p.level.players) { - Player.Message(pl, "TNT Wars Rules: (sent to all players in map by " + p.ColoredName + " %S)"); - SendRules(pl); - } - Player.Message(p, "TNT Wars: Sent rules to all current players in map"); - return; - - case "players": - case "p": - TntWarsGame gm = TntWarsGame.GameIn(p); - if (gm == null) { Player.Message(p, "TNT Wars Error: You aren't in a TNT Wars game!"); return; } - - foreach (TntWarsGame.player pl in gm.Players) { - Player.Message(pl.p, "TNT Wars Rules: (sent to all current players by " + p.ColoredName + " %S)"); - SendRules(pl.p); - } - Player.Message(p, "TNT Wars: Sent rules to all current players"); - return; - - default: - Player who = PlayerInfo.FindMatches(p, text[1]); - if (who == null) return; - - Player.Message(who, "TNT Wars Rules: (sent to you by " + p.ColoredName + " %S)"); - SendRules(who); - Player.Message(p, "TNT Wars: Sent rules to " + who.color + who.name); - return; - } + Player.Message(p, "TNT Wars Rules:"); + Player.Message(p, "The aim of the game is to blow up people using TNT!"); + Player.Message(p, "To place tnt simply place a TNT block and after a short delay it shall explode!"); + Player.Message(p, "During the game the amount of TNT placable at one time may be limited!"); + Player.Message(p, "You are not allowed to use hacks of any sort during the game!"); } static void SendRules(Player p) { Player.Message(p, "The aim of the game is to blow up people using TNT!"); Player.Message(p, "To place tnt simply place a TNT block and after a short delay it shall explode!"); Player.Message(p, "During the game the amount of TNT placable at one time may be limited!"); - Player.Message(p, "You are not allowed to use hacks of any sort during the game!"); } void DoScores(Player p, string[] text) { @@ -1009,23 +966,6 @@ namespace MCGalaxy.Commands.Fun { } } - public override void Help(Player p) { - Player.Message(p, "TNT Wars Help:"); - Player.Message(p, "/tw list {l} - Lists all the current games"); - Player.Message(p, "/tw join - join a game on or on (red/blue)"); - Player.Message(p, "/tw leave - leave the current game"); - Player.Message(p, "/tw scores - view the top score/team scores/your scores"); - Player.Message(p, "/tw players {p} - view the current players in your game"); - Player.Message(p, "/tw health {hp} - view your currrent amount of health left"); - - if (HasExtraPerm(p, 1)) { - Player.Message(p, "/tw rules > - send the rules to yourself, all, your map, all players in your game or to one person!"); - Player.Message(p, "/tw setup {s} - setup the game (do '/tntwars setup help' for more info!"); - } else { - Player.Message(p, "/tw rules - read the rules"); - } - } - bool DeleteZoneCallback(Player p, Vec3S32[] marks, object state, BlockID block) { ushort x = (ushort)marks[0].X, y = (ushort)marks[0].Y, z = (ushort)marks[0].Z; TntWarsGame it = TntWarsGame.GameIn(p); @@ -1083,5 +1023,20 @@ namespace MCGalaxy.Commands.Fun { Player.Message(p, "Added zone"); return false; } + + + public override void Help(Player p) { + Player.Message(p, "/tw list {l} - Lists all running games"); + Player.Message(p, "/tw join - join a game on or on (red/blue)"); + Player.Message(p, "/tw leave - leave the current game"); + Player.Message(p, "/tw scores - view the top score/team scores/your scores"); + Player.Message(p, "/tw players {p} - view the current players in your game"); + Player.Message(p, "/tw health {hp} - view your currrent amount of health left"); + Player.Message(p, "/tw rules - read the rules"); + + if (HasExtraPerm(p, 1)) { + Player.Message(p, "/tw setup {s} - setup the game (do '/tntwars setup help' for more info!"); + } + } } } diff --git a/MCGalaxy/Commands/Fun/ZombieSurvival/CmdZombieGame.cs b/MCGalaxy/Commands/Fun/ZombieSurvival/CmdZombieGame.cs index 4efe9b1b1..422efe7de 100644 --- a/MCGalaxy/Commands/Fun/ZombieSurvival/CmdZombieGame.cs +++ b/MCGalaxy/Commands/Fun/ZombieSurvival/CmdZombieGame.cs @@ -103,7 +103,7 @@ namespace MCGalaxy.Commands.Fun { Player.Message(p, "%HSets how far apart players are allowed to move in a " + "movement packet before they are considered speedhacking. (32 units = 1 block)."); } else { - Help(p); + base.Help(p, message); } } } diff --git a/MCGalaxy/Commands/Information/CmdAbout.cs b/MCGalaxy/Commands/Information/CmdAbout.cs index 6c8cff679..a38fb0947 100644 --- a/MCGalaxy/Commands/Information/CmdAbout.cs +++ b/MCGalaxy/Commands/Information/CmdAbout.cs @@ -22,7 +22,6 @@ using MCGalaxy.DB; using MCGalaxy.Maths; using MCGalaxy.SQL; using BlockID = System.UInt16; -using BlockRaw = System.Byte; namespace MCGalaxy.Commands.Info { public sealed class CmdAbout : Command { diff --git a/MCGalaxy/Commands/Information/CmdSearch.cs b/MCGalaxy/Commands/Information/CmdSearch.cs index 0c861a4d8..84cfc728a 100644 --- a/MCGalaxy/Commands/Information/CmdSearch.cs +++ b/MCGalaxy/Commands/Information/CmdSearch.cs @@ -14,12 +14,8 @@ permissions and limitations under the Licenses. */ using System; using System.Collections.Generic; -using System.IO; -using System.Text; using System.Text.RegularExpressions; -using MCGalaxy.Blocks; using BlockID = System.UInt16; -using BlockRaw = System.Byte; namespace MCGalaxy.Commands.Info { public class CmdSearch : Command { diff --git a/MCGalaxy/Config/ServerProperties.cs b/MCGalaxy/Config/ServerProperties.cs index 81272694f..31a6dc644 100644 --- a/MCGalaxy/Config/ServerProperties.cs +++ b/MCGalaxy/Config/ServerProperties.cs @@ -61,7 +61,7 @@ namespace MCGalaxy { static void LineProcessor(string key, string value, ref OldPerms perms) { switch (key.ToLower()) { - // Backwards compatibility: some command extra permissions used to be part of server.properties + // Backwards compatibility: some command extra permissions used to be part of server.properties case "review-enter-perm": case "review-leave-perm": return; @@ -76,7 +76,7 @@ namespace MCGalaxy { case "adminchat-perm": perms.adminchatPerm = int.Parse(value); return; - // Backwards compatibility: map generation volume used to be part of server.properties + // Backwards compatibility: map generation volume used to be part of server.properties case "map-gen-limit-admin": perms.mapGenLimitAdmin = int.Parse(value); return; case "map-gen-limit": diff --git a/MCGalaxy/Economy/Economy.cs b/MCGalaxy/Economy/Economy.cs index 439381358..b7158fe72 100644 --- a/MCGalaxy/Economy/Economy.cs +++ b/MCGalaxy/Economy/Economy.cs @@ -68,6 +68,8 @@ namespace MCGalaxy.Eco { w.WriteLine("enabled:" + Enabled); foreach (Item item in Items) { w.WriteLine(); + w.WriteLine(item.Name + ":enabled:" + item.Enabled); + w.WriteLine(item.Name + ":purchaserank:" + (int)item.PurchaseRank); item.Serialise(w); } } diff --git a/MCGalaxy/Economy/Item.cs b/MCGalaxy/Economy/Item.cs index 2d5885c27..4eabcba01 100644 --- a/MCGalaxy/Economy/Item.cs +++ b/MCGalaxy/Economy/Item.cs @@ -105,9 +105,7 @@ namespace MCGalaxy.Eco { } public override void Serialise(StreamWriter writer) { - writer.WriteLine(Name + ":enabled:" + Enabled); writer.WriteLine(Name + ":price:" + Price); - writer.WriteLine(Name + ":purchaserank:" + (int)PurchaseRank); } protected internal override void OnBuyCommand(Player p, string message, string[] args) { diff --git a/MCGalaxy/Economy/LevelItem.cs b/MCGalaxy/Economy/LevelItem.cs index fe483f5da..e0b061025 100644 --- a/MCGalaxy/Economy/LevelItem.cs +++ b/MCGalaxy/Economy/LevelItem.cs @@ -60,17 +60,16 @@ namespace MCGalaxy.Eco { } public override void Serialise(StreamWriter writer) { - writer.WriteLine("level:enabled:" + Enabled); - writer.WriteLine("level:purchaserank:" + (int)PurchaseRank); - foreach (LevelPreset preset in Presets) { writer.WriteLine(); - writer.WriteLine("level:levels:" + preset.name + ":name:" + preset.name); - writer.WriteLine("level:levels:" + preset.name + ":price:" + preset.price); - writer.WriteLine("level:levels:" + preset.name + ":x:" + preset.x); - writer.WriteLine("level:levels:" + preset.name + ":y:" + preset.y); - writer.WriteLine("level:levels:" + preset.name + ":z:" + preset.z); - writer.WriteLine("level:levels:" + preset.name + ":type:" + preset.type); + string prefix = "level:levels:" + preset.name; + + writer.WriteLine(prefix + ":name:" + preset.name); + writer.WriteLine(prefix + ":price:" + preset.price); + writer.WriteLine(prefix + ":x:" + preset.x); + writer.WriteLine(prefix + ":y:" + preset.y); + writer.WriteLine(prefix + ":z:" + preset.z); + writer.WriteLine(prefix + ":type:" + preset.type); } } diff --git a/MCGalaxy/Economy/NameItems.cs b/MCGalaxy/Economy/NameItems.cs index 15f6d3bce..8a628dd49 100644 --- a/MCGalaxy/Economy/NameItems.cs +++ b/MCGalaxy/Economy/NameItems.cs @@ -50,7 +50,7 @@ namespace MCGalaxy.Eco { public sealed class NickItem : SimpleItem { public NickItem() { - Aliases = new string[] { "nickname", "nick", "nicks", "name", "names" }; + Aliases = new string[] { "nickname", "nick", "name" }; AllowsNoArgs = true; } @@ -78,7 +78,7 @@ namespace MCGalaxy.Eco { public sealed class TitleColorItem : SimpleItem { public TitleColorItem() { - Aliases = new string[] { "tcolor", "tcolors", "titlecolor", "titlecolors", "tc" }; + Aliases = new string[] { "tcolor", "tcolour", "titlecolor", "titlecolour" }; } public override string Name { get { return "TitleColor"; } } @@ -100,7 +100,7 @@ namespace MCGalaxy.Eco { public sealed class ColorItem : SimpleItem { public ColorItem() { - Aliases = new string[] { "colors", "color", "colours", "colour" }; + Aliases = new string[] { "color", "colour" }; } public override string Name { get { return "Color"; } } diff --git a/MCGalaxy/Economy/RankItem.cs b/MCGalaxy/Economy/RankItem.cs index 23a100f73..95baf3f72 100644 --- a/MCGalaxy/Economy/RankItem.cs +++ b/MCGalaxy/Economy/RankItem.cs @@ -48,9 +48,6 @@ namespace MCGalaxy.Eco { } public override void Serialise(StreamWriter writer) { - writer.WriteLine("rank:enabled:" + Enabled); - writer.WriteLine("rank:purchaserank:" + (int)PurchaseRank); - foreach (RankEntry rank in Ranks) { writer.WriteLine("rank:price:" + (int)rank.Perm + ":" + rank.Price); } diff --git a/MCGalaxy/Games/CTF/CtfGame.cs b/MCGalaxy/Games/CTF/CtfGame.cs index c8c7dd46f..1e84e648d 100644 --- a/MCGalaxy/Games/CTF/CtfGame.cs +++ b/MCGalaxy/Games/CTF/CtfGame.cs @@ -98,6 +98,13 @@ namespace MCGalaxy.Games { new ColumnDesc("Captures", ColumnType.UInt24), new ColumnDesc("tags", ColumnType.UInt24), }; + + protected override List GetPlayers() { + List playing = new List(); + playing.AddRange(Red.Members.Items); + playing.AddRange(Blue.Members.Items); + return playing; + } public override void Start(Player p, string map, int rounds) { map = GetStartMap(map); diff --git a/MCGalaxy/Games/Countdown/CountdownGame.Round.cs b/MCGalaxy/Games/Countdown/CountdownGame.Round.cs index 93c62ae27..1fcb86518 100644 --- a/MCGalaxy/Games/Countdown/CountdownGame.Round.cs +++ b/MCGalaxy/Games/Countdown/CountdownGame.Round.cs @@ -39,9 +39,7 @@ namespace MCGalaxy.Games { if (Status != CountdownGameStatus.RoundCountdown) return; int midX = Map.Width / 2, midY = Map.Height / 2, midZ = Map.Length / 2; - int xSpawn = (midX * 32 + 16); - int ySpawn = ((Map.Height - 2) * 32); - int zSpawn = (midZ * 32 + 16); + Position spawnPos = Position.FromFeetBlockCoords(midX, Map.Height - 2, midZ); squaresLeft.Clear(); for (int zz = 6; zz < Map.Length - 6; zz += 3) @@ -54,7 +52,7 @@ namespace MCGalaxy.Games { Map.ChatLevel("Countdown starting with difficulty " + SpeedType + " and mode normal in:"); Thread.Sleep(2000); - SpawnPlayers(xSpawn, ySpawn, zSpawn); + SpawnPlayers(spawnPos); Map.ChatLevel("-----&b5%S-----"); if (Status != CountdownGameStatus.RoundCountdown) return; @@ -81,8 +79,7 @@ namespace MCGalaxy.Games { DoRound(); } - void SpawnPlayers(int x, int y, int z) { - Position pos = new Position(x, y, z); + void SpawnPlayers(Position pos) { Player[] players = Players.Items; foreach (Player pl in players) { @@ -214,8 +211,8 @@ namespace MCGalaxy.Games { Thread.Sleep(Interval); Cuboid(x1, y, z1, x2, y, z2, Block.Air); bulk.Send(true); - // Remove glass borders if neighbouring squared were previously removed. + // Remove glass borders, if neighbouring squares were previously removed bool airMaxX = false, airMinZ = false, airMaxZ = false, airMinX = false; if (Map.IsAirAt(x1, y, (ushort)(z2 + 2))) { Map.Blockchange(x1, y, (ushort)(z2 + 1), Block.Air); @@ -238,7 +235,7 @@ namespace MCGalaxy.Games { airMinX = true; } - // Remove glass borders for diagonals too. + // Remove glass borders, if all neighbours to this corner have been removed if (Map.IsAirAt((ushort)(x1 - 2), y, (ushort)(z1 - 2)) && airMinX && airMinZ) { Map.Blockchange((ushort)(x1 - 1), y, (ushort)(z1 - 1), Block.Air); } diff --git a/MCGalaxy/Games/IGame.cs b/MCGalaxy/Games/IGame.cs index 9d98391ff..cb16a3a0f 100644 --- a/MCGalaxy/Games/IGame.cs +++ b/MCGalaxy/Games/IGame.cs @@ -45,126 +45,4 @@ namespace MCGalaxy.Games { } } } - - public abstract class RoundsGame : IGame { - public int RoundsLeft; - public bool RoundInProgress; - public string LastMap = ""; - public LevelPicker Picker; - - public abstract void Start(Player p, string map, int rounds); - protected abstract void DoRound(); - - public void RunGame() { - try { - while (Running && RoundsLeft > 0) { - RoundInProgress = false; - if (RoundsLeft != int.MaxValue) RoundsLeft--; - DoRound(); - } - End(); - } catch (Exception ex) { - Logger.LogError(ex); - Chat.MessageGlobal("&c" + GameName + " disabled due to an error."); - - try { End(); } - catch (Exception ex2) { Logger.LogError(ex2); } - } - } - - protected void VoteAndMoveToNextMap() { - Picker.AddRecentMap(Map.MapName); - if (RoundsLeft == 0) return; - string map = Picker.ChooseNextLevel(this); - if (map == null) return; - - Map.ChatLevel("The next map has been chosen - &c" + map.ToLower()); - Map.ChatLevel("Please wait while you are transfered."); - LastMap = Map.MapName; - - if (!SetMap(map)) { - Map.ChatLevel("&cFailed to change map to " + map); - Map.ChatLevel("Continuing " + GameName + " on the same map"); - } else { - TransferPlayers(LastMap); - Command.Find("Unload").Use(null, LastMap); - } - } - - protected string GetStartMap(string forcedMap) { - if (forcedMap.Length > 0) return forcedMap; - List maps = Picker.GetCandidateMaps(); - - if (maps == null || maps.Count == 0) return null; - return LevelPicker.GetRandomMap(new Random(), maps); - } - - protected virtual bool SetMap(string map) { - Picker.QueuedMap = null; - Level next = LevelInfo.FindExact(map); - if (next == null) next = CmdLoad.LoadLevel(null, map); - - if (next == null) return false; - Map = next; - Map.SaveChanges = false; - return true; - } - - void TransferPlayers(string lastMap) { - Random rnd = new Random(); - Player[] online = PlayerInfo.Online.Items; - List transfers = new List(online.Length); - - foreach (Player pl in online) { - pl.Game.RatedMap = false; - pl.Game.PledgeSurvive = false; - if (pl.level != Map && pl.level.name.CaselessEq(lastMap)) { transfers.Add(pl); } - } - - while (transfers.Count > 0) { - int i = rnd.Next(0, transfers.Count); - Player pl = transfers[i]; - - pl.SendMessage("Going to the next map - &a" + Map.MapName); - PlayerActions.ChangeMap(pl, Map); - transfers.RemoveAt(i); - } - } - - protected void EndCommon() { - RoundsLeft = 0; - RoundInProgress = false; - - Player[] online = PlayerInfo.Online.Items; - foreach (Player pl in online) { - if (pl.level != Map) continue; - TabList.Update(pl, true); - } - - if (Map != null) Map.ChatLevel(GameName + " %Sgame ended"); - Logger.Log(LogType.GameActivity, "[{0}] Game ended", GameName); - - Picker.Clear(); - LastMap = ""; - Map = null; - } - - protected void HandleJoinedCommon(Player p, Level prevLevel, Level level, ref bool announce) { - if (prevLevel == Map && level != Map) { - if (Picker.Voting) Picker.ResetVoteMessage(p); - } else if (level == Map) { - if (Picker.Voting) Picker.SendVoteMessage(p); - } - - if (level != Map) return; - if (prevLevel == Map || LastMap.Length == 0 || prevLevel.name.CaselessEq(LastMap)) - announce = false; - } - - protected void HandleLevelUnload(Level lvl) { - if (lvl != Map) return; - Logger.Log(LogType.GameActivity, "Unload cancelled! A {0} game is currently going on!", GameName); - lvl.cancelunload = true; - } - } } diff --git a/MCGalaxy/Games/LavaSurvival/LSGame.Round.cs b/MCGalaxy/Games/LavaSurvival/LSGame.Round.cs index ede535696..17085528f 100644 --- a/MCGalaxy/Games/LavaSurvival/LSGame.Round.cs +++ b/MCGalaxy/Games/LavaSurvival/LSGame.Round.cs @@ -27,7 +27,7 @@ namespace MCGalaxy.Games { if (!running) return; ResetPlayerDeaths(); - startTime = DateTime.UtcNow; + RoundStart = DateTime.UtcNow; RoundInProgress = true; Logger.Log(LogType.GameActivity, "[Lava Survival] Round started. Map: " + Map.ColoredName); @@ -71,12 +71,12 @@ namespace MCGalaxy.Games { } internal string FloodTimeLeftMessage() { - double mins = Math.Ceiling((startTime.AddMinutes(mapSettings.floodTime) - DateTime.UtcNow).TotalMinutes); + double mins = Math.Ceiling((RoundStart.AddMinutes(mapSettings.floodTime) - DateTime.UtcNow).TotalMinutes); return "&3" + mins + " minute" + (mins == 1 ? "" : "s") + " %Suntil the flood."; } internal string RoundTimeLeftMessage() { - double mins = Math.Ceiling((startTime.AddMinutes(mapSettings.roundTime) - DateTime.UtcNow).TotalMinutes); + double mins = Math.Ceiling((RoundStart.AddMinutes(mapSettings.roundTime) - DateTime.UtcNow).TotalMinutes); return "&3" + mins + " minute" + (mins == 1 ? "" : "s") + " %Suntil the round ends."; } diff --git a/MCGalaxy/Games/LavaSurvival/LSGame.cs b/MCGalaxy/Games/LavaSurvival/LSGame.cs index abda6a911..9599a0406 100644 --- a/MCGalaxy/Games/LavaSurvival/LSGame.cs +++ b/MCGalaxy/Games/LavaSurvival/LSGame.cs @@ -28,7 +28,6 @@ namespace MCGalaxy.Games { const string propsDir = "properties/lavasurvival/"; List maps; Random rand = new Random(); - DateTime startTime; MapData data; MapSettings mapSettings; @@ -52,7 +51,11 @@ namespace MCGalaxy.Games { } return (LSData)data; } - + + protected override List GetPlayers() { + return Map.getPlayers(); + } + public override void Start(Player p, string map, int rounds) { map = GetStartMap(map); if (map == null) { diff --git a/MCGalaxy/Games/RoundsGame.cs b/MCGalaxy/Games/RoundsGame.cs new file mode 100644 index 000000000..fd7dd3ab4 --- /dev/null +++ b/MCGalaxy/Games/RoundsGame.cs @@ -0,0 +1,172 @@ +/* + Copyright 2015 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.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 System; +using System.Collections.Generic; +using System.Threading; +using MCGalaxy.Commands.World; + +namespace MCGalaxy.Games { + + public abstract class RoundsGame : IGame { + public int RoundsLeft; + public bool RoundInProgress; + public DateTime RoundStart; + public string LastMap = ""; + public LevelPicker Picker; + + public abstract void Start(Player p, string map, int rounds); + protected abstract void DoRound(); + protected abstract List GetPlayers(); + + public void RunGame() { + try { + while (Running && RoundsLeft > 0) { + RoundInProgress = false; + if (RoundsLeft != int.MaxValue) RoundsLeft--; + DoRound(); + } + End(); + } catch (Exception ex) { + Logger.LogError(ex); + Chat.MessageGlobal("&c" + GameName + " disabled due to an error."); + + try { End(); } + catch (Exception ex2) { Logger.LogError(ex2); } + } + } + + protected List DoRoundCountdown(int delay) { + while (true) { + RoundStart = DateTime.UtcNow.AddSeconds(delay); + if (!Running) return null; + const CpeMessageType type = CpeMessageType.Announcement; + + for (int i = delay; i > 0 && Running; i--) { + if (i == 1) { + MessageMap(type, "&4Starting in &f1 &4seconds"); + } else if (i < 10 || (i % 10) == 0) { + MessageMap(type, "&4Starting in &f" + i + " &4seconds"); + } + Thread.Sleep(1000); + } + + MessageMap(type, ""); + if (!Running) return null; + + List players = GetPlayers(); + if (players.Count >= 2) return players; + Map.ChatLevel("&cNeed 2 or more non-ref players to start a round."); + } + } + + protected void VoteAndMoveToNextMap() { + Picker.AddRecentMap(Map.MapName); + if (RoundsLeft == 0) return; + string map = Picker.ChooseNextLevel(this); + if (map == null) return; + + Map.ChatLevel("The next map has been chosen - &c" + map.ToLower()); + Map.ChatLevel("Please wait while you are transfered."); + LastMap = Map.MapName; + + if (!SetMap(map)) { + Map.ChatLevel("&cFailed to change map to " + map); + Map.ChatLevel("Continuing " + GameName + " on the same map"); + } else { + TransferPlayers(LastMap); + Command.Find("Unload").Use(null, LastMap); + } + } + + protected string GetStartMap(string forcedMap) { + if (forcedMap.Length > 0) return forcedMap; + List maps = Picker.GetCandidateMaps(); + + if (maps == null || maps.Count == 0) return null; + return LevelPicker.GetRandomMap(new Random(), maps); + } + + protected virtual bool SetMap(string map) { + Picker.QueuedMap = null; + Level next = LevelInfo.FindExact(map); + if (next == null) next = CmdLoad.LoadLevel(null, map); + + if (next == null) return false; + Map = next; + Map.SaveChanges = false; + return true; + } + + void TransferPlayers(string lastMap) { + Random rnd = new Random(); + Player[] online = PlayerInfo.Online.Items; + List transfers = new List(online.Length); + + foreach (Player pl in online) { + pl.Game.RatedMap = false; + pl.Game.PledgeSurvive = false; + if (pl.level != Map && pl.level.name.CaselessEq(lastMap)) { transfers.Add(pl); } + } + + while (transfers.Count > 0) { + int i = rnd.Next(0, transfers.Count); + Player pl = transfers[i]; + + pl.SendMessage("Going to the next map - &a" + Map.MapName); + PlayerActions.ChangeMap(pl, Map); + transfers.RemoveAt(i); + } + } + + protected void EndCommon() { + RoundsLeft = 0; + RoundInProgress = false; + + Player[] online = PlayerInfo.Online.Items; + foreach (Player pl in online) { + if (pl.level != Map) continue; + TabList.Update(pl, true); + } + + if (Map != null) Map.ChatLevel(GameName + " %Sgame ended"); + Logger.Log(LogType.GameActivity, "[{0}] Game ended", GameName); + + Picker.Clear(); + LastMap = ""; + Map = null; + } + + protected void HandleJoinedCommon(Player p, Level prevLevel, Level level, ref bool announce) { + if (prevLevel == Map && level != Map) { + if (Picker.Voting) Picker.ResetVoteMessage(p); + } else if (level == Map) { + if (Picker.Voting) Picker.SendVoteMessage(p); + } + + if (level != Map) return; + if (prevLevel == Map || LastMap.Length == 0 || prevLevel.name.CaselessEq(LastMap)) + announce = false; + } + + protected void HandleLevelUnload(Level lvl) { + if (lvl != Map) return; + Logger.Log(LogType.GameActivity, "Unload cancelled! A {0} game is currently going on!", GameName); + lvl.cancelunload = true; + } + } +} diff --git a/MCGalaxy/Games/ZombieSurvival/ZSGame.Round.cs b/MCGalaxy/Games/ZombieSurvival/ZSGame.Round.cs index 429ffbb52..99a2494b7 100644 --- a/MCGalaxy/Games/ZombieSurvival/ZSGame.Round.cs +++ b/MCGalaxy/Games/ZombieSurvival/ZSGame.Round.cs @@ -31,8 +31,8 @@ namespace MCGalaxy.Games { int infectCombo = 0; protected override void DoRound() { - if (!Running) return; - List players = DoRoundCountdown(); + if (!running) return; + List players = DoRoundCountdown(30); if (players == null) return; if (!running) return; @@ -69,44 +69,6 @@ namespace MCGalaxy.Games { InfectPlayer(first, null); } - List DoRoundCountdown() { - while (true) { - RoundStart = DateTime.UtcNow.AddSeconds(30); - if (!running) return null; - - SendLevelRaw("&4Starting in &f30 &4seconds", true); - Thread.Sleep(10000); if (!running) return null; - SendLevelRaw("&4Starting in &f20 &4seconds", true); - Thread.Sleep(10000); if (!running) return null; - SendLevelRaw("&4Starting in &f10 &4seconds", true); - Thread.Sleep(5000); if (!running) return null; - SendLevelRaw("&4Starting in &f5 &4seconds", true); - Thread.Sleep(1000); if (!running) return null; - SendLevelRaw("&4Starting in &f4 &4seconds", true); - Thread.Sleep(1000); if (!running) return null; - SendLevelRaw("&4Starting in &f3 &4seconds", true); - Thread.Sleep(1000); if (!running) return null; - SendLevelRaw("&4Starting in &f2 &4seconds", true); - Thread.Sleep(1000); if (!running) return null; - SendLevelRaw("&4Starting in &f1 &4second", true); - Thread.Sleep(1000); if (!running) return null; - SendLevelRaw("", true); - int nonRefPlayers = 0; - List players = new List(); - - Player[] online = PlayerInfo.Online.Items; - foreach (Player p in online) { - if (p.Game.Referee || p.level != Map) continue; - players.Add(p); - nonRefPlayers++; - } - - if (!running) return null; - if (nonRefPlayers >= 2) return players; - Map.ChatLevel("&cNeed 2 or more non-ref players to start a round."); - } - } - void DoCoreGame() { Player[] alive = Alive.Items; string lastTimeLeft = null; diff --git a/MCGalaxy/Games/ZombieSurvival/ZSGame.cs b/MCGalaxy/Games/ZombieSurvival/ZSGame.cs index 6ca0575d9..1eebbd062 100644 --- a/MCGalaxy/Games/ZombieSurvival/ZSGame.cs +++ b/MCGalaxy/Games/ZombieSurvival/ZSGame.cs @@ -75,7 +75,7 @@ namespace MCGalaxy.Games { public override bool Running { get { return running; } } public ZSGame() { Picker = new ZSLevelPicker(); } - public DateTime RoundStart, RoundEnd; + public DateTime RoundEnd; public VolatileArray Alive = new VolatileArray(); public VolatileArray Infected = new VolatileArray(); public string QueuedZombie; @@ -109,6 +109,17 @@ namespace MCGalaxy.Games { data.MaxRoundsSurvived = stats.MaxRounds; data.TotalRoundsSurvived = stats.TotalRounds; } + protected override List GetPlayers() { + Player[] players = PlayerInfo.Online.Items; + List playing = new List(); + + foreach (Player pl in players) { + if (pl.level != Map || pl.Game.Referee) continue; + playing.Add(pl); + } + return playing; + } + public override void Start(Player p, string map, int rounds) { // ZS starts on current map by default if (!Player.IsSuper(p) && map.Length == 0) map = p.level.name; @@ -366,10 +377,10 @@ namespace MCGalaxy.Games { if (table.Rows.Count > 0) { DataRow row = table.Rows[0]; - stats.TotalRounds = int.Parse(row["TotalRounds"].ToString()); - stats.MaxRounds = int.Parse(row["MaxRounds"].ToString()); - stats.TotalInfected = int.Parse(row["TotalInfected"].ToString()); - stats.MaxInfected = int.Parse(row["MaxInfected"].ToString()); + stats.TotalRounds = PlayerData.ParseInt(row["TotalRounds"].ToString()); + stats.MaxRounds = PlayerData.ParseInt(row["MaxRounds"].ToString()); + stats.TotalInfected = PlayerData.ParseInt(row["TotalInfected"].ToString()); + stats.MaxInfected = PlayerData.ParseInt(row["MaxInfected"].ToString()); } table.Dispose(); return stats; diff --git a/MCGalaxy/MCGalaxy_.csproj b/MCGalaxy/MCGalaxy_.csproj index 9304c3608..cd9cb4980 100644 --- a/MCGalaxy/MCGalaxy_.csproj +++ b/MCGalaxy/MCGalaxy_.csproj @@ -501,6 +501,7 @@ + diff --git a/MCGalaxy/Network/Player.Networking.cs b/MCGalaxy/Network/Player.Networking.cs index a0ad3365a..7ddc71115 100644 --- a/MCGalaxy/Network/Player.Networking.cs +++ b/MCGalaxy/Network/Player.Networking.cs @@ -151,13 +151,13 @@ namespace MCGalaxy { return last.UnicodeToCp437() != last; } - public void SendCpeMessage(CpeMessageType type, string message, bool colorParse = true) { + public void SendCpeMessage(CpeMessageType type, string message) { if (type != CpeMessageType.Normal && !Supports(CpeExt.MessageTypes)) { if (type == CpeMessageType.Announcement) type = CpeMessageType.Normal; else return; } - message = Chat.Format(message, this, colorParse); + message = Chat.Format(message, this); Send(Packet.Message(message, type, hasCP437)); }