diff --git a/GUI/ColoredTextBox.cs b/GUI/Controls/ColoredTextBox.cs
similarity index 100%
rename from GUI/ColoredTextBox.cs
rename to GUI/Controls/ColoredTextBox.cs
diff --git a/GUI/Controls/TimespanUpDown.cs b/GUI/Controls/TimespanUpDown.cs
new file mode 100644
index 000000000..371e36755
--- /dev/null
+++ b/GUI/Controls/TimespanUpDown.cs
@@ -0,0 +1,118 @@
+/*
+ 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.ComponentModel;
+using System.Globalization;
+using System.Media;
+using System.Windows.Forms;
+
+namespace MCGalaxy.Gui {
+ [DefaultBindingProperty("Seconds"), DefaultEvent("ValueChanged"), DefaultProperty("Seconds")]
+ public class TimespanUpDown : UpDownBase, ISupportInitialize {
+ long totalSecs;
+ EventHandler onValueChanged;
+ bool initializing;
+
+ public event EventHandler ValueChanged {
+ add { onValueChanged = (EventHandler)Delegate.Combine(onValueChanged, value); }
+ remove { onValueChanged = (EventHandler)Delegate.Remove(onValueChanged, value); }
+ }
+
+ [Bindable(true)]
+ public long Seconds {
+ get {
+ if (UserEdit) ValidateEditText();
+ return totalSecs;
+ }
+ set {
+ if (value == totalSecs) return;
+ if (value < 0) value = 0;
+
+ totalSecs = value;
+ if (onValueChanged != null) onValueChanged(this, EventArgs.Empty);
+ UpdateEditText();
+ }
+ }
+
+ public TimeSpan Value {
+ get { return TimeSpan.FromSeconds(Seconds); }
+ set { Seconds = value.SecondsLong(); }
+ }
+
+ public TimespanUpDown() { Text = "0s"; }
+ public void BeginInit() { initializing = true; }
+
+ public void EndInit() {
+ initializing = false;
+ Seconds = totalSecs;
+ UpdateEditText();
+ }
+
+ protected override void OnTextBoxKeyPress(object source, KeyPressEventArgs e) {
+ base.OnTextBoxKeyPress(source, e);
+ // don't intercept ctrl+A, ctrl+C etc
+ if ((Control.ModifierKeys & (Keys.Control | Keys.Alt)) != Keys.None) return;
+ // always allowed to input numbers
+ if (e.KeyChar == '\b' || char.IsDigit(e.KeyChar)) return;
+
+ try {
+ (Text + e.KeyChar.ToString()).ParseShort("s");
+ } catch {
+ e.Handled = true;
+ SystemSounds.Beep.Play();
+ }
+ }
+
+ protected override void OnLostFocus(EventArgs e) {
+ base.OnLostFocus(e);
+ if (UserEdit) UpdateEditText();
+ }
+
+ public override void DownButton() {
+ if (UserEdit) ParseEditText();
+ if (totalSecs <= 0) totalSecs = 1;
+ Seconds = totalSecs - 1;
+ }
+
+ public override void UpButton() {
+ if (UserEdit) ParseEditText();
+ if (totalSecs == long.MaxValue) return;
+ Seconds = totalSecs + 1;
+ }
+
+ void ParseEditText() {
+ try {
+ Value = Text.ParseShort("s");
+ } catch {
+ } finally {
+ UserEdit = false;
+ }
+ }
+
+ protected override void UpdateEditText() {
+ if (initializing) return;
+ if (UserEdit) ParseEditText();
+ Text = TimeSpan.FromSeconds(totalSecs).Shorten(true, true);
+ }
+
+ protected override void ValidateEditText() {
+ ParseEditText();
+ UpdateEditText();
+ }
+ }
+}
\ No newline at end of file
diff --git a/GUI/MCGalaxyGUI.csproj b/GUI/MCGalaxyGUI.csproj
index 3865db3e4..e79c5d161 100644
--- a/GUI/MCGalaxyGUI.csproj
+++ b/GUI/MCGalaxyGUI.csproj
@@ -54,6 +54,10 @@
CLI.cs
+
+ Component
+
+
@@ -105,9 +109,6 @@
-
- Component
-
@@ -120,9 +121,6 @@
-
- PortTools.cs
-
Window.cs
Designer
@@ -142,6 +140,7 @@
+
diff --git a/GUI/Popups/PortTools.resx b/GUI/Popups/PortTools.resx
deleted file mode 100644
index 757195cb3..000000000
--- a/GUI/Popups/PortTools.resx
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 17, 17
-
-
\ No newline at end of file
diff --git a/GUI/PropertyWindow/PropertyWindow.Designer.cs b/GUI/PropertyWindow/PropertyWindow.Designer.cs
index 3c01cec81..dcf809e82 100644
--- a/GUI/PropertyWindow/PropertyWindow.Designer.cs
+++ b/GUI/PropertyWindow/PropertyWindow.Designer.cs
@@ -132,7 +132,7 @@ namespace MCGalaxy.Gui
this.ls_numHeight = new System.Windows.Forms.NumericUpDown();
this.ls_cbMain = new System.Windows.Forms.CheckBox();
this.ls_cbStart = new System.Windows.Forms.CheckBox();
- this.rank_numAfk = new System.Windows.Forms.NumericUpDown();
+ this.rank_numAfk = new MCGalaxy.Gui.TimespanUpDown();
this.sec_cbLogNotes = new System.Windows.Forms.CheckBox();
this.sec_cbChatAuto = new System.Windows.Forms.CheckBox();
this.pageBlocks = new System.Windows.Forms.TabPage();
@@ -173,7 +173,6 @@ namespace MCGalaxy.Gui
this.rank_lblDefault = new System.Windows.Forms.Label();
this.rank_grpMisc = new System.Windows.Forms.GroupBox();
this.rank_cbAfk = new System.Windows.Forms.CheckBox();
- this.rank_lblAfk = new System.Windows.Forms.Label();
this.rank_lblPrefix = new System.Windows.Forms.Label();
this.rank_lblPerm = new System.Windows.Forms.Label();
this.rank_lblMOTD = new System.Windows.Forms.Label();
@@ -345,6 +344,8 @@ namespace MCGalaxy.Gui
this.tw_numGrace = new System.Windows.Forms.NumericUpDown();
this.tw_cbGrace = new System.Windows.Forms.CheckBox();
this.tw_grpScores = new System.Windows.Forms.GroupBox();
+ this.tw_lblMulti = new System.Windows.Forms.Label();
+ this.tw_lblAssist = new System.Windows.Forms.Label();
this.tw_cbStreaks = new System.Windows.Forms.CheckBox();
this.tw_numMultiKills = new System.Windows.Forms.NumericUpDown();
this.tw_numScoreAssists = new System.Windows.Forms.NumericUpDown();
@@ -402,31 +403,25 @@ namespace MCGalaxy.Gui
this.sec_lblChatOnMute = new System.Windows.Forms.Label();
this.sec_numChatMsgs = new System.Windows.Forms.NumericUpDown();
this.sec_lblChatOnMsgs = new System.Windows.Forms.Label();
- this.sec_numChatSecs = new System.Windows.Forms.NumericUpDown();
- this.sec_lblChatOnSecs = new System.Windows.Forms.Label();
+ this.sec_numChatSecs = new MCGalaxy.Gui.TimespanUpDown();
this.sec_lblChatForMute = new System.Windows.Forms.Label();
- this.sec_numChatMute = new System.Windows.Forms.NumericUpDown();
- this.sec_lblChatForSecs = new System.Windows.Forms.Label();
+ this.sec_numChatMute = new MCGalaxy.Gui.TimespanUpDown();
this.sec_grpCmd = new System.Windows.Forms.GroupBox();
this.sec_cbCmdAuto = new System.Windows.Forms.CheckBox();
this.sec_lblCmdOnMute = new System.Windows.Forms.Label();
this.sec_numCmdMsgs = new System.Windows.Forms.NumericUpDown();
this.sec_lblCmdOnMsgs = new System.Windows.Forms.Label();
- this.sec_numCmdSecs = new System.Windows.Forms.NumericUpDown();
- this.sec_lblCmdOnSecs = new System.Windows.Forms.Label();
+ this.sec_numCmdSecs = new MCGalaxy.Gui.TimespanUpDown();
this.sec_lblCmdForMute = new System.Windows.Forms.Label();
- this.sec_numCmdMute = new System.Windows.Forms.NumericUpDown();
- this.sec_lblCmdForSecs = new System.Windows.Forms.Label();
+ this.sec_numCmdMute = new MCGalaxy.Gui.TimespanUpDown();
this.sec_grpIP = new System.Windows.Forms.GroupBox();
this.sec_cbIPAuto = new System.Windows.Forms.CheckBox();
this.sec_lblIPOnMute = new System.Windows.Forms.Label();
this.sec_numIPMsgs = new System.Windows.Forms.NumericUpDown();
this.sec_lblIPOnMsgs = new System.Windows.Forms.Label();
- this.sec_numIPSecs = new System.Windows.Forms.NumericUpDown();
- this.sec_lblIPOnSecs = new System.Windows.Forms.Label();
+ this.sec_numIPSecs = new MCGalaxy.Gui.TimespanUpDown();
this.sec_lblIPForMute = new System.Windows.Forms.Label();
- this.sec_numIPMute = new System.Windows.Forms.NumericUpDown();
- this.sec_lblIPForSecs = new System.Windows.Forms.Label();
+ this.sec_numIPMute = new MCGalaxy.Gui.TimespanUpDown();
this.sec_grpOther = new System.Windows.Forms.GroupBox();
this.sec_lblRank = new System.Windows.Forms.Label();
this.sec_grpBlocks = new System.Windows.Forms.GroupBox();
@@ -434,10 +429,7 @@ namespace MCGalaxy.Gui
this.sec_lblBlocksOnMute = new System.Windows.Forms.Label();
this.sec_numBlocksMsgs = new System.Windows.Forms.NumericUpDown();
this.sec_lblBlocksOnMsgs = new System.Windows.Forms.Label();
- this.sec_numBlocksSecs = new System.Windows.Forms.NumericUpDown();
- this.sec_lblBlocksOnSecs = new System.Windows.Forms.Label();
- this.tw_lblAssist = new System.Windows.Forms.Label();
- this.tw_lblMulti = new System.Windows.Forms.Label();
+ this.sec_numBlocksSecs = new MCGalaxy.Gui.TimespanUpDown();
this.pageChat.SuspendLayout();
this.chat_grpTab.SuspendLayout();
this.chat_grpMessages.SuspendLayout();
@@ -1491,14 +1483,11 @@ namespace MCGalaxy.Gui
// rank_numAfk
//
this.rank_numAfk.Location = new System.Drawing.Point(113, 102);
- this.rank_numAfk.Maximum = new decimal(new int[] {
- 100000,
- 0,
- 0,
- 0});
this.rank_numAfk.Name = "rank_numAfk";
- this.rank_numAfk.Size = new System.Drawing.Size(61, 21);
+ this.rank_numAfk.Size = new System.Drawing.Size(62, 21);
this.rank_numAfk.TabIndex = 23;
+ this.rank_numAfk.Text = "0s";
+ this.rank_numAfk.Seconds = ((long)(0));
this.rank_numAfk.ValueChanged += new System.EventHandler(this.rank_numAfk_ValueChanged);
//
// sec_cbLogNotes
@@ -1913,7 +1902,6 @@ namespace MCGalaxy.Gui
//
this.rank_grpMisc.Controls.Add(this.rank_numAfk);
this.rank_grpMisc.Controls.Add(this.rank_cbAfk);
- this.rank_grpMisc.Controls.Add(this.rank_lblAfk);
this.rank_grpMisc.Controls.Add(this.rank_lblPrefix);
this.rank_grpMisc.Controls.Add(this.rank_txtPrefix);
this.rank_grpMisc.Controls.Add(this.rank_lblPerm);
@@ -1941,16 +1929,6 @@ namespace MCGalaxy.Gui
this.rank_cbAfk.UseVisualStyleBackColor = true;
this.rank_cbAfk.CheckedChanged += new System.EventHandler(this.rank_cbAfk_CheckedChanged);
//
- // rank_lblAfk
- //
- this.rank_lblAfk.AutoSize = true;
- this.rank_lblAfk.Location = new System.Drawing.Point(176, 106);
- this.rank_lblAfk.Name = "rank_lblAfk";
- this.rank_lblAfk.Size = new System.Drawing.Size(46, 13);
- this.rank_lblAfk.TabIndex = 23;
- this.rank_lblAfk.Text = "minutes";
- this.rank_lblAfk.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
- //
// rank_lblPrefix
//
this.rank_lblPrefix.AutoSize = true;
@@ -3802,6 +3780,24 @@ namespace MCGalaxy.Gui
this.tw_grpScores.TabStop = false;
this.tw_grpScores.Text = "Scores";
//
+ // tw_lblMulti
+ //
+ this.tw_lblMulti.AutoSize = true;
+ this.tw_lblMulti.Location = new System.Drawing.Point(157, 47);
+ this.tw_lblMulti.Name = "tw_lblMulti";
+ this.tw_lblMulti.Size = new System.Drawing.Size(79, 13);
+ this.tw_lblMulti.TabIndex = 10;
+ this.tw_lblMulti.Text = "Multikill bonus:";
+ //
+ // tw_lblAssist
+ //
+ this.tw_lblAssist.AutoSize = true;
+ this.tw_lblAssist.Location = new System.Drawing.Point(168, 20);
+ this.tw_lblAssist.Name = "tw_lblAssist";
+ this.tw_lblAssist.Size = new System.Drawing.Size(69, 13);
+ this.tw_lblAssist.TabIndex = 9;
+ this.tw_lblAssist.Text = "Assist bonus:";
+ //
// tw_cbStreaks
//
this.tw_cbStreaks.AutoSize = true;
@@ -4380,10 +4376,8 @@ namespace MCGalaxy.Gui
this.sec_grpChat.Controls.Add(this.sec_numChatMsgs);
this.sec_grpChat.Controls.Add(this.sec_lblChatOnMsgs);
this.sec_grpChat.Controls.Add(this.sec_numChatSecs);
- this.sec_grpChat.Controls.Add(this.sec_lblChatOnSecs);
this.sec_grpChat.Controls.Add(this.sec_lblChatForMute);
this.sec_grpChat.Controls.Add(this.sec_numChatMute);
- this.sec_grpChat.Controls.Add(this.sec_lblChatForSecs);
this.sec_grpChat.Location = new System.Drawing.Point(14, 6);
this.sec_grpChat.Name = "sec_grpChat";
this.sec_grpChat.Size = new System.Drawing.Size(238, 111);
@@ -4429,28 +4423,11 @@ namespace MCGalaxy.Gui
// sec_numChatSecs
//
this.sec_numChatSecs.Location = new System.Drawing.Point(156, 45);
- this.sec_numChatSecs.Maximum = new decimal(new int[] {
- 10000,
- 0,
- 0,
- 0});
this.sec_numChatSecs.Name = "sec_numChatSecs";
- this.sec_numChatSecs.Size = new System.Drawing.Size(42, 21);
+ this.sec_numChatSecs.Size = new System.Drawing.Size(62, 21);
this.sec_numChatSecs.TabIndex = 34;
- this.sec_numChatSecs.Value = new decimal(new int[] {
- 5,
- 0,
- 0,
- 0});
- //
- // sec_lblChatOnSecs
- //
- this.sec_lblChatOnSecs.AutoSize = true;
- this.sec_lblChatOnSecs.Location = new System.Drawing.Point(199, 48);
- this.sec_lblChatOnSecs.Name = "sec_lblChatOnSecs";
- this.sec_lblChatOnSecs.Size = new System.Drawing.Size(28, 13);
- this.sec_lblChatOnSecs.TabIndex = 33;
- this.sec_lblChatOnSecs.Text = "secs";
+ this.sec_numChatSecs.Text = "5s";
+ this.sec_numChatSecs.Seconds = ((long)(5));
//
// sec_lblChatForMute
//
@@ -4464,28 +4441,11 @@ namespace MCGalaxy.Gui
// sec_numChatMute
//
this.sec_numChatMute.Location = new System.Drawing.Point(53, 79);
- this.sec_numChatMute.Maximum = new decimal(new int[] {
- 1000000,
- 0,
- 0,
- 0});
this.sec_numChatMute.Name = "sec_numChatMute";
- this.sec_numChatMute.Size = new System.Drawing.Size(37, 21);
+ this.sec_numChatMute.Size = new System.Drawing.Size(62, 21);
this.sec_numChatMute.TabIndex = 32;
- this.sec_numChatMute.Value = new decimal(new int[] {
- 60,
- 0,
- 0,
- 0});
- //
- // sec_lblChatForSecs
- //
- this.sec_lblChatForSecs.AutoSize = true;
- this.sec_lblChatForSecs.Location = new System.Drawing.Point(91, 83);
- this.sec_lblChatForSecs.Name = "sec_lblChatForSecs";
- this.sec_lblChatForSecs.Size = new System.Drawing.Size(46, 13);
- this.sec_lblChatForSecs.TabIndex = 33;
- this.sec_lblChatForSecs.Text = "seconds";
+ this.sec_numChatMute.Text = "1m";
+ this.sec_numChatMute.Seconds = ((long)(60));
//
// sec_grpCmd
//
@@ -4494,10 +4454,8 @@ namespace MCGalaxy.Gui
this.sec_grpCmd.Controls.Add(this.sec_numCmdMsgs);
this.sec_grpCmd.Controls.Add(this.sec_lblCmdOnMsgs);
this.sec_grpCmd.Controls.Add(this.sec_numCmdSecs);
- this.sec_grpCmd.Controls.Add(this.sec_lblCmdOnSecs);
this.sec_grpCmd.Controls.Add(this.sec_lblCmdForMute);
this.sec_grpCmd.Controls.Add(this.sec_numCmdMute);
- this.sec_grpCmd.Controls.Add(this.sec_lblCmdForSecs);
this.sec_grpCmd.Location = new System.Drawing.Point(14, 123);
this.sec_grpCmd.Name = "sec_grpCmd";
this.sec_grpCmd.Size = new System.Drawing.Size(238, 110);
@@ -4554,28 +4512,11 @@ namespace MCGalaxy.Gui
// sec_numCmdSecs
//
this.sec_numCmdSecs.Location = new System.Drawing.Point(161, 45);
- this.sec_numCmdSecs.Maximum = new decimal(new int[] {
- 10000,
- 0,
- 0,
- 0});
this.sec_numCmdSecs.Name = "sec_numCmdSecs";
- this.sec_numCmdSecs.Size = new System.Drawing.Size(42, 21);
+ this.sec_numCmdSecs.Size = new System.Drawing.Size(62, 21);
this.sec_numCmdSecs.TabIndex = 34;
- this.sec_numCmdSecs.Value = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- //
- // sec_lblCmdOnSecs
- //
- this.sec_lblCmdOnSecs.AutoSize = true;
- this.sec_lblCmdOnSecs.Location = new System.Drawing.Point(204, 48);
- this.sec_lblCmdOnSecs.Name = "sec_lblCmdOnSecs";
- this.sec_lblCmdOnSecs.Size = new System.Drawing.Size(28, 13);
- this.sec_lblCmdOnSecs.TabIndex = 33;
- this.sec_lblCmdOnSecs.Text = "secs";
+ this.sec_numCmdSecs.Text = "1s";
+ this.sec_numCmdSecs.Seconds = ((long)(1));
//
// sec_lblCmdForMute
//
@@ -4589,28 +4530,11 @@ namespace MCGalaxy.Gui
// sec_numCmdMute
//
this.sec_numCmdMute.Location = new System.Drawing.Point(53, 79);
- this.sec_numCmdMute.Maximum = new decimal(new int[] {
- 1000000,
- 0,
- 0,
- 0});
this.sec_numCmdMute.Name = "sec_numCmdMute";
- this.sec_numCmdMute.Size = new System.Drawing.Size(37, 21);
+ this.sec_numCmdMute.Size = new System.Drawing.Size(62, 21);
this.sec_numCmdMute.TabIndex = 32;
- this.sec_numCmdMute.Value = new decimal(new int[] {
- 60,
- 0,
- 0,
- 0});
- //
- // sec_lblCmdForSecs
- //
- this.sec_lblCmdForSecs.AutoSize = true;
- this.sec_lblCmdForSecs.Location = new System.Drawing.Point(91, 83);
- this.sec_lblCmdForSecs.Name = "sec_lblCmdForSecs";
- this.sec_lblCmdForSecs.Size = new System.Drawing.Size(46, 13);
- this.sec_lblCmdForSecs.TabIndex = 33;
- this.sec_lblCmdForSecs.Text = "seconds";
+ this.sec_numCmdMute.Text = "1m";
+ this.sec_numCmdMute.Seconds = ((long)(60));
//
// sec_grpIP
//
@@ -4619,10 +4543,8 @@ namespace MCGalaxy.Gui
this.sec_grpIP.Controls.Add(this.sec_numIPMsgs);
this.sec_grpIP.Controls.Add(this.sec_lblIPOnMsgs);
this.sec_grpIP.Controls.Add(this.sec_numIPSecs);
- this.sec_grpIP.Controls.Add(this.sec_lblIPOnSecs);
this.sec_grpIP.Controls.Add(this.sec_lblIPForMute);
this.sec_grpIP.Controls.Add(this.sec_numIPMute);
- this.sec_grpIP.Controls.Add(this.sec_lblIPForSecs);
this.sec_grpIP.Location = new System.Drawing.Point(14, 240);
this.sec_grpIP.Name = "sec_grpIP";
this.sec_grpIP.Size = new System.Drawing.Size(238, 110);
@@ -4679,28 +4601,11 @@ namespace MCGalaxy.Gui
// sec_numIPSecs
//
this.sec_numIPSecs.Location = new System.Drawing.Point(166, 45);
- this.sec_numIPSecs.Maximum = new decimal(new int[] {
- 10000,
- 0,
- 0,
- 0});
this.sec_numIPSecs.Name = "sec_numIPSecs";
- this.sec_numIPSecs.Size = new System.Drawing.Size(42, 21);
+ this.sec_numIPSecs.Size = new System.Drawing.Size(62, 21);
this.sec_numIPSecs.TabIndex = 34;
- this.sec_numIPSecs.Value = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- //
- // sec_lblIPOnSecs
- //
- this.sec_lblIPOnSecs.AutoSize = true;
- this.sec_lblIPOnSecs.Location = new System.Drawing.Point(209, 48);
- this.sec_lblIPOnSecs.Name = "sec_lblIPOnSecs";
- this.sec_lblIPOnSecs.Size = new System.Drawing.Size(28, 13);
- this.sec_lblIPOnSecs.TabIndex = 33;
- this.sec_lblIPOnSecs.Text = "secs";
+ this.sec_numIPSecs.Text = "1s";
+ this.sec_numIPSecs.Seconds = ((long)(1));
//
// sec_lblIPForMute
//
@@ -4714,28 +4619,11 @@ namespace MCGalaxy.Gui
// sec_numIPMute
//
this.sec_numIPMute.Location = new System.Drawing.Point(53, 79);
- this.sec_numIPMute.Maximum = new decimal(new int[] {
- 1000000,
- 0,
- 0,
- 0});
this.sec_numIPMute.Name = "sec_numIPMute";
- this.sec_numIPMute.Size = new System.Drawing.Size(42, 21);
+ this.sec_numIPMute.Size = new System.Drawing.Size(62, 21);
this.sec_numIPMute.TabIndex = 32;
- this.sec_numIPMute.Value = new decimal(new int[] {
- 300,
- 0,
- 0,
- 0});
- //
- // sec_lblIPForSecs
- //
- this.sec_lblIPForSecs.AutoSize = true;
- this.sec_lblIPForSecs.Location = new System.Drawing.Point(96, 83);
- this.sec_lblIPForSecs.Name = "sec_lblIPForSecs";
- this.sec_lblIPForSecs.Size = new System.Drawing.Size(46, 13);
- this.sec_lblIPForSecs.TabIndex = 33;
- this.sec_lblIPForSecs.Text = "seconds";
+ this.sec_numIPMute.Text = "5m";
+ this.sec_numIPMute.Seconds = ((long)(300));
//
// sec_grpOther
//
@@ -4767,7 +4655,6 @@ namespace MCGalaxy.Gui
this.sec_grpBlocks.Controls.Add(this.sec_numBlocksMsgs);
this.sec_grpBlocks.Controls.Add(this.sec_lblBlocksOnMsgs);
this.sec_grpBlocks.Controls.Add(this.sec_numBlocksSecs);
- this.sec_grpBlocks.Controls.Add(this.sec_lblBlocksOnSecs);
this.sec_grpBlocks.Location = new System.Drawing.Point(264, 150);
this.sec_grpBlocks.Name = "sec_grpBlocks";
this.sec_grpBlocks.Size = new System.Drawing.Size(217, 83);
@@ -4824,46 +4711,11 @@ namespace MCGalaxy.Gui
// sec_numBlocksSecs
//
this.sec_numBlocksSecs.Location = new System.Drawing.Point(142, 45);
- this.sec_numBlocksSecs.Maximum = new decimal(new int[] {
- 10000,
- 0,
- 0,
- 0});
this.sec_numBlocksSecs.Name = "sec_numBlocksSecs";
- this.sec_numBlocksSecs.Size = new System.Drawing.Size(42, 21);
+ this.sec_numBlocksSecs.Size = new System.Drawing.Size(62, 21);
this.sec_numBlocksSecs.TabIndex = 34;
- this.sec_numBlocksSecs.Value = new decimal(new int[] {
- 5,
- 0,
- 0,
- 0});
- //
- // sec_lblBlocksOnSecs
- //
- this.sec_lblBlocksOnSecs.AutoSize = true;
- this.sec_lblBlocksOnSecs.Location = new System.Drawing.Point(185, 48);
- this.sec_lblBlocksOnSecs.Name = "sec_lblBlocksOnSecs";
- this.sec_lblBlocksOnSecs.Size = new System.Drawing.Size(28, 13);
- this.sec_lblBlocksOnSecs.TabIndex = 33;
- this.sec_lblBlocksOnSecs.Text = "secs";
- //
- // tw_lblAssist
- //
- this.tw_lblAssist.AutoSize = true;
- this.tw_lblAssist.Location = new System.Drawing.Point(168, 20);
- this.tw_lblAssist.Name = "tw_lblAssist";
- this.tw_lblAssist.Size = new System.Drawing.Size(69, 13);
- this.tw_lblAssist.TabIndex = 9;
- this.tw_lblAssist.Text = "Assist bonus:";
- //
- // tw_lblMulti
- //
- this.tw_lblMulti.AutoSize = true;
- this.tw_lblMulti.Location = new System.Drawing.Point(157, 47);
- this.tw_lblMulti.Name = "tw_lblMulti";
- this.tw_lblMulti.Size = new System.Drawing.Size(79, 13);
- this.tw_lblMulti.TabIndex = 10;
- this.tw_lblMulti.Text = "Multikill bonus:";
+ this.sec_numBlocksSecs.Text = "5s";
+ this.sec_numBlocksSecs.Seconds = ((long)(5));
//
// PropertyWindow
//
@@ -5134,8 +4986,7 @@ namespace MCGalaxy.Gui
private System.Windows.Forms.Label rank_lblCopy;
private System.Windows.Forms.NumericUpDown rank_numCopy;
private System.Windows.Forms.CheckBox rank_cbAfk;
- private System.Windows.Forms.NumericUpDown rank_numAfk;
- private System.Windows.Forms.Label rank_lblAfk;
+ private MCGalaxy.Gui.TimespanUpDown rank_numAfk;
private System.Windows.Forms.Label rank_lblUndo;
private System.Windows.Forms.NumericUpDown rank_numUndo;
private System.Windows.Forms.Label rank_lblDraw;
@@ -5249,32 +5100,26 @@ namespace MCGalaxy.Gui
private System.Windows.Forms.GroupBox sec_grpChat;
private System.Windows.Forms.CheckBox sec_cbChatAuto;
private System.Windows.Forms.Label sec_lblChatForMute;
- private System.Windows.Forms.NumericUpDown sec_numChatMute;
+ private MCGalaxy.Gui.TimespanUpDown sec_numChatMute;
private System.Windows.Forms.Label sec_lblChatOnMsgs;
private System.Windows.Forms.NumericUpDown sec_numChatMsgs;
private System.Windows.Forms.Label sec_lblChatOnMute;
- private System.Windows.Forms.NumericUpDown sec_numChatSecs;
- private System.Windows.Forms.Label sec_lblChatOnSecs;
- private System.Windows.Forms.Label sec_lblChatForSecs;
+ private MCGalaxy.Gui.TimespanUpDown sec_numChatSecs;
private System.Windows.Forms.GroupBox sec_grpCmd;
private System.Windows.Forms.CheckBox sec_cbCmdAuto;
- private System.Windows.Forms.Label sec_lblCmdForSecs;
- private System.Windows.Forms.NumericUpDown sec_numCmdMute;
+ private MCGalaxy.Gui.TimespanUpDown sec_numCmdMute;
private System.Windows.Forms.Label sec_lblCmdForMute;
- private System.Windows.Forms.Label sec_lblCmdOnSecs;
- private System.Windows.Forms.NumericUpDown sec_numCmdSecs;
+ private MCGalaxy.Gui.TimespanUpDown sec_numCmdSecs;
private System.Windows.Forms.Label sec_lblCmdOnMsgs;
private System.Windows.Forms.NumericUpDown sec_numCmdMsgs;
private System.Windows.Forms.Label sec_lblCmdOnMute;
private System.Windows.Forms.GroupBox sec_grpIP;
private System.Windows.Forms.CheckBox sec_cbIPAuto;
- private System.Windows.Forms.Label sec_lblIPForSecs;
- private System.Windows.Forms.NumericUpDown sec_numIPMute;
+ private MCGalaxy.Gui.TimespanUpDown sec_numIPMute;
private System.Windows.Forms.Label sec_lblIPForMute;
- private System.Windows.Forms.Label sec_lblIPOnSecs;
- private System.Windows.Forms.NumericUpDown sec_numIPSecs;
+ private MCGalaxy.Gui.TimespanUpDown sec_numIPSecs;
private System.Windows.Forms.Label sec_lblIPOnMsgs;
private System.Windows.Forms.NumericUpDown sec_numIPMsgs;
private System.Windows.Forms.Label sec_lblIPOnMute;
@@ -5288,8 +5133,7 @@ namespace MCGalaxy.Gui
private System.Windows.Forms.GroupBox sec_grpBlocks;
private System.Windows.Forms.CheckBox sec_cbBlocksAuto;
- private System.Windows.Forms.Label sec_lblBlocksOnSecs;
- private System.Windows.Forms.NumericUpDown sec_numBlocksSecs;
+ private MCGalaxy.Gui.TimespanUpDown sec_numBlocksSecs;
private System.Windows.Forms.Label sec_lblBlocksOnMsgs;
private System.Windows.Forms.NumericUpDown sec_numBlocksMsgs;
private System.Windows.Forms.Label sec_lblBlocksOnMute;
diff --git a/GUI/PropertyWindow/PropertyWindow.Misc.cs b/GUI/PropertyWindow/PropertyWindow.Misc.cs
index 570f841f1..c70c51244 100644
--- a/GUI/PropertyWindow/PropertyWindow.Misc.cs
+++ b/GUI/PropertyWindow/PropertyWindow.Misc.cs
@@ -26,7 +26,7 @@ namespace MCGalaxy.Gui {
hackrank_kick.Checked = ServerConfig.HackrankKicks;
hackrank_kick_time.Text = ServerConfig.HackrankKickDelay.ToString();
- afk_txtTimer.Text = ServerConfig.AutoAfkMins.ToString();
+ afk_txtTimer.Text = ServerConfig.AutoAfkTime.TotalSeconds.ToString();
chkPhysicsRest.Checked = ServerConfig.PhysicsRestart;
txtRP.Text = ServerConfig.PhysicsRestartLimit.ToString();
txtNormRp.Text = ServerConfig.PhysicsRestartNormLimit.ToString();
@@ -46,7 +46,7 @@ namespace MCGalaxy.Gui {
ServerConfig.HackrankKicks = hackrank_kick.Checked;
ServerConfig.HackrankKickDelay = int.Parse(hackrank_kick_time.Text);
- ServerConfig.AutoAfkMins = int.Parse(afk_txtTimer.Text);
+ ServerConfig.AutoAfkTime = TimeSpan.FromSeconds(int.Parse(afk_txtTimer.Text));
ServerConfig.PhysicsRestart = chkPhysicsRest.Checked;
ServerConfig.PhysicsRestartLimit = int.Parse(txtRP.Text);
ServerConfig.PhysicsRestartNormLimit = int.Parse(txtNormRp.Text);
diff --git a/GUI/PropertyWindow/PropertyWindow.Ranks.cs b/GUI/PropertyWindow/PropertyWindow.Ranks.cs
index d9916edb8..9e5d29d3b 100644
--- a/GUI/PropertyWindow/PropertyWindow.Ranks.cs
+++ b/GUI/PropertyWindow/PropertyWindow.Ranks.cs
@@ -41,9 +41,11 @@ namespace MCGalaxy.Gui {
List copiedGroups = new List();
+ Group curGroup;
void LoadRanks() {
rank_list.Items.Clear();
copiedGroups.Clear();
+ curGroup = null;
foreach (Group grp in Group.GroupList) {
copiedGroups.Add(grp.CopyConfig());
@@ -60,21 +62,25 @@ namespace MCGalaxy.Gui {
void rank_btnColor_Click(object sender, EventArgs e) {
- chat_ShowColorDialog(rank_btnColor, copiedGroups[rank_list.SelectedIndex].Name + " rank color");
- copiedGroups[rank_list.SelectedIndex].Color = Colors.Parse(rank_btnColor.Text);
+ chat_ShowColorDialog(rank_btnColor, curGroup.Name + " rank color");
+ curGroup.Color = Colors.Parse(rank_btnColor.Text);
}
void rank_list_SelectedIndexChanged(object sender, EventArgs e) {
- if (rankSupressEvents || rank_list.SelectedIndex == -1) return;
+ if (rankSupressEvents) return;
+ curGroup = null;
+ if (rank_list.SelectedIndex == -1) return;
+
Group grp = copiedGroups[rank_list.SelectedIndex];
-
+ curGroup = grp;
+
rank_txtName.Text = grp.Name;
rank_numPerm.Value = (int)grp.Permission;
chat_ParseColor(grp.Color, rank_btnColor);
rank_txtMOTD.Text = grp.MOTD;
rank_txtPrefix.Text = grp.Prefix;
rank_cbAfk.Checked = grp.AfkKicked;
- rank_numAfk.Value = grp.AfkKickMinutes;
+ rank_numAfk.Value = grp.AfkKickTime;
rank_numDraw.Value = grp.DrawLimit;
rank_numUndo.Value = grp.MaxUndo;
@@ -90,57 +96,56 @@ namespace MCGalaxy.Gui {
}
if (rank_txtName.Text.Length == 0) return;
- copiedGroups[rank_list.SelectedIndex].Name = rank_txtName.Text;
+ curGroup.Name = rank_txtName.Text;
rankSupressEvents = true;
- rank_list.Items[rank_list.SelectedIndex] = rank_txtName.Text + " = " + (int)copiedGroups[rank_list.SelectedIndex].Permission;
+ rank_list.Items[rank_list.SelectedIndex] = rank_txtName.Text + " = " + (int)curGroup.Permission;
rankSupressEvents = false;
}
void rank_numPerm_ValueChanged(object sender, EventArgs e) {
int perm = (int)rank_numPerm.Value;
- copiedGroups[rank_list.SelectedIndex].Permission = (LevelPermission)perm;
+ curGroup.Permission = (LevelPermission)perm;
rankSupressEvents = true;
- rank_list.Items[rank_list.SelectedIndex] = copiedGroups[rank_list.SelectedIndex].Name + " = " + perm;
+ rank_list.Items[rank_list.SelectedIndex] = curGroup.Name + " = " + perm;
rankSupressEvents = false;
}
void rank_txtMOTD_TextChanged(object sender, EventArgs e) {
- copiedGroups[rank_list.SelectedIndex].MOTD = rank_txtMOTD.Text;
+ curGroup.MOTD = rank_txtMOTD.Text;
}
void rank_txtPrefix_TextChanged(object sender, EventArgs e) {
- copiedGroups[rank_list.SelectedIndex].Prefix = rank_txtPrefix.Text;
+ curGroup.Prefix = rank_txtPrefix.Text;
}
void rank_cbAfk_CheckedChanged(object sender, EventArgs e) {
- copiedGroups[rank_list.SelectedIndex].AfkKicked = rank_cbAfk.Checked;
+ curGroup.AfkKicked = rank_cbAfk.Checked;
rank_numAfk.Enabled = rank_cbAfk.Checked;
- rank_lblAfk.Enabled = rank_cbAfk.Checked;
}
void rank_numAfk_ValueChanged(object sender, EventArgs e) {
- copiedGroups[rank_list.SelectedIndex].AfkKickMinutes = (int)rank_numAfk.Value;
+ curGroup.AfkKickTime = rank_numAfk.Value;
}
void rank_numDraw_ValueChanged(object sender, EventArgs e) {
- copiedGroups[rank_list.SelectedIndex].DrawLimit = (int)rank_numDraw.Value;
+ curGroup.DrawLimit = (int)rank_numDraw.Value;
}
void rank_numUndo_ValueChanged(object sender, EventArgs e) {
- copiedGroups[rank_list.SelectedIndex].MaxUndo = (int)rank_numUndo.Value;
+ curGroup.MaxUndo = (int)rank_numUndo.Value;
}
void rank_numMaps_ValueChanged(object sender, EventArgs e) {
- copiedGroups[rank_list.SelectedIndex].OverseerMaps = (int)rank_numMaps.Value;
+ curGroup.OverseerMaps = (int)rank_numMaps.Value;
}
void rank_numGen_ValueChanged(object sender, EventArgs e) {
- copiedGroups[rank_list.SelectedIndex].GenVolume = (int)rank_numGen.Value;
+ curGroup.GenVolume = (int)rank_numGen.Value;
}
void rank_numCopy_ValueChanged(object sender, EventArgs e) {
- copiedGroups[rank_list.SelectedIndex].CopySlots = (int)rank_numCopy.Value;
+ curGroup.CopySlots = (int)rank_numCopy.Value;
}
void rank_btnAdd_Click(object sender, EventArgs e) {
diff --git a/GUI/PropertyWindow/PropertyWindow.Security.cs b/GUI/PropertyWindow/PropertyWindow.Security.cs
index d9885f274..e4d3050b8 100644
--- a/GUI/PropertyWindow/PropertyWindow.Security.cs
+++ b/GUI/PropertyWindow/PropertyWindow.Security.cs
@@ -61,22 +61,22 @@ namespace MCGalaxy.Gui {
ServerConfig.ChatSpamCheck = sec_cbChatAuto.Checked;
ServerConfig.ChatSpamCount = (int)sec_numChatMsgs.Value;
- ServerConfig.ChatSpamInterval = (int)sec_numChatSecs.Value;
- ServerConfig.ChatSpamMuteTime = (int)sec_numChatMute.Value;
+ ServerConfig.ChatSpamInterval = sec_numChatSecs.Value;
+ ServerConfig.ChatSpamMuteTime = sec_numChatMute.Value;
ServerConfig.CmdSpamCheck = sec_cbCmdAuto.Checked;
ServerConfig.CmdSpamCount = (int)sec_numCmdMsgs.Value;
- ServerConfig.CmdSpamInterval = (int)sec_numCmdSecs.Value;
- ServerConfig.CmdSpamBlockTime = (int)sec_numCmdMute.Value;
+ ServerConfig.CmdSpamInterval = sec_numCmdSecs.Value;
+ ServerConfig.CmdSpamBlockTime = sec_numCmdMute.Value;
ServerConfig.BlockSpamCheck = sec_cbBlocksAuto.Checked;
ServerConfig.BlockSpamCount = (int)sec_numBlocksMsgs.Value;
- ServerConfig.BlockSpamInterval = (int)sec_numBlocksSecs.Value;
+ ServerConfig.BlockSpamInterval = sec_numBlocksSecs.Value;
ServerConfig.IPSpamCheck = sec_cbIPAuto.Checked;
ServerConfig.IPSpamCount = (int)sec_numIPMsgs.Value;
- ServerConfig.IPSpamInterval = (int)sec_numIPSecs.Value;
- ServerConfig.IPSpamBlockTime = (int)sec_numIPMute.Value;
+ ServerConfig.IPSpamInterval = sec_numIPSecs.Value;
+ ServerConfig.IPSpamBlockTime = sec_numIPMute.Value;
}
diff --git a/MCGalaxy/Commands/CommandParser.cs b/MCGalaxy/Commands/CommandParser.cs
index 1f6358f38..c84526ce3 100644
--- a/MCGalaxy/Commands/CommandParser.cs
+++ b/MCGalaxy/Commands/CommandParser.cs
@@ -170,7 +170,7 @@ namespace MCGalaxy.Commands {
}
block = Block.Parse(p, input);
- if (block == Block.Invalid) p.Message("&cThere is no block \"{0}\".", input);
+ if (block == Block.Invalid) p.Message("%WThere is no block \"{0}\".", input);
return block != Block.Invalid;
}
@@ -185,7 +185,7 @@ namespace MCGalaxy.Commands {
/// Returns whether the player is allowed to place/modify/delete the given block.
/// Outputs information of which ranks can modify the block if not.
public static bool IsBlockAllowed(Player p, string action, BlockID block) {
- if (p.group.Blocks[block]) return true;
+ if (p.group.Blocks[block]) return true;
BlockPerms.Find(block).MessageCannotUse(p, action);
return false;
}
diff --git a/MCGalaxy/Commands/Moderation/CmdBlockSet.cs b/MCGalaxy/Commands/Moderation/CmdBlockSet.cs
index 71beb50c5..59a18deef 100644
--- a/MCGalaxy/Commands/Moderation/CmdBlockSet.cs
+++ b/MCGalaxy/Commands/Moderation/CmdBlockSet.cs
@@ -31,7 +31,7 @@ namespace MCGalaxy.Commands.Moderation {
if (!CommandParser.IsBlockAllowed(p, "change permissions of", block)) return;
BlockPerms perms = BlockPerms.Find(block);
- SetPerms(p, args, perms, "block");
+ SetPerms(p, args, data, perms, "block");
}
protected override void UpdatePerms(ItemPerms perms, Player p, string msg) {
diff --git a/MCGalaxy/Commands/Moderation/CmdCmdSet.cs b/MCGalaxy/Commands/Moderation/CmdCmdSet.cs
index 596ea0144..afafda1ad 100644
--- a/MCGalaxy/Commands/Moderation/CmdCmdSet.cs
+++ b/MCGalaxy/Commands/Moderation/CmdCmdSet.cs
@@ -34,7 +34,7 @@ namespace MCGalaxy.Commands.Moderation {
if (args.Length == 2) {
CommandPerms perms = CommandPerms.Find(cmd.name);
- SetPerms(p, args, perms, "command");
+ SetPerms(p, args, data, perms, "command");
} else {
int num = 0;
if (!CommandParser.GetInt(p, args[2], "Extra permission number", ref num)) return;
@@ -43,7 +43,7 @@ namespace MCGalaxy.Commands.Moderation {
if (perms == null) {
p.Message("This command has no extra permission by that number."); return;
}
- SetPerms(p, args, perms, "extra permission");
+ SetPerms(p, args, data, perms, "extra permission");
}
}
diff --git a/MCGalaxy/Commands/Moderation/CmdHide.cs b/MCGalaxy/Commands/Moderation/CmdHide.cs
index 657fa17ed..9edc1d9bf 100644
--- a/MCGalaxy/Commands/Moderation/CmdHide.cs
+++ b/MCGalaxy/Commands/Moderation/CmdHide.cs
@@ -32,8 +32,7 @@ namespace MCGalaxy.Commands.Moderation {
}
static void AnnounceOps(Player p, string msg) {
- LevelPermission hideRank = p.oHideRank == LevelPermission.Null ? p.Rank : p.oHideRank;
- ItemPerms perms = new ItemPerms(hideRank, null, null);
+ ItemPerms perms = new ItemPerms(p.hideRank, null, null);
Chat.MessageFrom(ChatScope.Perms, p, msg, perms, null, true);
}
@@ -54,6 +53,7 @@ namespace MCGalaxy.Commands.Moderation {
p.hidden = !p.hidden;
if (p.hidden) {
AnnounceOps(p, "To Ops -λNICK%S- is now &finvisible");
+ p.hideRank = data.Rank;
if (!silent) {
string leaveM = "&c- λFULL %S" + PlayerDB.GetLogoutMessage(p);
@@ -64,7 +64,7 @@ namespace MCGalaxy.Commands.Moderation {
Server.hidden.AddIfNotExists(p.name);
} else {
AnnounceOps(p, "To Ops -λNICK%S- is now &fvisible");
- p.oHideRank = LevelPermission.Null;
+ p.hideRank = LevelPermission.Banned;
if (!silent) {
string joinM = "&a+ λFULL %S" + PlayerDB.GetLoginMessage(p);
diff --git a/MCGalaxy/Commands/Moderation/CmdMute.cs b/MCGalaxy/Commands/Moderation/CmdMute.cs
index e15d8bcb4..36763e23f 100644
--- a/MCGalaxy/Commands/Moderation/CmdMute.cs
+++ b/MCGalaxy/Commands/Moderation/CmdMute.cs
@@ -41,7 +41,7 @@ namespace MCGalaxy.Commands.Moderation {
Group group = ModActionCmd.CheckTarget(p, "mute", who.name);
if (group == null) return;
- TimeSpan duration = TimeSpan.FromSeconds(ServerConfig.ChatSpamMuteTime);
+ TimeSpan duration = ServerConfig.ChatSpamMuteTime;
if (args.Length > 1) {
if (!CommandParser.GetTimespan(p, args[1], ref duration, "mute for", "s")) return;
}
diff --git a/MCGalaxy/Commands/Moderation/CmdOhide.cs b/MCGalaxy/Commands/Moderation/CmdOhide.cs
index 6be61b61f..ad3e2993d 100644
--- a/MCGalaxy/Commands/Moderation/CmdOhide.cs
+++ b/MCGalaxy/Commands/Moderation/CmdOhide.cs
@@ -32,11 +32,11 @@ namespace MCGalaxy.Commands.Moderation {
if (!CheckRank(p, who, "hide", false)) return;
bool own = args.Length >= 2 && args[1].CaselessEq("myrank");
- if (own) who.oHideRank = data.Rank;
+ if (!own) data.Rank = who.Rank;
Command.Find("Hide").Use(who, "", data);
- p.Message("Hidden {0} %Sfrom players below {1} rank",
- who.ColoredName, own ? "your" : "their");
+ p.Message("Hidden {0} %Sfrom players ranked below {1}",
+ who.ColoredName, Group.GetColoredName(data.Rank));
}
public override void Help(Player p) {
diff --git a/MCGalaxy/Commands/Moderation/ItemPermsCmd.cs b/MCGalaxy/Commands/Moderation/ItemPermsCmd.cs
index 51c6753b9..803ea8758 100644
--- a/MCGalaxy/Commands/Moderation/ItemPermsCmd.cs
+++ b/MCGalaxy/Commands/Moderation/ItemPermsCmd.cs
@@ -22,9 +22,9 @@ namespace MCGalaxy.Commands.Moderation {
public override string type { get { return CommandTypes.Moderation; } }
public override LevelPermission defaultRank { get { return LevelPermission.Operator; } }
- protected void SetPerms(Player p, string[] args, ItemPerms perms, string type) {
+ protected void SetPerms(Player p, string[] args, CommandData data, ItemPerms perms, string type) {
string grpName = args[1];
- if (!perms.UsableBy(p.Rank)) {
+ if (!perms.UsableBy(data.Rank)) {
p.Message("You rank cannot use this {0}.", type); return;
}
@@ -38,7 +38,7 @@ namespace MCGalaxy.Commands.Moderation {
Group grp = GetGroup(p, grpName.Substring(1));
if (grp == null) return;
- if (p.Rank == grp.Permission) {
+ if (data.Rank == grp.Permission) {
p.Message("You cannot disallow your own rank from using a {0}.", type); return;
}
diff --git a/MCGalaxy/Commands/Moderation/ModActionCmd.cs b/MCGalaxy/Commands/Moderation/ModActionCmd.cs
index 0f90830c7..e0b3bd1ac 100644
--- a/MCGalaxy/Commands/Moderation/ModActionCmd.cs
+++ b/MCGalaxy/Commands/Moderation/ModActionCmd.cs
@@ -98,6 +98,7 @@ namespace MCGalaxy.Commands.Moderation {
who.group = newRank;
who.AllowBuild = who.level.BuildAccess.CheckAllowed(who);
+ if (who.hidden && who.hideRank < who.Rank) who.hideRank = who.Rank;
who.SetPrefix();
who.Send(Packet.UserType(who));
diff --git a/MCGalaxy/Commands/World/CmdLoad.cs b/MCGalaxy/Commands/World/CmdLoad.cs
index c9b95829e..fb6691113 100644
--- a/MCGalaxy/Commands/World/CmdLoad.cs
+++ b/MCGalaxy/Commands/World/CmdLoad.cs
@@ -32,72 +32,7 @@ namespace MCGalaxy.Commands.World {
if (message.Length == 0) { Help(p); return; }
string[] args = message.SplitSpaces();
if (args.Length > 2) { Help(p); return; }
- LoadLevel(p, args[0], false);
- }
-
- public static Level LoadLevel(Player p, string name, bool autoLoaded = false) {
- name = name.ToLower();
- try {
- return LoadLevelCore(p, name, autoLoaded);
- } finally {
- Server.DoGC();
- }
- }
-
- static Level LoadLevelCore(Player p, string name, bool autoLoaded) {
- if (!LevelInfo.MapExists(name)) {
- p.Message("Level \"{0}\" does not exist", name); return null;
- }
-
- Level existing = LevelInfo.FindExact(name);
- if (existing != null) {
- p.Message("Level {0} %Sis already loaded.", existing.ColoredName); return null;
- }
-
- Level lvl = ReadLevel(p, name);
- if (lvl == null || !lvl.CanJoin(p)) return null;
-
- existing = LevelInfo.FindExact(name);
- if (existing != null) {
- p.Message("Level {0} %Sis already loaded.", existing.ColoredName); return null;
- }
-
- LevelInfo.Loaded.Add(lvl);
- OnLevelAddedEvent.Call(lvl);
-
- if (!autoLoaded) {
- string autoloadMsg = "Level " + lvl.ColoredName + " %Sloaded.";
- Chat.Message(ChatScope.All, autoloadMsg, null, Chat.FilterVisible(p));
- }
- return lvl;
- }
-
- static Level ReadLevel(Player p, string name) {
- Level level = Level.Load(name);
- if (level != null) return level;
- if (!File.Exists(LevelInfo.MapPath(name) + ".backup")) {
- p.Message("Backup of {0} does not exist.", name); return null;
- }
-
- Logger.Log(LogType.Warning, "Attempting to load backup map for " + name);
- level = Level.Load(name, LevelInfo.MapPath(name) + ".backup");
- if (level != null) return level;
-
- p.Message("Loading backup failed.");
- string backupPath = LevelInfo.BackupBasePath(name);
-
- if (Directory.Exists(backupPath)) {
- int latest = LevelInfo.LatestBackup(name);
- Logger.Log(LogType.Warning, "Attempting to load latest backup of {0}, number {1} instead.", name, latest);
-
- string path = LevelInfo.BackupFilePath(name, latest.ToString());
- level = Level.Load(name, path);
- if (level == null)
- p.Message("Loading latest backup failed as well.");
- } else {
- p.Message("Latest backup of {0} does not exist.", name);
- }
- return level;
+ LevelActions.Load(p, args[0], true);
}
public override void Help(Player p) {
diff --git a/MCGalaxy/Commands/World/CmdOverseer.SubCommands.cs b/MCGalaxy/Commands/World/CmdOverseer.SubCommands.cs
index b6dae828a..8f7185f73 100644
--- a/MCGalaxy/Commands/World/CmdOverseer.SubCommands.cs
+++ b/MCGalaxy/Commands/World/CmdOverseer.SubCommands.cs
@@ -56,7 +56,7 @@ namespace MCGalaxy.Commands.World {
}
if (LevelInfo.FindExact(map) == null)
- CmdLoad.LoadLevel(p, map, ServerConfig.AutoLoadMaps);
+ LevelActions.Load(p, map, !ServerConfig.AutoLoadMaps);
if (LevelInfo.FindExact(map) != null)
PlayerActions.ChangeMap(p, map);
}
diff --git a/MCGalaxy/Commands/World/CmdRenameLvl.cs b/MCGalaxy/Commands/World/CmdRenameLvl.cs
index f25166c52..4bb49a8f0 100644
--- a/MCGalaxy/Commands/World/CmdRenameLvl.cs
+++ b/MCGalaxy/Commands/World/CmdRenameLvl.cs
@@ -34,22 +34,22 @@ namespace MCGalaxy.Commands.World {
Level lvl = Matcher.FindLevels(p, args[0]);
if (lvl == null) return;
- string newName = args[1].ToLower();
- if (!Formatter.ValidName(p, newName, "level")) return;
+ string newMap = args[1].ToLower();
+ if (!Formatter.ValidName(p, newMap, "level")) return;
- if (LevelInfo.MapExists(newName)) { p.Message("Level already exists."); return; }
+ if (LevelInfo.MapExists(newMap)) { p.Message("Level already exists."); return; }
if (lvl == Server.mainLevel) { p.Message("Cannot rename the main level."); return; }
if (!LevelInfo.ValidateAction(p, data, lvl, "rename this level")) return;
List players = lvl.getPlayers();
lvl.Unload();
- LevelActions.Rename(lvl.name, newName);
- CmdLoad.LoadLevel(p, newName);
- Chat.MessageGlobal("Renamed {0} to {1}", lvl.name, newName);
+ LevelActions.Rename(lvl.name, newMap);
+ LevelActions.Load(p, newMap, true);
+ Chat.MessageGlobal("Renamed {0} to {1}", lvl.name, newMap);
// Move all the old players to the renamed map
foreach (Player pl in players)
- PlayerActions.ChangeMap(pl, newName);
+ PlayerActions.ChangeMap(pl, newMap);
}
public override void Help(Player p) {
diff --git a/MCGalaxy/Config/NumberAttributes.cs b/MCGalaxy/Config/NumberAttributes.cs
index ff28262fc..2002c3ac6 100644
--- a/MCGalaxy/Config/NumberAttributes.cs
+++ b/MCGalaxy/Config/NumberAttributes.cs
@@ -44,7 +44,7 @@ namespace MCGalaxy.Config {
}
return value;
}
- }
+ }
// Hacky workaround for old ExponentialFog attribute
public sealed class ConfigBoolIntAttribute : ConfigIntAttribute {
@@ -78,7 +78,7 @@ namespace MCGalaxy.Config {
public class ConfigRealAttribute : ConfigAttribute {
float defValue, minValue, maxValue;
- public ConfigRealAttribute(string name, string section, float def,
+ public ConfigRealAttribute(string name, string section, float def,
float min = float.NegativeInfinity, float max = float.PositiveInfinity)
: base(name, section) { defValue = def; minValue = min; maxValue = max; }
@@ -102,17 +102,23 @@ namespace MCGalaxy.Config {
}
public class ConfigTimespanAttribute : ConfigRealAttribute {
- public ConfigTimespanAttribute(string name, string section, float def)
- : base(name, section, def, 0) { }
+ bool mins;
+ public ConfigTimespanAttribute(string name, string section, float def, bool mins)
+ : base(name, section, def, 0) { this.mins = mins; }
public override object Parse(string raw) {
float value = (float)base.Parse(raw);
- return TimeSpan.FromMinutes(value);
+ if (mins) {
+ return TimeSpan.FromMinutes(value);
+ } else {
+ return TimeSpan.FromSeconds(value);
+ }
}
public override string Serialise(object value) {
TimeSpan span = (TimeSpan)value;
- return span.TotalMinutes.ToString();
+ double time = mins ? span.TotalMinutes : span.TotalSeconds;
+ return time.ToString();
}
}
}
diff --git a/MCGalaxy/Config/ServerProperties.cs b/MCGalaxy/Config/ServerProperties.cs
index 7eed87601..511d82adb 100644
--- a/MCGalaxy/Config/ServerProperties.cs
+++ b/MCGalaxy/Config/ServerProperties.cs
@@ -142,7 +142,7 @@ namespace MCGalaxy {
static void SetOldAfkKick() {
foreach (Group grp in Group.GroupList) {
- grp.AfkKickMinutes = old.afkKickMins;
+ grp.AfkKickTime = TimeSpan.FromMinutes(old.afkKickMins);
// 0 minutes had the special meaning of 'not AFK kicked'
grp.AfkKicked = old.afkKickMins > 0 && grp.Permission < old.afkKickMax;
}
diff --git a/MCGalaxy/CorePlugin/IPThrottler.cs b/MCGalaxy/CorePlugin/IPThrottler.cs
index 8ad779465..ff7530696 100644
--- a/MCGalaxy/CorePlugin/IPThrottler.cs
+++ b/MCGalaxy/CorePlugin/IPThrottler.cs
@@ -41,7 +41,7 @@ namespace MCGalaxy.Core {
if (blockedUntil < now) {
if (!entry.AddSpamEntry(ServerConfig.IPSpamCount, ServerConfig.IPSpamInterval)) {
- entry.BlockedUntil = now.AddSeconds(ServerConfig.IPSpamBlockTime);
+ entry.BlockedUntil = now.Add(ServerConfig.IPSpamBlockTime);
}
return true;
}
@@ -62,7 +62,7 @@ namespace MCGalaxy.Core {
if (!ServerConfig.IPSpamCheck) { ips.Clear(); return; }
// Find all connections which last joined before the connection spam check interval
- DateTime threshold = DateTime.UtcNow.AddSeconds(-ServerConfig.IPSpamInterval);
+ DateTime threshold = DateTime.UtcNow.Add(-ServerConfig.IPSpamInterval);
List expired = null;
foreach (var kvp in ips) {
DateTime lastJoin = kvp.Value[kvp.Value.Count - 1];
diff --git a/MCGalaxy/Economy/LevelItem.cs b/MCGalaxy/Economy/LevelItem.cs
index 9ddee49a9..60ec1d964 100644
--- a/MCGalaxy/Economy/LevelItem.cs
+++ b/MCGalaxy/Economy/LevelItem.cs
@@ -86,8 +86,7 @@ namespace MCGalaxy.Eco {
p.Message("&aCreating level: '&f" + name + "&a' . . .");
UseCommand(p, "NewLvl", name + " " + preset.x + " " + preset.y + " " + preset.z + " " + preset.type);
- CmdLoad.LoadLevel(Player.Console, name);
- Level level = LevelInfo.FindExact(name);
+ Level level = LevelActions.Load(Player.Console, name, true);
CmdOverseer.SetPerms(p, level);
Level.SaveSettings(level);
PlayerActions.ChangeMap(p, name);
diff --git a/MCGalaxy/Entity/Entities.cs b/MCGalaxy/Entity/Entities.cs
index 1c22f9555..3d2bf2a0a 100644
--- a/MCGalaxy/Entity/Entities.cs
+++ b/MCGalaxy/Entity/Entities.cs
@@ -173,10 +173,8 @@ namespace MCGalaxy {
/// Returns whether the given player is able to see the target player (e.g. in /who).
public static bool CanSee(Player p, Player target) {
- if (p == null || target == null || !target.hidden || p == target) return true;
-
- if (target.oHideRank != LevelPermission.Null) return p.Rank >= target.oHideRank;
- return p.Rank >= target.Rank;
+ if (p == null || target == null || !target.hidden || p == target) return true;
+ return p.Rank >= target.hideRank;
}
public static void UpdateModel(Entity entity, string model) {
diff --git a/MCGalaxy/Games/LavaSurvival/LSConfig.cs b/MCGalaxy/Games/LavaSurvival/LSConfig.cs
index 0ea7f6cc8..6ed3ca5e6 100644
--- a/MCGalaxy/Games/LavaSurvival/LSConfig.cs
+++ b/MCGalaxy/Games/LavaSurvival/LSConfig.cs
@@ -52,11 +52,11 @@ namespace MCGalaxy.Games {
[ConfigInt("layer-count", null, 10, 0)]
public int LayerCount = 10;
- [ConfigTimespan("layer-interval", null, 2)]
+ [ConfigTimespan("layer-interval", null, 2, true)]
public TimeSpan LayerInterval = TimeSpan.FromMinutes(2);
- [ConfigTimespan("round-time", null, 15)]
+ [ConfigTimespan("round-time", null, 15, true)]
public TimeSpan RoundTime = TimeSpan.FromMinutes(15);
- [ConfigTimespan("flood-time", null, 5)]
+ [ConfigTimespan("flood-time", null, 5, true)]
public TimeSpan FloodTime = TimeSpan.FromMinutes(5);
[ConfigVec3("block-flood", null)] public Vec3U16 FloodPos;
diff --git a/MCGalaxy/Games/MovementCheck.cs b/MCGalaxy/Games/MovementCheck.cs
index 730161ec1..e1309f5fa 100644
--- a/MCGalaxy/Games/MovementCheck.cs
+++ b/MCGalaxy/Games/MovementCheck.cs
@@ -26,11 +26,11 @@ namespace MCGalaxy.Games {
int dz = Math.Abs(a.Pos.Z - b.Pos.Z);
return dx <= dist && dy <= dist && dz <= dist;
}
+ static TimeSpan interval = TimeSpan.FromSeconds(5);
public static bool DetectNoclip(Player p, Position newPos) {
if (p.Game.Referee || Hacks.CanUseNoclip(p, p.level)) return false;
- if (!p.CheckIfInsideBlock() || p.Game.NoclipLog.AddSpamEntry(5, 1))
- return false;
+ if (!p.IsInsideBlock() || p.Game.NoclipLog.AddSpamEntry(5, interval)) return false;
Warn(ref p.Game.LastNoclipWarn, p, "noclip");
return false;
@@ -42,7 +42,7 @@ namespace MCGalaxy.Games {
int maxMove = (int)(moveDist * 32);
bool speedhacking = dx >= maxMove || dz >= maxMove;
- if (!speedhacking || p.Game.SpeedhackLog.AddSpamEntry(5, 1)) return false;
+ if (!speedhacking || p.Game.SpeedhackLog.AddSpamEntry(5, interval)) return false;
Warn(ref p.Game.LastSpeedhackWarn, p, "speedhack");
p.SendPos(Entities.SelfID, p.Pos, p.Rot);
diff --git a/MCGalaxy/Games/RoundsGame/RoundsGame.cs b/MCGalaxy/Games/RoundsGame/RoundsGame.cs
index 2ec4e1ef7..ae470f1bb 100644
--- a/MCGalaxy/Games/RoundsGame/RoundsGame.cs
+++ b/MCGalaxy/Games/RoundsGame/RoundsGame.cs
@@ -110,7 +110,7 @@ namespace MCGalaxy.Games {
protected virtual bool SetMap(string map) {
Picker.QueuedMap = null;
Level next = LevelInfo.FindExact(map);
- if (next == null) next = CmdLoad.LoadLevel(Player.Console, map);
+ if (next == null) next = LevelActions.Load(Player.Console, map, false);
if (next == null) return false;
Map = next;
diff --git a/MCGalaxy/Games/ZombieSurvival/ZSGame.Round.cs b/MCGalaxy/Games/ZombieSurvival/ZSGame.Round.cs
index 3cafd3542..d905de4f2 100644
--- a/MCGalaxy/Games/ZombieSurvival/ZSGame.Round.cs
+++ b/MCGalaxy/Games/ZombieSurvival/ZSGame.Round.cs
@@ -313,7 +313,7 @@ namespace MCGalaxy.Games {
}
static int GetMoneyReward(Player pl, ZSData data, Player[] alive, Random rand) {
- if (pl.CheckIfInsideBlock()) return -1;
+ if (pl.IsInsideBlock()) return -1;
if (alive.Length == 0) {
return rand.Next(1 + data.CurrentInfected, 5 + data.CurrentInfected);
diff --git a/MCGalaxy/Levels/LevelActions.cs b/MCGalaxy/Levels/LevelActions.cs
index d0340cc09..05d5a404f 100644
--- a/MCGalaxy/Levels/LevelActions.cs
+++ b/MCGalaxy/Levels/LevelActions.cs
@@ -20,6 +20,7 @@ using System.IO;
using MCGalaxy.Blocks;
using MCGalaxy.Bots;
using MCGalaxy.DB;
+using MCGalaxy.Events.LevelEvents;
using MCGalaxy.SQL;
using MCGalaxy.Util;
@@ -264,5 +265,65 @@ namespace MCGalaxy {
return false;
}
}
+
+
+ public static Level Load(Player p, string map, bool announce) {
+ map = map.ToLower();
+ if (!LevelInfo.MapExists(map)) {
+ p.Message("Level \"{0}\" does not exist", map); return null;
+ }
+
+ Level cur = LevelInfo.FindExact(map);
+ if (cur != null) {
+ p.Message("%WLevel {0} %Wis already loaded.", cur.ColoredName); return null;
+ }
+
+ try {
+ Level lvl = ReadLevel(p, map);
+ if (lvl == null || !lvl.CanJoin(p)) return null;
+
+ cur = LevelInfo.FindExact(map);
+ if (cur != null) {
+ p.Message("%WLevel {0} %Wis already loaded.", cur.ColoredName); return null;
+ }
+
+ LevelInfo.Add(lvl);
+ if (!announce) return lvl;
+
+ string autoloadMsg = "Level " + lvl.ColoredName + " %Sloaded.";
+ Chat.Message(ChatScope.All, autoloadMsg, null, Chat.FilterVisible(p));
+ return lvl;
+ } finally {
+ Server.DoGC();
+ }
+ }
+
+ static Level ReadLevel(Player p, string map) {
+ Level lvl = Level.Load(map);
+ if (lvl != null) return lvl;
+
+ string path = LevelInfo.MapPath(map) + ".backup";
+ if (!File.Exists(path)) {
+ p.Message("%WBackup of {0} does not exist.", map); return null;
+ }
+ Logger.Log(LogType.Warning, "Attempting to load backup map for " + map);
+
+ lvl = Level.Load(map, path);
+ if (lvl != null) return lvl;
+ p.Message("%WLoading backup of {0} failed too.", map);
+
+ string backupDir = LevelInfo.BackupBasePath(map);
+ if (Directory.Exists(backupDir)) {
+ int latest = LevelInfo.LatestBackup(map);
+ Logger.Log(LogType.Warning, "Attempting to load latest backup ({1}) of {0} instead", map, latest);
+
+ path = LevelInfo.BackupFilePath(map, latest.ToString());
+ lvl = Level.Load(map, path);
+ if (lvl == null) p.Message("%WLoading latest backup failed too.");
+ } else {
+ p.Message("%WLatest backup of {0} does not exist.", map);
+ }
+ return lvl;
+ }
}
}
diff --git a/MCGalaxy/Levels/LevelConfig.cs b/MCGalaxy/Levels/LevelConfig.cs
index cd8169555..1af33174a 100644
--- a/MCGalaxy/Levels/LevelConfig.cs
+++ b/MCGalaxy/Levels/LevelConfig.cs
@@ -249,9 +249,9 @@ namespace MCGalaxy {
[ConfigEnum("BuildType", "Game", BuildType.Normal, typeof(BuildType))]
public BuildType BuildType = BuildType.Normal;
- [ConfigTimespan("MinRoundTime", "Game", 4)]
+ [ConfigTimespan("MinRoundTime", "Game", 4, true)]
public TimeSpan MinRoundTime = TimeSpan.FromMinutes(4);
- [ConfigTimespan("MaxRoundTime", "Game", 7)]
+ [ConfigTimespan("MaxRoundTime", "Game", 7, true)]
public TimeSpan MaxRoundTime = TimeSpan.FromMinutes(7);
[ConfigBool("DrawingAllowed", "Game", true)]
public bool Drawing = true;
diff --git a/MCGalaxy/Player/Group/Group.cs b/MCGalaxy/Player/Group/Group.cs
index 7652b1db5..c6d433e34 100644
--- a/MCGalaxy/Player/Group/Group.cs
+++ b/MCGalaxy/Player/Group/Group.cs
@@ -59,8 +59,8 @@ namespace MCGalaxy {
public int OverseerMaps = 3;
[ConfigBool("AfkKicked", null, true)]
public bool AfkKicked = true;
- [ConfigInt("AfkKickMinutes", null, 45, 0)]
- public int AfkKickMinutes = 45;
+ [ConfigTimespan("AfkKickMinutes", null, 45, true)]
+ public TimeSpan AfkKickTime = TimeSpan.FromMinutes(45);
[ConfigString("Prefix", null, "", true)]
public string Prefix = "";
[ConfigInt("CopySlots", null, 0, 0)]
@@ -113,7 +113,7 @@ namespace MCGalaxy {
copy.Name = Name; copy.Color = Color; copy.Permission = Permission;
copy.DrawLimit = DrawLimit; copy.MaxUndo = MaxUndo; copy.MOTD = MOTD;
copy.GenVolume = GenVolume; copy.OverseerMaps = OverseerMaps;
- copy.AfkKicked = AfkKicked; copy.AfkKickMinutes = AfkKickMinutes;
+ copy.AfkKicked = AfkKicked; copy.AfkKickTime = AfkKickTime;
copy.Prefix = Prefix; copy.CopySlots = CopySlots; copy.filename = filename;
return copy;
}
diff --git a/MCGalaxy/Player/Player.Fields.cs b/MCGalaxy/Player/Player.Fields.cs
index db111eaef..fe30df8d7 100644
--- a/MCGalaxy/Player/Player.Fields.cs
+++ b/MCGalaxy/Player/Player.Fields.cs
@@ -60,7 +60,7 @@ namespace MCGalaxy {
public string ip;
public string color;
public Group group;
- public LevelPermission oHideRank = LevelPermission.Null;
+ public LevelPermission hideRank = LevelPermission.Banned;
public bool hidden;
public bool painting;
public bool muted;
diff --git a/MCGalaxy/Player/Player.cs b/MCGalaxy/Player/Player.cs
index d75b1c0d5..70023b0fd 100644
--- a/MCGalaxy/Player/Player.cs
+++ b/MCGalaxy/Player/Player.cs
@@ -100,10 +100,7 @@ namespace MCGalaxy {
// hidden via /hide or /ohide
// TODO: Just use Entities.CanSee
- if (target.hidden) {
- if (target.oHideRank != LevelPermission.Null) return Rank >= target.oHideRank;
- return Rank >= target.Rank;
- }
+ if (target.hidden) return Rank >= target.hideRank;
if (!ZSGame.Instance.Running || Game.Referee) return true;
ZSData data = ZSGame.TryGet(target);
@@ -138,7 +135,7 @@ namespace MCGalaxy {
return color + "[" + titleCol + title + color + "] ";
}
- public bool CheckIfInsideBlock() {
+ public bool IsInsideBlock() {
AABB bb = ModelBB.OffsetPosition(Pos);
return AABB.IntersectsSolidBlocks(bb, level);
}
diff --git a/MCGalaxy/Player/PlayerActions.cs b/MCGalaxy/Player/PlayerActions.cs
index 2b5b571e2..25471db85 100644
--- a/MCGalaxy/Player/PlayerActions.cs
+++ b/MCGalaxy/Player/PlayerActions.cs
@@ -86,7 +86,7 @@ namespace MCGalaxy {
bool ignorePerms = p.summonedMap != null && p.summonedMap.CaselessEq(name);
if (!visitAccess.CheckDetailed(p, ignorePerms)) return false;
- CmdLoad.LoadLevel(p, name, true);
+ LevelActions.Load(p, name, false);
Level lvl = LevelInfo.FindExact(name);
if (lvl != null) return GotoLevel(p, lvl);
diff --git a/MCGalaxy/Player/SpamChecker.cs b/MCGalaxy/Player/SpamChecker.cs
index 2f964e057..94fd7b892 100644
--- a/MCGalaxy/Player/SpamChecker.cs
+++ b/MCGalaxy/Player/SpamChecker.cs
@@ -62,7 +62,7 @@ namespace MCGalaxy {
if (chatLog.AddSpamEntry(ServerConfig.ChatSpamCount, ServerConfig.ChatSpamInterval))
return false;
- TimeSpan duration = TimeSpan.FromSeconds(ServerConfig.ChatSpamMuteTime);
+ TimeSpan duration = ServerConfig.ChatSpamMuteTime;
ModAction action = new ModAction(p.name, Player.Console, ModActionType.Muted, "&0Auto mute for spamming", duration);
OnModActionEvent.Call(action);
return true;
@@ -76,9 +76,10 @@ namespace MCGalaxy {
if (cmdLog.AddSpamEntry(ServerConfig.CmdSpamCount, ServerConfig.CmdSpamInterval))
return false;
- p.Message("You have been blocked from using commands for " +
- ServerConfig.CmdSpamBlockTime + " seconds due to spamming");
- p.cmdUnblocked = DateTime.UtcNow.AddSeconds(ServerConfig.CmdSpamBlockTime);
+ string blockTime = ServerConfig.CmdSpamBlockTime.Shorten(true, true);
+ p.Message("You have been blocked from using commands for "
+ + blockTime + " due to spamming");
+ p.cmdUnblocked = DateTime.UtcNow.Add(ServerConfig.CmdSpamBlockTime);
return true;
}
}
diff --git a/MCGalaxy/Server/Server.Init.cs b/MCGalaxy/Server/Server.Init.cs
index b0ba9b47a..fdd7fc3e8 100644
--- a/MCGalaxy/Server/Server.Init.cs
+++ b/MCGalaxy/Server/Server.Init.cs
@@ -32,11 +32,9 @@ namespace MCGalaxy {
static void LoadMainLevel(SchedulerTask task) {
try {
- mainLevel = CmdLoad.LoadLevel(Player.Console, ServerConfig.MainLevel);
- if (mainLevel == null) GenerateMain();
-
+ mainLevel = LevelActions.Load(Player.Console, ServerConfig.MainLevel, false);
+ if (mainLevel == null) GenerateMain();
mainLevel.Config.AutoUnload = false;
- LevelInfo.Add(mainLevel);
} catch (Exception ex) {
Logger.LogError("Error loading main level", ex);
}
@@ -45,8 +43,10 @@ namespace MCGalaxy {
static void GenerateMain() {
Logger.Log(LogType.SystemActivity, "main level not found, generating..");
mainLevel = new Level(ServerConfig.MainLevel, 128, 64, 128);
+
MapGen.Generate(mainLevel, "flat", "", null);
mainLevel.Save();
+ LevelInfo.Add(mainLevel);
}
static void LoadPlayerLists(SchedulerTask task) {
@@ -88,7 +88,7 @@ namespace MCGalaxy {
foreach (string map in maps) {
if (map.CaselessEq(ServerConfig.MainLevel)) continue;
- CmdLoad.LoadLevel(Player.Console, map);
+ LevelActions.Load(Player.Console, map, false);
}
}
diff --git a/MCGalaxy/Server/Server.cs b/MCGalaxy/Server/Server.cs
index a880fb40d..6f6ee10fb 100644
--- a/MCGalaxy/Server/Server.cs
+++ b/MCGalaxy/Server/Server.cs
@@ -295,7 +295,7 @@ namespace MCGalaxy {
Level lvl = LevelInfo.FindExact(mapName);
if (lvl == null)
- lvl = CmdLoad.LoadLevel(Player.Console, mapName);
+ lvl = LevelActions.Load(Player.Console, mapName, false);
if (lvl == null) return false;
SetMainLevel(lvl); return true;
diff --git a/MCGalaxy/Server/ServerConfig.cs b/MCGalaxy/Server/ServerConfig.cs
index bde9166ce..c16f45043 100644
--- a/MCGalaxy/Server/ServerConfig.cs
+++ b/MCGalaxy/Server/ServerConfig.cs
@@ -94,8 +94,8 @@ namespace MCGalaxy {
[ConfigString("backup-location", "Backup", "")]
public static string BackupDirectory = Path.Combine(Utils.FolderPath, "levels/backups");
- [ConfigInt("afk-minutes", "Other", 10)]
- public static int AutoAfkMins = 10;
+ [ConfigTimespan("afk-minutes", "Other", 10, true)]
+ public static TimeSpan AutoAfkTime = TimeSpan.FromMinutes(10);
[ConfigString("default-rank", "General", "guest")]
public static string DefaultRankName = "guest";
@@ -242,34 +242,34 @@ namespace MCGalaxy {
public static bool ChatSpamCheck = false;
[ConfigInt("spam-messages", "Spam control", 8, 0, 10000)]
public static int ChatSpamCount = 8;
- [ConfigInt("spam-mute-time", "Spam control", 60, 0, 1000000)]
- public static int ChatSpamMuteTime = 60;
- [ConfigInt("spam-counter-reset-time", "Spam control", 5, 0, 10000)]
- public static int ChatSpamInterval = 5;
+ [ConfigTimespan("spam-mute-time", "Spam control", 60, false)]
+ public static TimeSpan ChatSpamMuteTime = TimeSpan.FromSeconds(60);
+ [ConfigTimespan("spam-counter-reset-time", "Spam control", 5, false)]
+ public static TimeSpan ChatSpamInterval = TimeSpan.FromSeconds(5);
[ConfigBool("cmd-spam-check", "Spam control", true)]
public static bool CmdSpamCheck = true;
[ConfigInt("cmd-spam-count", "Spam control", 25, 0, 10000)]
public static int CmdSpamCount = 25;
- [ConfigInt("cmd-spam-block-time", "Spam control", 30, 0, 1000000)]
- public static int CmdSpamBlockTime = 30;
- [ConfigInt("cmd-spam-interval", "Spam control", 1, 0, 10000)]
- public static int CmdSpamInterval = 1;
+ [ConfigTimespan("cmd-spam-block-time", "Spam control", 30, false)]
+ public static TimeSpan CmdSpamBlockTime = TimeSpan.FromSeconds(30);
+ [ConfigTimespan("cmd-spam-interval", "Spam control", 1, false)]
+ public static TimeSpan CmdSpamInterval = TimeSpan.FromSeconds(1);
[ConfigBool("block-spam-check", "Spam control", true)]
public static bool BlockSpamCheck = true;
[ConfigInt("block-spam-count", "Spam control", 200, 0, 10000)]
public static int BlockSpamCount = 200;
- [ConfigInt("block-spam-interval", "Spam control", 5, 0, 10000)]
- public static int BlockSpamInterval = 5;
+ [ConfigTimespan("block-spam-interval", "Spam control", 5, false)]
+ public static TimeSpan BlockSpamInterval = TimeSpan.FromSeconds(5);
[ConfigBool("ip-spam-check", "Spam control", true)]
public static bool IPSpamCheck = true;
[ConfigInt("ip-spam-count", "Spam control", 25, 0, 10000)]
public static int IPSpamCount = 10;
- [ConfigInt("ip-spam-block-time", "Spam control", 30, 0, 1000000)]
- public static int IPSpamBlockTime = 180;
- [ConfigInt("ip-spam-interval", "Spam control", 1, 0, 10000)]
- public static int IPSpamInterval = 60;
+ [ConfigTimespan("ip-spam-block-time", "Spam control", 180, false)]
+ public static TimeSpan IPSpamBlockTime = TimeSpan.FromSeconds(180);
+ [ConfigTimespan("ip-spam-interval", "Spam control", 60, false)]
+ public static TimeSpan IPSpamInterval = TimeSpan.FromSeconds(60);
}
}
\ No newline at end of file
diff --git a/MCGalaxy/Server/Tasks/ServerTasks.cs b/MCGalaxy/Server/Tasks/ServerTasks.cs
index d666723ab..73d3089a1 100644
--- a/MCGalaxy/Server/Tasks/ServerTasks.cs
+++ b/MCGalaxy/Server/Tasks/ServerTasks.cs
@@ -100,20 +100,22 @@ namespace MCGalaxy.Tasks {
p.Send(Packet.Ping());
}
- if (ServerConfig.AutoAfkMins <= 0) return;
+ if (ServerConfig.AutoAfkTime.Ticks <= 0) return;
if (DateTime.UtcNow < p.AFKCooldown) return;
if (p.IsAfk) {
- int time = p.group.AfkKickMinutes;
- if (p.AutoAfk) time += ServerConfig.AutoAfkMins;
+ TimeSpan time = p.group.AfkKickTime;
+ if (p.AutoAfk) time += ServerConfig.AutoAfkTime;
- if (p.group.AfkKicked && p.LastAction.AddMinutes(time) < DateTime.UtcNow) {
- p.Leave("Auto-kick, AFK for " + p.group.AfkKickMinutes + " minutes");
+ if (p.group.AfkKicked && p.LastAction.Add(time) < DateTime.UtcNow) {
+ string afkTime = p.group.AfkKickTime.Shorten(true, true);
+ p.Leave("Auto-kick, AFK for " + afkTime);
}
} else {
DateTime lastAction = p.LastAction;
- if (lastAction.AddMinutes(ServerConfig.AutoAfkMins) < DateTime.UtcNow) {
- CmdAfk.ToggleAfk(p, "auto: Not moved for " + ServerConfig.AutoAfkMins + " minutes");
+ if (lastAction.Add(ServerConfig.AutoAfkTime) < DateTime.UtcNow) {
+ string afkTime = ServerConfig.AutoAfkTime.Shorten(true, true);
+ CmdAfk.ToggleAfk(p, "auto: Not moved for " + afkTime);
p.AutoAfk = true;
p.LastAction = lastAction;
}
diff --git a/MCGalaxy/util/Extensions/DateExts.cs b/MCGalaxy/util/Extensions/DateExts.cs
index fac1283b2..b722d37e9 100644
--- a/MCGalaxy/util/Extensions/DateExts.cs
+++ b/MCGalaxy/util/Extensions/DateExts.cs
@@ -37,7 +37,7 @@ namespace MCGalaxy {
return (long)(time.ToUniversalTime() - UnixEpoch).TotalSeconds;
}
- public static bool AddSpamEntry(this List log, int maxEntries, int checkInterval) {
+ public static bool AddSpamEntry(this List log, int maxEntries, TimeSpan checkInterval) {
DateTime now = DateTime.UtcNow;
if (log.Count > 0 && log.Count >= maxEntries)
log.RemoveAt(0);
@@ -45,7 +45,7 @@ namespace MCGalaxy {
if (log.Count < maxEntries) return true;
TimeSpan oldestDelta = now - log[0];
- return oldestDelta.TotalSeconds > checkInterval;
+ return oldestDelta > checkInterval;
}
}
}
diff --git a/MCGalaxy/util/Extensions/TimeExts.cs b/MCGalaxy/util/Extensions/TimeExts.cs
index 801476772..895f6dabf 100644
--- a/MCGalaxy/util/Extensions/TimeExts.cs
+++ b/MCGalaxy/util/Extensions/TimeExts.cs
@@ -35,6 +35,10 @@ namespace MCGalaxy {
if (time.Length == 0) time = seconds ? "0s" : "0m";
return negate ? "-" + time : time;
}
+
+ public static long SecondsLong(this TimeSpan value) {
+ return value.Ticks / TimeSpan.TicksPerSecond;
+ }
static void Add(ref string time, int amount, char suffix, bool spaces) {
if (amount == 0) return;