diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs
index 16e81345..f5f105ea 100644
--- a/TShockAPI/Group.cs
+++ b/TShockAPI/Group.cs
@@ -174,26 +174,39 @@ namespace TShockAPI
/// Returns true if the user has that permission.
public virtual bool HasPermission(string permission)
{
- if (string.IsNullOrEmpty(permission))
- return true;
-
- var cur = this;
- var traversed = new List();
- while (cur != null)
- {
- if (cur.negatedpermissions.Contains(permission))
- return false;
- if (cur.permissions.Contains(permission))
- return true;
- if (traversed.Contains(cur))
- {
- throw new Exception("Infinite group parenting ({0})".SFormat(cur.Name));
- }
- traversed.Add(cur);
- cur = cur.Parent;
- }
- return false;
+ string[] nodes = permission.Split('.');
+ for (int i = nodes.Length - 1; i >= 0; i--)
+ {
+ if (RealHasPermission(String.Join(".", nodes)))
+ {
+ return true;
+ }
+ nodes[i] = "*";
+ }
+ return false;
}
+ private bool RealHasPermission(string permission)
+ {
+ if (string.IsNullOrEmpty(permission))
+ return true;
+
+ var cur = this;
+ var traversed = new List();
+ while (cur != null)
+ {
+ if (cur.negatedpermissions.Contains(permission))
+ return false;
+ if (cur.permissions.Contains(permission))
+ return true;
+ if (traversed.Contains(cur))
+ {
+ throw new Exception("Infinite group parenting ({0})".SFormat(cur.Name));
+ }
+ traversed.Add(cur);
+ cur = cur.Parent;
+ }
+ return false;
+ }
///
/// Adds a permission to the list of negated permissions.