[Слив кода] Bukkit Permissions + Forge

216
6
19
Может быть кому-то пригодится

Отрывок кода из CustomNpcs 1.7.10.

Код:
public final class PermissionsLoader {

    private Class<?> bukkit;
    private Method getPlayer;
    private Method hasPermission;

    private static PermissionsLoader Instance;

    public static final PermissionsLoader getInstance() {
        return Instance;;
    }

    // Создаем экземпляр этого класса в главном классе мода
    public PermissionsLoader() {
        Instance = this;

        try {
            bukkit = Class.forName("org.bukkit.Bukkit");
            getPlayer = bukkit.getMethod("getPlayer", String.class);
            hasPermission = Class.forName("org.bukkit.entity.Player").getMethod("hasPermission", String.class);
            System.out.println("Bukkit permissions enabled");
            System.out.println("Permissions available:");
            Collections.sort(Permission.permissions, String.CASE_INSENSITIVE_ORDER);
            for (final String p : Permission.permissions) { 
                System.out.println(p);
            }
        } catch (final ClassNotFoundException e) {
            // bukkit/mcpc+ is not loaded
        } catch (final NoSuchMethodException e) {
            e.printStackTrace();
        } catch (final SecurityException e) {
            e.printStackTrace();
        }
    }

    public static final boolean hasPermission(final EntityPlayer player, final Permission permission) {
        if (Instance.bukkit != null)
            return Instance.bukkitPermission(player.getCommandSenderName(), permission.name);
        return true;
    }

    private final boolean bukkitPermission(final String username, final String permission) {
        try {
            final Object player = getPlayer.invoke(null, username);
            return (Boolean) hasPermission.invoke(player, permission);
        } catch (final IllegalAccessException e) {
            e.printStackTrace();
        } catch (final IllegalArgumentException e) {
            e.printStackTrace();
        } catch (final InvocationTargetException e) {
            e.printStackTrace();
        }
        return false;
    }

    public static final class Permission {
        private static final List<String> permissions = new ArrayList<String>();
        public String name;

        public Permission(final String name) {
            this.name = name;
            if (!permissions.contains(name)) {
                permissions.add(name);
            }
        }
    }

    public static final boolean hasPermissionString(final EntityPlayerMP player, final String permission) {
        if (Instance.bukkit != null)
            return Instance.bukkitPermission(player.getCommandSenderName(), permission);
        return true;
    }
}
 
183
1
4
На самом деле доступ к правам игроков можно получить намного более приятным способом, чем это сделано в кастоме. Например через плагин Vault API, который помимо пермишенов может работать с деньгами и некоторыми настройками чата. Само собой, для работы на сервере должен быть установлен плагин. 
Небольшой пример обертки вокруг плагина: https://github.com/FRedEnergy/forge-vault
Использование: 
Код:
//Первый аргумент во всех трех примерах -- идентификатор мира. null - глобально
ForgeVault.getPermission().has((String)null, "Player724", "my.permission"); //проверить пермишен
ForgeVault.getPermission().playerAdd((String)null, "Player724", "my.newpermission"); //добавить пермишен
ForgeVault.getPermission().playerRemove((String)null, "Player724", "my.oldpermission"); //удалить пермишен
Больше информации об api есть тут: https://github.com/MilkBowl/VaultAPI
 
7,099
324
1,509
Есть еще более простой способ без левых либ:
Добавляем bukkit api в проект.
Юзаем:
Bukkit.getPlayer(forgeEntityPlayer.getUniqueID())
Bukkit.hasPermission(...)
 
Последнее редактирование:
208
1
Какие вы продвинутые, я вообще не думал, что можно делать нечто подобное :rolleyes:
 
Сверху