diff --git a/Economy/Economy.cs b/Economy/Economy.cs index a0711896b..c0799615b 100644 --- a/Economy/Economy.cs +++ b/Economy/Economy.cs @@ -148,7 +148,8 @@ PRIMARY KEY(player) public static Item[] Items = { new ColorItem(), new TitleColorItem(), new TitleItem(), new RankItem(), new LevelItem(), new LoginMessageItem(), new LogoutMessageItem(), new BlocksItem(), new QueueLevelItem(), - new InfectMessageItem(), new NickItem(), new InvisibilityItem(), new ReviveItem() }; + new InfectMessageItem(), new NickItem(), new ReviveItem(), + new HumanInvisibilityItem(), new ZombieInvisibilityItem() }; public static Item GetItem(string name) { foreach (Item item in Items) { diff --git a/Economy/ZombieItems.cs b/Economy/ZombieItems.cs index 6bda975e0..1267cd907 100644 --- a/Economy/ZombieItems.cs +++ b/Economy/ZombieItems.cs @@ -36,8 +36,8 @@ namespace MCGalaxy.Eco { Player.Message(p, "Number of groups of 10 blocks to buy must be an integer between 1 and 10."); return; } if (p.money < Price * count) { - Player.Message(p, "&cYou don't have enough &3{2} &cto buy {1} {0}.", - Name, count * 10, Server.moneys); return; + Player.Message(p, "&cYou don't have enough &3{2} &cto buy {1} {0}.", + Name, count * 10, Server.moneys); return; } p.Game.BlocksLeft += 10 * count; @@ -48,7 +48,7 @@ namespace MCGalaxy.Eco { Player.Message(p, "Syntax: %T/buy 10blocks [num]"); Player.Message(p, "Increases the blocks you are able to place by 10 * [num]."); Player.Message(p, "Costs &f{0} * [num] &3{1}", Price, Server.moneys); - } + } } public sealed class QueueLevelItem : SimpleItem { @@ -86,13 +86,13 @@ namespace MCGalaxy.Eco { string text = message.SplitSpaces(2)[1]; // keep spaces this way bool hasAToken = false; for (int i = 0; i < text.Length; i++) { - if (!CheckEscape(text, i, ref hasAToken)) { - Player.Message(p, "You can only use {0} and {1} for tokens in infect messages."); return; + if (!CheckEscape(text, i, ref hasAToken)) { + Player.Message(p, "You can only use {0} and {1} for tokens in infect messages."); return; } } if (!hasAToken) { Player.Message(p, "You need to include a \"{0}\" (placeholder for zombie player) " + - "and/or a \"{1}\" (placeholder for human player) in the infect message."); return; + "and/or a \"{1}\" (placeholder for human player) in the infect message."); return; } PlayerDB.AppendInfectMessage(p.name, text); @@ -111,54 +111,80 @@ namespace MCGalaxy.Eco { } } - public sealed class InvisibilityItem : SimpleItem { + public abstract class InvisibilityItem : SimpleItem { - public InvisibilityItem() { - Aliases = new[] { "invisibility", "invisible", "invis" }; - Price = 3; - } + protected abstract int MaxPotions { get; } + protected abstract int Duration { get; } + protected abstract bool ForHumans { get; } - public override string Name { get { return "Invisibility"; } } - - protected internal override void OnBuyCommand(Command cmd, Player p, - string message, string[] args) { + protected internal override void OnBuyCommand(Command cmd, Player p, + string message, string[] args) { if (p.money < Price) { Player.Message(p, "%cYou don't have enough &3{1} &c to buy a {0}.", Name, Server.moneys); return; } - if (p.Game.Invisible) { - Player.Message(p, "You are already invisible."); return; + if (p.Game.Invisible) { Player.Message(p, "You are already invisible."); return; } + if (p.Game.InvisibilityPotions >= MaxPotions) { + Player.Message(p, "You cannot buy any more invisibility potions this round."); return; } - if (p.Game.InvisibilityPotions >= ZombieGame.InvisibilityPotions) { - Player.Message(p, "You cannot buy any more invisibility potions this round."); return; - } + if (ForHumans && p.Game.Infected) { + Player.Message(p, "Use %T/buy zinvisibility %Sfor buying invisibility when you are a zombie."); return; + } + if (!ForHumans && !p.Game.Infected) { + Player.Message(p, "Use %T/buy invisibility %Sfor buying invisibility when you are a human."); return; + } + if (!Server.zombie.Running || !Server.zombie.RoundInProgress) { Player.Message(p, "You can only buy an invisiblity potion " + - "when a round of zombie survival is in progress."); return; + "when a round of zombie survival is in progress."); return; } DateTime end = Server.zombie.RoundEnd; if (DateTime.UtcNow.AddSeconds(60) > end) { Player.Message(p, "You cannot buy an invisibility potion " + - "during the last minute of a round."); return; - } - int duration = ZombieGame.InvisibilityDuration; + "during the last minute of a round."); return; + } p.Game.Invisible = true; - p.Game.InvisibilityEnd = DateTime.UtcNow.AddSeconds(duration); + p.Game.InvisibilityEnd = DateTime.UtcNow.AddSeconds(Duration); p.Game.InvisibilityPotions++; - int left = ZombieGame.InvisibilityPotions - p.Game.InvisibilityPotions; + int left = MaxPotions - p.Game.InvisibilityPotions; - Player.Message(p, "Lasts for &a{0} %Sseconds. You can buy &a{1} %Smore this round.", duration, left); + Player.Message(p, "Lasts for &a{0} %Sseconds. You can buy &a{1} %Smore this round.", Duration, left); Server.zombie.CurLevel.ChatLevel(p.ColoredName + " %Svanished. &a*POOF*"); Entities.GlobalDespawn(p, false); - Economy.MakePurchase(p, Price, "%3Invisibility: " + duration); + Economy.MakePurchase(p, Price, "%3Invisibility: " + Duration); } protected override void OnBuyCommand(Player p, string message, string[] args) { } protected internal override void OnStoreCommand(Player p) { base.OnStoreCommand(p); - int duration = ZombieGame.InvisibilityDuration; - Player.Message(p, "%HLasts for " + duration + " seconds before you reappear."); + Player.Message(p, "%HLasts for " + Duration + " seconds before you reappear."); } } + + public sealed class HumanInvisibilityItem : InvisibilityItem { + + public HumanInvisibilityItem() { + Aliases = new[] { "invisibility", "invisible", "invis" }; + Price = 3; + } + + public override string Name { get { return "Invisibility"; } } + protected override int MaxPotions { get { return ZombieGame.InvisibilityPotions; } } + protected override int Duration { get { return ZombieGame.InvisibilityDuration; } } + protected override bool ForHumans { get { return true; } } + } + + public sealed class ZombieInvisibilityItem : InvisibilityItem { + + public ZombieInvisibilityItem() { + Aliases = new[] { "zinvisibility", "zinvisible", "zinvis" }; + Price = 3; + } + + public override string Name { get { return "ZombieInvisibility"; } } + protected override int MaxPotions { get { return ZombieGame.ZombieInvisibilityPotions; } } + protected override int Duration { get { return ZombieGame.ZombieInvisibilityDuration; } } + protected override bool ForHumans { get { return false; } } + } } diff --git a/GUI/Settings/ZombieProperties.cs b/GUI/Settings/ZombieProperties.cs index e65e08ed9..432f1270d 100644 --- a/GUI/Settings/ZombieProperties.cs +++ b/GUI/Settings/ZombieProperties.cs @@ -114,7 +114,7 @@ namespace MCGalaxy.Gui { [Description("How many seconds an invisibility potion bought using /buy invisibility lasts.")] [Category("Human settings")] - [DisplayName("Invisibility durations")] + [DisplayName("Invisibility duration")] public int InvisibilityDuration { get; set; } [Description("Maximum number of invisibility potions a human is allowed to buy in a round.")] @@ -122,6 +122,16 @@ namespace MCGalaxy.Gui { [DisplayName("Invisibility potions")] public int InvisibilityPotions { get; set; } + [Description("How many seconds an invisibility potion bought using /buy zinvisibility lasts.")] + [Category("Zombie settings")] + [DisplayName("Invisibility duration")] + public int ZInvisibilityDuration { get; set; } + + [Description("Maximum number of invisibility potions a zombie is allowed to buy in a round.")] + [Category("Zombie settings")] + [DisplayName("Invisibility potions")] + public int ZInvisibilityPotions { get; set; } + [Description("The percentage chance that a revive potion will actually disinfect a zombie.")] [Category("Revive settings")] @@ -179,6 +189,8 @@ namespace MCGalaxy.Gui { Model = ZombieGame.ZombieModel; InvisibilityDuration = ZombieGame.InvisibilityDuration; InvisibilityPotions = ZombieGame.InvisibilityPotions; + ZInvisibilityDuration = ZombieGame.ZombieInvisibilityDuration; + ZInvisibilityPotions = ZombieGame.ZombieInvisibilityPotions; Chance = ZombieGame.ReviveChance; InsufficientTime = ZombieGame.ReviveNoTime; @@ -217,6 +229,8 @@ namespace MCGalaxy.Gui { ZombieGame.ZombieModel = "zombie"; ZombieGame.InvisibilityDuration = InvisibilityDuration; ZombieGame.InvisibilityPotions = InvisibilityPotions; + ZombieGame.ZombieInvisibilityDuration = ZInvisibilityDuration; + ZombieGame.ZombieInvisibilityPotions = ZInvisibilityPotions; ZombieGame.ReviveChance = Chance; ZombieGame.ReviveNoTime = InsufficientTime; diff --git a/Games/GameProps.cs b/Games/GameProps.cs index 864a31a8d..5be8c733c 100644 --- a/Games/GameProps.cs +++ b/Games/GameProps.cs @@ -43,7 +43,7 @@ namespace MCGalaxy.Games { public bool Referee = false; /// Remaining number of blocks the player can place this round. - internal int BlocksLeft = 50; + public int BlocksLeft = 50; /// Number of blocks the player has sequentially pillared up. internal int BlocksStacked = 0; diff --git a/Games/ZombieSurvival/ZombieGame.Core.cs b/Games/ZombieSurvival/ZombieGame.Core.cs index f832bb33a..393a206f0 100644 --- a/Games/ZombieSurvival/ZombieGame.Core.cs +++ b/Games/ZombieSurvival/ZombieGame.Core.cs @@ -218,7 +218,7 @@ namespace MCGalaxy.Games { if (aliveChanged) alive = Alive.Items; } - CheckInvisibilityTime(Alive.Items); + CheckInvisibilityTime(); Thread.Sleep(25); } } @@ -233,18 +233,13 @@ namespace MCGalaxy.Games { } } - void CheckInvisibilityTime(Player[] alive) { + void CheckInvisibilityTime() { DateTime now = DateTime.UtcNow; - foreach (Player p in alive) { - if (!p.Game.Invisible) continue; - DateTime end = p.Game.InvisibilityEnd; - - if (now >= end) { - p.SendCpeMessage(CpeMessageType.BottomRight2, "", false); - p.Game.ResetInvisibility(); - Entities.GlobalSpawn(p, false); - continue; - } + Player[] players = PlayerInfo.Online.Items; + foreach (Player p in players) { + if (!p.Game.Invisible || p.level != CurLevel) continue; + DateTime end = p.Game.InvisibilityEnd; + if (now >= end) { ResetInvisibility(p); continue; } int left = (int)Math.Ceiling((end - now).TotalSeconds); if (left == p.Game.InvisibilityTime) continue; diff --git a/Games/ZombieSurvival/ZombieGame.Props.cs b/Games/ZombieSurvival/ZombieGame.Props.cs index 044027808..ca8db21a6 100644 --- a/Games/ZombieSurvival/ZombieGame.Props.cs +++ b/Games/ZombieSurvival/ZombieGame.Props.cs @@ -123,6 +123,10 @@ namespace MCGalaxy.Games { public static int InvisibilityDuration = 7; [ConfigInt("zombie-invisibility-potions", "Zombie", null, 7, 1)] public static int InvisibilityPotions = 7; + [ConfigInt("zombie-zinvisibility-duration", "Zombie", null, 5, 1)] + public static int ZombieInvisibilityDuration = 5; + [ConfigInt("zombie-zinvisibility-potions", "Zombie", null, 4, 1)] + public static int ZombieInvisibilityPotions = 4; [ConfigBool("enable-changing-levels", "Zombie", null, true)] public static bool ChangeLevels = true; [ConfigBool("zombie-awards", "Zombie", null, false)] diff --git a/Games/ZombieSurvival/ZombieGame.cs b/Games/ZombieSurvival/ZombieGame.cs index d533b7d8c..6d942b503 100644 --- a/Games/ZombieSurvival/ZombieGame.cs +++ b/Games/ZombieSurvival/ZombieGame.cs @@ -97,12 +97,7 @@ namespace MCGalaxy.Games { Alive.Remove(p); p.Game.CurrentRoundsSurvived = 0; p.SetPrefix(); - - if (p.Game.Invisible) { - p.SendCpeMessage(CpeMessageType.BottomRight2, "", false); - Entities.GlobalSpawn(p, false); - p.Game.ResetInvisibility(); - } + ResetInvisibility(p); int delta = (int)(RoundEnd - DateTime.UtcNow).TotalSeconds; if (delta >= 0 && delta <= 5) @@ -119,12 +114,20 @@ namespace MCGalaxy.Games { if (!RoundInProgress || p == null) return; Infected.Remove(p); Alive.Add(p); + ResetInvisibility(p); p.Game.Infected = false; UpdatePlayerColor(p, p.color); UpdateAllPlayerStatus(); PlayerMoneyChanged(p); } + + void ResetInvisibility(Player p) { + if (!p.Game.Invisible) return; + p.SendCpeMessage(CpeMessageType.BottomRight2, "", false); + p.Game.ResetInvisibility(); + Entities.GlobalSpawn(p, false); + } void ChangeLevel(string next) { Player[] online = PlayerInfo.Online.Items; @@ -168,12 +171,8 @@ namespace MCGalaxy.Games { foreach (Player pl in online) { pl.Game.Referee = false; - pl.Game.ResetZombieState(); - - if (pl.Game.Invisible) { - pl.Game.ResetInvisibility(); - Entities.GlobalSpawn(pl, false); - } + pl.Game.ResetZombieState(); + ResetInvisibility(pl); pl.SetPrefix(); if (pl.level == null || !pl.level.name.CaselessEq(CurLevelName)) diff --git a/Player/Alias.cs b/Player/Alias.cs index 88c41b35f..4de03c668 100644 --- a/Player/Alias.cs +++ b/Player/Alias.cs @@ -75,10 +75,10 @@ namespace MCGalaxy { } public static Alias Find(string cmd) { - foreach (Alias alias in coreAliases) { + foreach (Alias alias in aliases) { if (alias.Trigger == cmd) return alias; } - foreach (Alias alias in aliases) { + foreach (Alias alias in coreAliases) { if (alias.Trigger == cmd) return alias; } return null;