public bool HasPermissionToCreateProjectile(TSPlayer ply) { if (ply == null) return false; if (ply.HasPermission(Permissions.canusebannedprojectiles)) return true; PermissionHookResult hookResult = PlayerHooks.OnPlayerProjbanPermission(ply, this); if (hookResult != PermissionHookResult.Unhandled) return hookResult == PermissionHookResult.Granted; var cur = ply.Group; var traversed = new List<Group>(); while (cur != null) { if (AllowedGroups.Contains(cur.Name)) { return true; } if (traversed.Contains(cur)) { throw new InvalidOperationException("Infinite group parenting ({0})".SFormat(cur.Name)); } traversed.Add(cur); cur = cur.Parent; } return false; // could add in the other permissions in this class instead of a giant if switch. }