Search in sources :

Example 1 with JobPermission

use of com.gamingmesh.jobs.container.JobPermission in project Jobs by GamingMesh.

the class JobConfig method loadJobSettings.

/**
     * Method to load the jobs configuration
     * 
     * loads from Jobs/jobConfig.yml
     */
private void loadJobSettings() {
    File f = new File(plugin.getDataFolder(), "jobConfig.yml");
    ArrayList<Job> jobs = new ArrayList<Job>();
    Jobs.setJobs(jobs);
    Jobs.setNoneJob(null);
    if (!f.exists()) {
        try {
            f.createNewFile();
        } catch (IOException e) {
            Jobs.getPluginLogger().severe("Unable to create jobConfig.yml!  No jobs were loaded!");
            return;
        }
    }
    YamlConfiguration conf = new YamlConfiguration();
    conf.options().pathSeparator('/');
    try {
        conf.load(f);
    } catch (Exception e) {
        Bukkit.getServer().getLogger().severe("==================== Jobs ====================");
        Bukkit.getServer().getLogger().severe("Unable to load jobConfig.yml!");
        Bukkit.getServer().getLogger().severe("Check your config for formatting issues!");
        Bukkit.getServer().getLogger().severe("No jobs were loaded!");
        Bukkit.getServer().getLogger().severe("Error: " + e.getMessage());
        Bukkit.getServer().getLogger().severe("==============================================");
        return;
    }
    conf.options().header(new StringBuilder().append("Jobs configuration.").append(System.getProperty("line.separator")).append(System.getProperty("line.separator")).append("Stores information about each job.").append(System.getProperty("line.separator")).append(System.getProperty("line.separator")).append("For example configurations, visit http://dev.bukkit.org/server-mods/jobs/.").append(System.getProperty("line.separator")).toString());
    ConfigurationSection jobsSection = conf.getConfigurationSection("Jobs");
    if (jobsSection == null) {
        jobsSection = conf.createSection("Jobs");
    }
    for (String jobKey : jobsSection.getKeys(false)) {
        ConfigurationSection jobSection = jobsSection.getConfigurationSection(jobKey);
        String jobName = jobSection.getString("fullname");
        if (jobName == null) {
            Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid fullname property. Skipping job!");
            continue;
        }
        int maxLevel = jobSection.getInt("max-level", 0);
        if (maxLevel < 0)
            maxLevel = 0;
        Integer maxSlots = jobSection.getInt("slots", 0);
        if (maxSlots.intValue() <= 0) {
            maxSlots = null;
        }
        String jobShortName = jobSection.getString("shortname");
        if (jobShortName == null) {
            Jobs.getPluginLogger().warning("Job " + jobKey + " is missing the shortname property.  Skipping job!");
            continue;
        }
        String description = jobSection.getString("description", "");
        ChatColor color = ChatColor.WHITE;
        if (jobSection.contains("ChatColour")) {
            color = ChatColor.matchColor(jobSection.getString("ChatColour", ""));
            if (color == null) {
                color = ChatColor.WHITE;
                Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid ChatColour property.  Defaulting to WHITE!");
            }
        }
        DisplayMethod displayMethod = DisplayMethod.matchMethod(jobSection.getString("chat-display", ""));
        if (displayMethod == null) {
            Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid chat-display property. Defaulting to None!");
            displayMethod = DisplayMethod.NONE;
        }
        Parser maxExpEquation;
        String maxExpEquationInput = jobSection.getString("leveling-progression-equation");
        try {
            maxExpEquation = new Parser(maxExpEquationInput);
            // test equation
            maxExpEquation.setVariable("numjobs", 1);
            maxExpEquation.setVariable("joblevel", 1);
            maxExpEquation.getValue();
        } catch (Exception e) {
            Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid leveling-progression-equation property. Skipping job!");
            continue;
        }
        Parser incomeEquation;
        String incomeEquationInput = jobSection.getString("income-progression-equation");
        try {
            incomeEquation = new Parser(incomeEquationInput);
            // test equation
            incomeEquation.setVariable("numjobs", 1);
            incomeEquation.setVariable("joblevel", 1);
            incomeEquation.setVariable("baseincome", 1);
            incomeEquation.getValue();
        } catch (Exception e) {
            Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid income-progression-equation property. Skipping job!");
            continue;
        }
        Parser expEquation;
        String expEquationInput = jobSection.getString("experience-progression-equation");
        try {
            expEquation = new Parser(expEquationInput);
            // test equation
            expEquation.setVariable("numjobs", 1);
            expEquation.setVariable("joblevel", 1);
            expEquation.setVariable("baseexperience", 1);
            expEquation.getValue();
        } catch (Exception e) {
            Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid experience-progression-equation property. Skipping job!");
            continue;
        }
        // Permissions
        ArrayList<JobPermission> jobPermissions = new ArrayList<JobPermission>();
        ConfigurationSection permissionsSection = jobSection.getConfigurationSection("permissions");
        if (permissionsSection != null) {
            for (String permissionKey : permissionsSection.getKeys(false)) {
                ConfigurationSection permissionSection = permissionsSection.getConfigurationSection(permissionKey);
                String node = permissionKey.toLowerCase();
                if (permissionSection == null) {
                    Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid permission key" + permissionKey + "!");
                    continue;
                }
                boolean value = permissionSection.getBoolean("value", true);
                int levelRequirement = permissionSection.getInt("level", 0);
                jobPermissions.add(new JobPermission(node, value, levelRequirement));
            }
        }
        Job job = new Job(jobName, jobShortName, description, color, maxExpEquation, displayMethod, maxLevel, maxSlots, jobPermissions);
        for (ActionType actionType : ActionType.values()) {
            ConfigurationSection typeSection = jobSection.getConfigurationSection(actionType.getName());
            ArrayList<JobInfo> jobInfo = new ArrayList<JobInfo>();
            if (typeSection != null) {
                for (String key : typeSection.getKeys(false)) {
                    ConfigurationSection section = typeSection.getConfigurationSection(key);
                    String myKey = key.toUpperCase();
                    String type = null;
                    String subType = "";
                    if (myKey.contains("-")) {
                        // uses subType
                        subType = ":" + myKey.split("-")[1];
                        myKey = myKey.split("-")[0];
                    }
                    Material material = Material.matchMaterial(myKey);
                    if (material == null) {
                        // try integer method
                        Integer matId = null;
                        try {
                            matId = Integer.decode(myKey);
                        } catch (NumberFormatException e) {
                        }
                        if (matId != null) {
                            material = Material.getMaterial(matId);
                            if (material != null) {
                                Jobs.getPluginLogger().warning("Job " + jobKey + " " + actionType.getName() + " is using a block by number ID: " + key + "!");
                                Jobs.getPluginLogger().warning("Please switch to using the Material name instead: " + material.toString() + "!");
                                Jobs.getPluginLogger().warning("Blocks by number IDs may break in a future release!");
                            }
                        }
                    }
                    if (material != null) {
                        // Break and Place actions MUST be blocks
                        if (actionType == ActionType.BREAK || actionType == ActionType.PLACE) {
                            if (!material.isBlock()) {
                                Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid " + actionType.getName() + " type property: " + key + "! Material must be a block!");
                                continue;
                            }
                        }
                        /* 
                             * Historically, GLOWING_REDSTONE_ORE would ONLY work as REDSTONE_ORE, and putting
                             * GLOWING_REDSTONE_ORE in the configuration would not work.  Unfortunately, this is 
                             * completely backwards and wrong.
                             * 
                             * To maintain backwards compatibility, all instances of REDSTONE_ORE should normalize
                             * to GLOWING_REDSTONE_ORE, and warn the user to change their configuration.  In the
                             * future this hack may be removed and anybody using REDSTONE_ORE will have their
                             * configurations broken.
                             */
                        if (material == Material.REDSTONE_ORE) {
                            Jobs.getPluginLogger().warning("Job " + jobKey + " is using REDSTONE_ORE instead of GLOWING_REDSTONE_ORE.");
                            Jobs.getPluginLogger().warning("Automatically changing block to GLOWING_REDSTONE_ORE.  Please update your configuration.");
                            Jobs.getPluginLogger().warning("In vanilla minecraft, REDSTONE_ORE changes to GLOWING_REDSTONE_ORE when interacted with.");
                            Jobs.getPluginLogger().warning("In the future, Jobs using REDSTONE_ORE instead of GLOWING_REDSTONE_ORE may fail to work correctly.");
                            material = Material.GLOWING_REDSTONE_ORE;
                        }
                        // END HACK
                        type = material.toString();
                    } else if (actionType == ActionType.KILL) {
                        // check entities
                        EntityType entity = EntityType.fromName(key);
                        if (entity == null) {
                            try {
                                entity = EntityType.valueOf(key.toUpperCase());
                            } catch (IllegalArgumentException e) {
                            }
                        }
                        if (entity != null && entity.isAlive())
                            type = entity.toString();
                    }
                    if (type == null) {
                        Jobs.getPluginLogger().warning("Job " + jobKey + " has an invalid " + actionType.getName() + " type property: " + key + "!");
                        continue;
                    }
                    double income = section.getDouble("income", 0.0);
                    double experience = section.getDouble("experience", 0.0);
                    jobInfo.add(new JobInfo(type + subType, income, incomeEquation, experience, expEquation));
                }
            }
            job.setJobInfo(actionType, jobInfo);
        }
        if (jobKey.equalsIgnoreCase("none")) {
            Jobs.setNoneJob(job);
        } else {
            jobs.add(job);
        }
    }
    try {
        conf.save(f);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
Also used : ActionType(com.gamingmesh.jobs.container.ActionType) ArrayList(java.util.ArrayList) YamlConfiguration(org.bukkit.configuration.file.YamlConfiguration) JobInfo(com.gamingmesh.jobs.container.JobInfo) DisplayMethod(com.gamingmesh.jobs.container.DisplayMethod) Job(com.gamingmesh.jobs.container.Job) JobPermission(com.gamingmesh.jobs.container.JobPermission) Material(org.bukkit.Material) IOException(java.io.IOException) IOException(java.io.IOException) Parser(com.gamingmesh.jobs.resources.jfep.Parser) EntityType(org.bukkit.entity.EntityType) File(java.io.File) ChatColor(com.gamingmesh.jobs.util.ChatColor) ConfigurationSection(org.bukkit.configuration.ConfigurationSection)

Example 2 with JobPermission

use of com.gamingmesh.jobs.container.JobPermission in project Jobs by GamingMesh.

the class PermissionHandler method recalculatePermissions.

public void recalculatePermissions(JobsPlayer jPlayer) {
    Player player = plugin.getServer().getPlayer(jPlayer.getPlayerUUID());
    if (player == null)
        return;
    boolean changed = false;
    // remove old permissions
    String permName = "jobs.players." + player.getName();
    Permission permission = plugin.getServer().getPluginManager().getPermission(permName);
    if (permission != null) {
        plugin.getServer().getPluginManager().removePermission(permission);
        changed = true;
    }
    // Permissions should only apply if we have permission to use jobs in this world
    if (hasWorldPermission(player, player.getWorld().getName())) {
        List<JobProgression> progression = jPlayer.getJobProgression();
        // calculate new permissions
        HashMap<String, Boolean> permissions = new HashMap<String, Boolean>();
        if (progression.size() == 0) {
            Job job = Jobs.getNoneJob();
            if (job != null) {
                for (JobPermission perm : job.getPermissions()) {
                    if (perm.getLevelRequirement() <= 0) {
                        if (perm.getValue()) {
                            permissions.put(perm.getNode(), true);
                        } else {
                            /*
                                 * If the key exists, don't put a false node in
                                 * This is in case we already have a true node there
                                 */
                            if (!permissions.containsKey(perm.getNode())) {
                                permissions.put(perm.getNode(), false);
                            }
                        }
                    }
                }
            }
        } else {
            for (JobProgression prog : progression) {
                for (JobPermission perm : prog.getJob().getPermissions()) {
                    if (prog.getLevel() >= perm.getLevelRequirement()) {
                        /*
                             * If the key exists, don't put a false node in
                             * This is in case we already have a true node there
                             */
                        if (perm.getValue()) {
                            permissions.put(perm.getNode(), true);
                        } else {
                            if (!permissions.containsKey(perm.getNode())) {
                                permissions.put(perm.getNode(), false);
                            }
                        }
                    }
                }
            }
        }
        // add new permissions (if applicable)
        if (permissions.size() > 0) {
            plugin.getServer().getPluginManager().addPermission(new Permission(permName, PermissionDefault.FALSE, permissions));
            changed = true;
        }
    }
    // If the permissions changed, recalculate them
    if (!changed)
        return;
    // find old attachment
    PermissionAttachment attachment = null;
    for (PermissionAttachmentInfo pai : player.getEffectivePermissions()) {
        if (pai.getAttachment() != null && pai.getAttachment().getPlugin() instanceof JobsPlugin) {
            attachment = pai.getAttachment();
        }
    }
    // create if attachment doesn't exist
    if (attachment == null) {
        attachment = player.addAttachment(plugin);
        attachment.setPermission(permName, true);
    }
    // recalculate!
    player.recalculatePermissions();
}
Also used : Player(org.bukkit.entity.Player) JobsPlayer(com.gamingmesh.jobs.container.JobsPlayer) HashMap(java.util.HashMap) JobPermission(com.gamingmesh.jobs.container.JobPermission) JobProgression(com.gamingmesh.jobs.container.JobProgression) Permission(org.bukkit.permissions.Permission) JobPermission(com.gamingmesh.jobs.container.JobPermission) PermissionAttachmentInfo(org.bukkit.permissions.PermissionAttachmentInfo) Job(com.gamingmesh.jobs.container.Job) PermissionAttachment(org.bukkit.permissions.PermissionAttachment)

Aggregations

Job (com.gamingmesh.jobs.container.Job)2 JobPermission (com.gamingmesh.jobs.container.JobPermission)2 ActionType (com.gamingmesh.jobs.container.ActionType)1 DisplayMethod (com.gamingmesh.jobs.container.DisplayMethod)1 JobInfo (com.gamingmesh.jobs.container.JobInfo)1 JobProgression (com.gamingmesh.jobs.container.JobProgression)1 JobsPlayer (com.gamingmesh.jobs.container.JobsPlayer)1 Parser (com.gamingmesh.jobs.resources.jfep.Parser)1 ChatColor (com.gamingmesh.jobs.util.ChatColor)1 File (java.io.File)1 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 Material (org.bukkit.Material)1 ConfigurationSection (org.bukkit.configuration.ConfigurationSection)1 YamlConfiguration (org.bukkit.configuration.file.YamlConfiguration)1 EntityType (org.bukkit.entity.EntityType)1 Player (org.bukkit.entity.Player)1 Permission (org.bukkit.permissions.Permission)1 PermissionAttachment (org.bukkit.permissions.PermissionAttachment)1