Skip to content
This repository has been archived by the owner on Sep 24, 2019. It is now read-only.

Commit

Permalink
Implement groups for flags
Browse files Browse the repository at this point in the history
  • Loading branch information
Trojaner committed Jul 29, 2015
1 parent b0c88a3 commit 46293c1
Show file tree
Hide file tree
Showing 14 changed files with 161 additions and 34 deletions.
23 changes: 14 additions & 9 deletions Rocket_Safezone/Commands/FlagCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Rocket.API;
using Rocket.Unturned.Chat;
using Rocket.Unturned.Commands;
using Safezone.Model;
using Safezone.Model.Flag;
using Safezone.Model.Safezone;
using Safezone.Util;
Expand Down Expand Up @@ -45,7 +46,7 @@ public void Execute(IRocketPlayer caller, string[] command)
return;
}
bool hasFlagPermission = PermissionUtil.HasPermission(caller, "flag." + flagName);
String usage = "Usage: /sflag " + name + " " + f.Name + " " + f.Usage;
String usage = "Usage: /sflag " + name + " " + f.Name + " " + f.Usage + " [group]";
if (command.Length == 2)
{
String description = f.Description;
Expand All @@ -56,10 +57,10 @@ public void Execute(IRocketPlayer caller, string[] command)
UnturnedChat.Say(caller, "Description: " + description, Color.blue);
if (hasFlagPermission)
{
UnturnedChat.Say(caller, "Usage: " + usage);
UnturnedChat.Say(caller, usage);
UnturnedChat.Say(caller, "Value: " + value, Color.blue);
}
UnturnedChat.Say(caller, "Default: " + defaultValue, Color.blue);
UnturnedChat.Say(caller, "Default Value: " + defaultValue, Color.blue);
return;
}

Expand All @@ -69,18 +70,22 @@ public void Execute(IRocketPlayer caller, string[] command)
return;
}

List<String> argsList = new List<string>();
for (int i = 2; i <= command.Length -1; i++)
Group group = Group.NONE;
if (command.Length == 4)
{
argsList.Add(command[i]);
group = GroupUtil.GetGroup(command.GetStringParameter(3));
if (group == Group.NONE)
{
UnturnedChat.Say(caller, "Unknown group: " + command.GetStringParameter(3) + "!", Color.red);
return;
}
}
string[] args = argsList.ToArray();
if (!f.OnSetValue(caller, zone, args))
if (!f.OnSetValue(caller, zone, command.GetStringParameter(2), group))
{
UnturnedChat.Say(caller, usage, Color.red);
return;
}
zone.SetFlag(f.Name, f.Value);
zone.SetFlag(f.Name, f.Value, f.GroupValues);
}

public bool AllowFromConsole
Expand Down
8 changes: 4 additions & 4 deletions Rocket_Safezone/Model/Flag/BoolFlag.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,20 @@ protected BoolFlag(string name) : base(name)
{
}

public override bool OnSetValue(IRocketPlayer caller, SafeZone zone, params string[] values)
public override bool OnSetValue(IRocketPlayer caller, SafeZone zone, string rawValue, Group group = Group.NONE)
{
switch (values[0])
switch (rawValue.ToLower().Trim())
{
case "on":
case "true":
case "1":
Value = true;
SetValue(true, group);
return true;

case "off":
case "false":
case "0":
Value = false;
SetValue(false, group);
return true;
}

Expand Down
50 changes: 47 additions & 3 deletions Rocket_Safezone/Model/Flag/Flag.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,43 @@ public abstract class Flag
public abstract String Description { get; }
public abstract Object DefaultValue { get; }

public T GetValue<T>()
public virtual bool SupportsGroups
{
get { return true; }
}

public Dictionary<string, object> GroupValues = new Dictionary<string, object>();

public virtual T GetValue<T>(Group group)
{
if (!SupportsGroups)
{
throw new InvalidOperationException("Flag does not support group specific");
}
if (!Value.GetType().IsSameOrSubclass(typeof(T)))
{
throw new InvalidCastException("Can't cast " + Value.GetType().Name + " to " + typeof(T).Name);
}

String name = group.GetInternalGroupName();
if (GroupValues != null && GroupValues.ContainsKey(name))
{
return (T) GroupValues[name];
}
return (T) Value;
}

public T GetDefaultValue<T>()
public virtual T GetValue<T>()
{
if (!Value.GetType().IsSameOrSubclass(typeof(T)))
{
throw new InvalidCastException("Can't cast " + Value.GetType().Name + " to " + typeof(T).Name);
}

return (T)Value;
}

public virtual T GetDefaultValue<T>()
{
if (!DefaultValue.GetType().IsSameOrSubclass(typeof(T)))
{
Expand All @@ -33,9 +60,26 @@ public T GetDefaultValue<T>()
return (T)DefaultValue;
}

public abstract bool OnSetValue(IRocketPlayer caller, SafeZone safeZone, params string[] values);
public abstract bool OnSetValue(IRocketPlayer caller, SafeZone safeZone, string rawValue, Group group = Group.NONE);
public abstract string Usage { get; }

protected void SetValue(object value, Group group)
{
if (group == Group.NONE)
{
Value = value;
return;
}

String groupName = group.GetInternalGroupName();
if (GroupValues.ContainsKey(groupName))
{
GroupValues[groupName] = value;
return;
}
GroupValues.Add(groupName, value);
}

protected Flag(String name)
{
Name = name;
Expand Down
5 changes: 5 additions & 0 deletions Rocket_Safezone/Model/Flag/Impl/NoZombieFlag.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,10 @@ public override object DefaultValue
{
get { return true; }
}

public override bool SupportsGroups
{
get { return false; }
}
}
}
4 changes: 2 additions & 2 deletions Rocket_Safezone/Model/Flag/IntFlag.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ protected IntFlag(string name) : base(name)
{
}

public override bool OnSetValue(IRocketPlayer caller, SafeZone zone, params string[] values)
public override bool OnSetValue(IRocketPlayer caller, SafeZone zone, string rawValue, Group group)
{
try
{
Value = Convert.ToInt32(values[0]);
SetValue(Convert.ToInt32(rawValue), group);
return true;
}
catch (Exception)
Expand Down
3 changes: 3 additions & 0 deletions Rocket_Safezone/Model/Flag/SerializableFlag.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Xml.Serialization;

namespace Safezone.Model.Flag
Expand All @@ -11,5 +12,7 @@ public class SerializableFlag
public String Name;
[XmlAttribute("value")]
public Object Value;
[XmlAttribute("groupvalues")]
public Dictionary<string, object> GroupValues;
}
}
4 changes: 2 additions & 2 deletions Rocket_Safezone/Model/Flag/StringFlag.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ protected StringFlag(string name) : base(name)

}

public override bool OnSetValue(IRocketPlayer caller, SafeZone zone, params string[] values)
public override bool OnSetValue(IRocketPlayer caller, SafeZone zone, string rawValue, Group group = Group.NONE)
{
Value = values[0];
SetValue(rawValue, group);
return true;
}

Expand Down
40 changes: 40 additions & 0 deletions Rocket_Safezone/Model/Group.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System;

namespace Safezone.Model
{
public enum Group
{
ALL = 0,
MEMBERS = 1,
NONMEMBERS = 2,
NONE = 3
}

public static class GroupUtil
{
public static Group GetGroup(String name)
{
name = name.Trim().ToLower();
switch (name)
{
case "all":
return Group.ALL;
case "members":
case "member":
return Group.MEMBERS;
case "nonmembers":
case "non-members":
case "nonmember":
case "non-member":
return Group.NONMEMBERS;
}

return Group.NONE;
}

public static string GetInternalGroupName(this Group group)
{
return group.ToString().ToLower();
}
}
}
39 changes: 34 additions & 5 deletions Rocket_Safezone/Model/Safezone/SafeZone.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@ public class SafeZone
{
[XmlAttribute("Name")]
public string Name;
[XmlAttribute("Owner")]
public uint Owner;
[XmlArray("Owners")]
public List<uint> Owners;
[XmlElement("Type")]
public SafeZoneType Type;

[XmlArray("Flags")]
public List<SerializableFlag> Flags;

[XmlArray] public List<uint> Members;
public Flag.Flag GetFlag(System.Type t, bool createIfNotFound = true)
{
if (!t.IsSameOrSubclass(typeof(Flag.Flag)))
Expand Down Expand Up @@ -51,7 +52,28 @@ public Flag.Flag GetFlag(System.Type t, bool createIfNotFound = true)
return (Flag.Flag)Activator.CreateInstance(t);
}

public void SetFlag(string name, object value, bool save = true)
public Group GetGroup(IRocketPlayer player)
{
uint id = PlayerUtil.GetId(player);
foreach (var member in GetAllMembers())
{
if (member == id)
{
return Group.MEMBERS;
}
}

return Group.NONMEMBERS;
}

public List<uint> GetAllMembers()
{
var allMembers = Owners;
allMembers.AddRange(Members);
return allMembers;
}

public void SetFlag(string name, object value, Dictionary<string,object> groupValues, bool save = true)
{
System.Type flagType = Flag.Flag.GetFlagType(name);
if (flagType == null)
Expand All @@ -71,7 +93,7 @@ public void SetFlag(string name, object value, bool save = true)
break;
}

SerializableFlag flag = new SerializableFlag {Name = name, Value = value};
SerializableFlag flag = new SerializableFlag {Name = name, Value = value, GroupValues = groupValues};
Flags.Add(flag);
if (save)
{
Expand All @@ -90,7 +112,14 @@ public bool IsOwner(IRocketPlayer player)

public bool IsOwner(uint id)
{
return Owner == id;
foreach (uint owner in Owners)
{
if (owner == id)
{
return true;
}
}
return false;
}
}
}
3 changes: 2 additions & 1 deletion Rocket_Safezone/Model/Safezone/Type/CircleType.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using Rocket.API;
using Rocket.Unturned.Chat;
using Rocket.Unturned.Commands;
Expand Down Expand Up @@ -27,7 +28,7 @@ public override SafeZone OnCreate(IRocketPlayer player, string name, string[] ar
SafeZone zone = new SafeZone
{
Name = name,
Owner = PlayerUtil.GetId(player),
Owners = new List<uint> {PlayerUtil.GetId(player)},
Type = this
};

Expand Down
2 changes: 1 addition & 1 deletion Rocket_Safezone/Model/Safezone/Type/RectangleType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public override SafeZone OnCreate(IRocketPlayer player, String name, string[] ar
SafeZone zone = new SafeZone
{
Name = name,
Owner = PlayerUtil.GetId(player),
Owners = new List<uint> { PlayerUtil.GetId(player) },
Type = this
};

Expand Down
2 changes: 0 additions & 2 deletions Rocket_Safezone/SafeZoneConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,4 @@ public IRocketPluginConfiguration DefaultConfiguration
[XmlArrayItem(ElementName = "ZombieTimerSpeed")]
public int ZombieTimerSpeed;
}


}
Loading

0 comments on commit 46293c1

Please sign in to comment.