Обработка прав
Что такое PermissionAccess?
PermissionAccess
- это enum
, который используется для обработки результатов.
public enum PermissionAccess
{
// пропускает проверку
// в модуле Groups это возвращается, когда группа игрока не имеет право.
None,
// означает, что объект (допустим NetPlayer) может иметь право
HasPermission,
// означает, что объект (допустим NetPlayer) критически не должен иметь определенное право
// используйте это редко, так как чрезмерное употребление этого результата, может сломать другие плагины и модули
Blocked
}
Допустим, нам нужно расширение прав для NetPlayer
.
Нужно создать расширение прав для него:
public sealed class MyPermissionsWorker : IPermissionWorker<NetPlayer>
{
public static List<string> DefaultPermissions = new List<string>()
{
"perm1", "perm2", "test"
};
public PermissionAccess HasPermission(NetPlayer target, string permission)
{
// если право "MyPermission", то это расширение полностью блокирует его
// другие расширения не могут на это повлиять, так как это расширение полностью его заблокировало
if (permission == "право_которое_игрок_фиксированно_не_должен_иметь")
return PermissionAccess.Blocked;
// если игрок имеет право, которое перечислено в DefaultPermissions, то расширение возвращает PermissionAccess.HasPermission.
if (DefaultPermissions.Contains(permission))
return PermissionAccess.HasPermission;
// расширение игнорирует проверку, так как право не сошлось ни с чем.
return PermissionAccess.None;
}
public PermissionAccess HasChestPermission(NetPlayer target, int x, int y)
{
// расширение игнорирует проверку
return PermissionAccess.None;
}
public PermissionAccess HasChestEditPermission(NetPlayer target, int x, int y)
{
// расширение игнорирует проверку
return PermissionAccess.None;
}
public PermissionAccess HasSignPermission(NetPlayer target, int x, int y)
{
// расширение игнорирует проверку
return PermissionAccess.None;
}
public PermissionAccess HasSignEditPermission(NetPlayer target, int x, int y)
{
// расширение игнорирует проверку
return PermissionAccess.None;
}
public PermissionAccess HasTEPermission(NetPlayer target, int x, int y)
{
// расширение игнорирует проверку
return PermissionAccess.None;
}
public PermissionAccess HasTilePermission(NetPlayer target, int x, int y, int? width = null, int? height = null)
{
// расширение игнорирует проверку
return PermissionAccess.None;
}
}
Теперь, что бы расширение работало, нужно его зарегистрировать в узле прав (PermissionNode<T>
).
В случае с NetPlayer
- это AmethystSession.PlayerPermissions
.
IPermissionWorker<NetPlayer> worker = new MyPermissionsWorker();
// регистрация
AmethystSession.PlayerPermissions.Register(worker);
// дерегистрация
AmethystSession.PlayerPermissions.Unregister(worker);
Обязательно дерегистрируйте расширение прав, если оно из плагина.