Skip to content
This repository has been archived by the owner on Apr 17, 2021. It is now read-only.

Commit

Permalink
Time command modifications
Browse files Browse the repository at this point in the history
  • Loading branch information
DeathCradle committed Mar 4, 2015
1 parent 9f215a6 commit af0c7e3
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 29 deletions.
89 changes: 89 additions & 0 deletions tdsm-api/Command/ArgumentList.cs
Expand Up @@ -309,6 +309,21 @@ bool TryParseAt<T>(int at, out T t)
}
return false;
}
else if (typeof(T) == typeof(WorldTime))
{
var val = WorldTime.Parse(this[at]);
if (val != null)
{
var gt = val.Value.GameTime;
if (gt >= 0 && gt <= 54000.0)
{
t = (T)(object)val.Value;
return true;
}
else throw new CommandError("Time must be between 4:30am and 7:30pm");
}
return false;
}

throw new CommandError("Internal command error, type is unsupported by parser: {0}.", typeof(T).ToString());
}
Expand Down Expand Up @@ -570,4 +585,78 @@ public bool TryPopAny<T>(string literal, out T t)
return false;
}
}

public struct WorldTime
{
public byte Hour { get; set; }
public byte Minute { get; set; }
public bool AM { get; set; }

public double GameTime
{
get
{
var time = ((this.Hour * 60.0 * 60.0) + (this.Minute * 60.0));
time -= 4.5 * 60.0 * 60.0; //Time start at 4:30 am

if (!this.AM)
time += 12.0 * 60.0 * 60.0;

return time;
}
}

/// <summary>
/// Parses time in the format of HH:mm[am|pm]
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static WorldTime? Parse(string input)
{
var split = input.Split(':');
if (split.Length == 2)
{
byte hour, minute;
if (Byte.TryParse(split[0], out hour) && split[1].Length > 2)
{
if (Byte.TryParse(split[1].Substring(0, split[1].Length - 2), out minute))
{
var tk = split[1].Remove(0, split[1].Length - 2);

return new WorldTime()
{
Hour = hour,
Minute = minute,
AM = tk.ToLower() == "am"
};
}
}
}
return null;
}

public static WorldTime? Parse(double time)
{
time += 4.5 * 60.0 * 60.0; //Push back up to real time

var daytime = 12.0 * 60.0 * 60.0;
var am = time < daytime;
if (!am) time -= daytime;

var hour = (int)(time / 60.0 / 60.0);
var min = (int)((time - (hour * 60.0 * 60.0)) / 60.0);

return new WorldTime()
{
Hour = (byte)hour,
Minute = (byte)min,
AM = am
};
}

public override string ToString()
{
return String.Format("{0}:{1} {2}", Hour, Minute, AM ? "AM" : "PM");
}
}
}
2 changes: 1 addition & 1 deletion tdsm-api/Command/ISender.cs
Expand Up @@ -8,7 +8,7 @@ public interface ISender
{
bool Op { get; set; }
string SenderName { get; }
void SendMessage(string Message, int sender = 255, float R = 255f, float G = 0f, float B = 0f);
void SendMessage(string message, int sender = 255, float R = 255f, float G = 0f, float B = 0f);

Dictionary<string, CommandInfo> GetAvailableCommands();
}
Expand Down
45 changes: 19 additions & 26 deletions tdsm-core/Command/Commands.cs
Expand Up @@ -409,11 +409,23 @@ public void SaveAll(ISender sender, ArgumentList args)
public void Time(ISender sender, ArgumentList args)
{
double time;
bool day;
if (args.TryParseTwo<Double, Boolean>("-set", out time, "-day", out day))
WorldTime text;
if (args.TryParseOne<Double>("-set", out time) || args.TryParseOne<Double>("set", out time))
{
if (time >= 0 && time <= 54000.0)
{
//var day = args.TryPop("-day");
var day = time >= 32400.0 && time <= 54000.0;
World.SetTime(time, day);
}
else sender.SendMessage("Invalid time specified, must be from 0 to 54000");
}
else if (args.TryParseOne<WorldTime>("-set", out text) || args.TryParseOne<WorldTime>("set", out text))
{
time = text.GameTime;
var day = time >= 32400.0 && time <= 54000.0;
World.SetTime(time, day);
else if (args.TryParseOne<Double>("-set", out time)) //Support for old
World.SetTime(time, true);
}
else
{
string caseType = args.GetString(0);
Expand Down Expand Up @@ -445,31 +457,12 @@ public void Time(ISender sender, ArgumentList args)
break;
}
case "?":
case "now":
case "-now":
{
var amPm = "AM";
var value = Main.time;
if (!Main.dayTime)
value += 54000.0;

value /= 86400.0 * 24.0;
value -= 7.5 - 12.0;

if (value < 0.0) value += 24.0;
if (value >= 12.0) amPm = "PM";

var hour = (int)value;
var min = (int)(value - (double)hour) * 60.0;
var minute = min.ToString();

if (min < 10.0)
minute = "0" + minute;
if (hour > 12)
hour -= 12;
if (hour == 0)
hour = 12;
var tm = WorldTime.Parse(Main.time);

sender.Message("Current time: " + hour + ":" + minute + " " + amPm);
sender.Message("Current time: " + tm.ToString());
return;
}
default:
Expand Down
5 changes: 3 additions & 2 deletions tdsm-core/Entry.cs
Expand Up @@ -105,8 +105,9 @@ protected override void Initialized(object state)
AddCommand("time")
.WithDescription("Change the time of day")
.WithAccessLevel(AccessLevel.OP)
.WithHelpText("-set <time> -day <true|false>")
.WithHelpText("-now")
.WithHelpText("set <numeric time>")
.WithHelpText("set 5:10am")
.WithHelpText("now|?")
.WithHelpText("day|dawn|dusk|noon|night")
.WithPermissionNode("tdsm.time")
.Calls(this.Time);
Expand Down

0 comments on commit af0c7e3

Please sign in to comment.