v1.2

package com.github.AndyPhar0.critter;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.UUID;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Animals;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.ExplosionPrimeEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.java.JavaPlugin;public final class critter extends JavaPlugin {
    public Map<UUID, String> Critter_Owners = new HashMap<UUID, String>();
    public Map<String,Integer> Critter_Counts = new HashMap<String, Integer>();
    public String pluginName = "critter";
    public String path1 = "Item.Change.Owner";
    public String path2 = "Item.Reset.Owner";
    public String path3 = "Set.Parents.Ownership";
    public String path4 = "Search.Owner.Radius";
    public String path5 = "Security.Allow.Cmd1";
    public String path6 = "Security.Allow.Cmd2";
    public String path7 = "Security.Deny.Cmd1";
    public String path8 = "Security.Deny.Cmd2";
    public String path9 = "TNT.Cancel.Radius";
    public String path10 = "TNT.Cancel.Nearanimals";
    public String path11a = "Default.Max.COW";
    public String path11b = "Default.Max.CHICKEN";
    public String path11c = "Default.Max.MOOSHROOM";
    public String path11d = "Default.Max.OCELOT";
    public String path11e = "Default.Max.PIG";
    public String path11f = "Default.Max.SHEEP";
    public String path11g = "Default.Max.WOLF";
    public String path11h = "Default.Max.OTHER";
    public String path11i = "Default.Max.TOTAL";
    public String pathDfltTotal = path11i;
    public String path12 = "Item.Brand.Animal";
    public String pendingNewOwner = "PendingRClick";
    public String testOwner = "TestOwnerName";
    public String testOwnerItem = "GHAST_TEAR";

    @Override
    public void onEnable() {
        loadConfiguration();
        reloadConfig();

        String pathO = getDataFolder() + File.separator + "Critter_Owners.bin";
        File fileO = new File(pathO);

        if(fileO.exists()) // check if file exists before loading to avoid errors!
             Critter_Owners  = loadO(pathO);

        String pathC = getDataFolder() + File.separator + "Critter_Counts.bin";
        File fileC = new File(pathC);

        if(fileC.exists()) // check if file exists before loading to avoid errors!
             Critter_Counts  = loadC(pathC);

         saveO(Critter_Owners, getDataFolder() + File.separator + "Critter_Owners.bin");
         saveC(Critter_Counts, getDataFolder() + File.separator + "Critter_Counts.bin");

        getServer().getPluginManager().registerEvents(new CritterOwner(), this);
        getServer().getPluginManager().registerEvents(new CritterCheck(), this);
        getServer().getPluginManager().registerEvents(new CritterHitter(), this);
        getServer().getPluginManager().registerEvents(new CritterPreBang(), this);
        getServer().getPluginManager().registerEvents(new CritterSplitter(), this);
        getServer().getPluginManager().registerEvents(new CritterKiller(), this);
        getServer().getPluginManager().registerEvents(new CritterFritter(), this);
        //loadMetadata();
    }
    @Override
    public void onDisable() {
        File f = getDataFolder();
         if(!f.exists()){
         f.mkdir();
         }
        saveO(Critter_Owners, getDataFolder() + File.separator + "Critter_Owners.bin");
        saveC(Critter_Counts, getDataFolder() + File.separator + "Critter_Counts.bin");
    }

    public class CritterFritter implements Listener {
        @EventHandler        public void onPlayerJoin(PlayerJoinEvent evt) {
               Player player = evt.getPlayer(); // The player who joined
               String brandAnimalItem = getConfig().getString(path12);
               player.sendMessage("This server runs the critter plugin so you can own animals by breeding them or branding with a " + brandAnimalItem);
               player.sendMessage("Use the /crittercounts all command to see how many animals you own (or may own).");
               //loadMetadata();
        }
     }

     public class CritterOwner implements Listener {
         @EventHandler
         public void MakingBabies(CreatureSpawnEvent event)
         {
             if ( event.isCancelled() )
                        return;
             if(event.getEntity()  instanceof Animals ) {
                 if (event.getSpawnReason().equals(SpawnReason.BREEDING)){
                     Boolean setParentsOwner = getConfig().getBoolean(path3);
                     Integer searchRadius = getConfig().getInt(path4);
                     Player Owner = null;
                     String OwnerName0 = "??";
                     String OwnerName = OwnerName0;

                     for(int r = 0;r <= searchRadius; r++) {
                         List<Entity> bystanders = event.getEntity().getNearbyEntities(r, r, r);
                         for(Entity e:bystanders) {
                             if(e instanceof Player) {
                                 Owner = ((Player) e).getPlayer();
                                 OwnerName = ((Player) e).getPlayer().getName();
                                 break;
                             }
                         }
                     }
                     if (OwnerName.equals(OwnerName0)) {
                         System.out.print(pluginName + ": Entity " + event.getEntity().getType() + " " + event.getEntity().getUniqueId() + " has been bred with no owner.");
                         return;
                     }

                     //Now find the 2 animal parents and set their owner too if not already owned

                     double dx =  1;
                     double dy =  1;
                     double dz =  1;
                     Integer parents = 0;
                     Integer maxparents = 2;
                     Boolean retFlag = false;

                     List<Entity> ent = event.getEntity().getNearbyEntities(dx, dy, dz);
                     for(Entity e:ent)
                     {
                         if(event.getEntity().getType()==e.getType() && parents < maxparents) {
                             if (Critter_Owners.containsKey(e.getUniqueId()) == true) {
                                 String ownerNameH = Critter_Owners.get(e.getUniqueId());
                                 String permNameP = "critter.breed."+ownerNameH;
                                 if (!OwnerName.equals(ownerNameH) && !Owner.hasPermission(permNameP)) {
                                     retFlag = true;
                                     break;
                                 }
                             }
                         }
                     }

                     if (retFlag) {
                         Owner.sendMessage(ChatColor.RED + "You don't have permission to breed from this " + event.getEntity().getType());
                         event.setCancelled(true);
                         return;
                     }

                     String pathDflt = "Default.Max." + event.getEntity().getType();

                     Integer MaxAnimals = getConfig().getInt(pathDflt);
                     Integer MaxAnimalsTotal = getConfig().getInt(pathDfltTotal);

                     if (!increaseCounts(event.getEntity(), "newborn", OwnerName, MaxAnimalsTotal, MaxAnimals, "own" )) return;

                     Owner.sendMessage("To give onwership to another player you both need to right-click it with a " + getConfig().getString(path1));
                     Owner.sendMessage("To remove ownership information right-click it with a " + getConfig().getString(path2));

                     if(!setParentsOwner) return;
                     parents = 0;
                     for(Entity e:ent) {
                         if(event.getEntity().getType()==e.getType() && parents < maxparents) {
                             if (Critter_Owners.containsKey(e.getUniqueId()) == false) {
                                 if (increaseCounts(e, "parent", OwnerName, MaxAnimalsTotal, MaxAnimals, "own" )) {
                                     parents = parents + 1;
                                 }

                             }
                         }
                     }
                 }
            }
       }
     }
     public class CritterSplitter implements Listener {
        @EventHandler
        public void onTNTBlockPlace(BlockPlaceEvent event){
            Boolean TNTCancel = getConfig().getBoolean(path10);
            Integer TNTRadius = getConfig().getInt(path9);
            if (!TNTCancel || TNTRadius == 0) return;
            Player player = event.getPlayer();
            Block block = event.getBlockPlaced();
            if(block.getType() == Material.TNT) {
                player.sendMessage(ChatColor.YELLOW + "Warning: TNT will be blocked from killing animals owned by players.");
            }
        }
     }
     public class CritterPreBang implements Listener {
         @EventHandler
         public void PreBang(ExplosionPrimeEvent event) {
            if (event.isCancelled()) return;
            Integer TNTRadius = getConfig().getInt(path9);
            Boolean TNTCancel = getConfig().getBoolean(path10);
            if (!TNTCancel || TNTRadius == 0) return;
            Entity banger = event.getEntity();

            if (banger.getType().getName().equals("PrimedTnt")) {
                 double dx =  TNTRadius;
                 double dy =  TNTRadius;
                 double dz =  TNTRadius;
                 Boolean retFlag = false;

                 List<Entity> ent = event.getEntity().getNearbyEntities(dx, dy, dz);
                 for(Entity e:ent)
                 {
                     if(e instanceof Animals) {
                         if (Critter_Owners.containsKey(e.getUniqueId()) == true) {
                             retFlag = true;
                             break;
                         }
                     }
                 }
                 if (retFlag) {
                     event.setCancelled(true);
                     System.out.print("Primed TNT cancelled due to nearby owned animals" );
                 }
            }
         }
     }
     public class CritterCheck implements Listener {
         @EventHandler(priority = EventPriority.LOWEST) //Want to be called 1st so we can set metadata for other plugins
         public void onAniClick(PlayerInteractEntityEvent event)
         {
            if ( event.isCancelled() )
                        return;
            String ownerName;
            String aniType = event.getRightClicked().getType().toString();
            String changeOwnerItem = getConfig().getString(path1);
            String resetOwnerItem = getConfig().getString(path2);
            String brandAnimalItem = getConfig().getString(path12);
            if(event.getRightClicked() instanceof Animals == false) return;

               String NewOwner = event.getPlayer().getName();
            String pathDflt = "Default.Max." + event.getRightClicked().getType();
            Integer MaxAnimals = getConfig().getInt(pathDflt);
            Integer MaxAnimalsTotal = getConfig().getInt(pathDfltTotal);
            Integer CountN = 1;

            if (event.getPlayer().getItemInHand().getTypeId()==Material.getMaterial(testOwnerItem).getId() && event.getPlayer().isOp()) {
                 String KeyT = testOwner + "." + event.getRightClicked().getType();
                 if (Critter_Counts.containsKey(testOwner)) {
                    CountN = Critter_Counts.get(testOwner) + 1;
                    Critter_Counts.put(testOwner, CountN);
                } else {
                       Critter_Counts.put(testOwner, 1);
                   }
                if (Critter_Counts.containsKey(KeyT)) {
                    CountN = Critter_Counts.get(KeyT) + 1;
                    Critter_Counts.put(KeyT, CountN);
                } else {
                    Critter_Counts.put(KeyT, 1);
                }
                if (Critter_Owners.containsKey(event.getRightClicked().getUniqueId())) {
                    ownerName = Critter_Owners.get(event.getRightClicked().getUniqueId());
                    reduceCounts(ownerName, aniType);
                }
                Critter_Owners.put(event.getRightClicked().getUniqueId(), testOwner); //Operators only
                setCritterMeta(event.getRightClicked(), "critterowner", testOwner);
                 return;
             }

            if (Critter_Owners.containsKey(event.getRightClicked().getUniqueId())) {  //setmetadata just in case
                ownerName = Critter_Owners.get(event.getRightClicked().getUniqueId());
                setCritterMeta(event.getRightClicked(), "critterowner", ownerName);
            } else {
                resetCritterMeta(event.getRightClicked(),"critterowner");
            }


            if (event.getPlayer().getItemInHand().getTypeId()==Material.getMaterial(brandAnimalItem).getId()) {
                if (Critter_Owners.containsKey(event.getRightClicked().getUniqueId()) == false) {
                    increaseCounts(event.getRightClicked(), "", NewOwner, MaxAnimalsTotal, MaxAnimals, "own" );
                    return;
                } else {
                    ownerName = Critter_Owners.get(event.getRightClicked().getUniqueId());
                    if (event.getPlayer().getName().equals(ownerName)) {
                        event.getPlayer().sendMessage("You already own this " + event.getRightClicked().getType() );
                    } else {
                        event.getPlayer().sendMessage("This " + event.getRightClicked().getType() + " is already owned by " + ownerName );
                    }
                    return;
                }
            }

            if (!Critter_Owners.containsKey(event.getRightClicked().getUniqueId())) {
                event.getPlayer().sendMessage("Nobody owns this " + event.getRightClicked().getType()) ;
                return;
            }

            ownerName = Critter_Owners.get(event.getRightClicked().getUniqueId());

            if (event.getPlayer().getItemInHand().getTypeId()==Material.getMaterial(resetOwnerItem).getId()) {
                if (event.getPlayer().hasPermission("critter.reset."+ownerName) || event.getPlayer().getName().equals(ownerName)) {
                    Critter_Owners.remove(event.getRightClicked().getUniqueId());
                    resetCritterMeta(event.getRightClicked(),"critterowner");
                    event.getPlayer().sendMessage("Ownership of this " + event.getRightClicked().getType() + " has been removed ");
                    reduceCounts(ownerName, aniType);
                } else {
                    event.getPlayer().sendMessage(ChatColor.RED + "You don't have permission to reset ownership of this " + event.getRightClicked().getType());
                }
                return;
            }

            if (Critter_Owners.get(event.getRightClicked().getUniqueId()).equals(event.getPlayer().getName())) {
                if (event.getPlayer().getItemInHand().getTypeId()==Material.getMaterial(changeOwnerItem).getId()) {
                    Critter_Owners.put(event.getRightClicked().getUniqueId(), pendingNewOwner);
                    setCritterMeta(event.getRightClicked(), "critterowner", pendingNewOwner);
                    reduceCounts(ownerName, aniType);
                    event.getPlayer().sendMessage("Next player to right-click this " + event.getRightClicked().getType() + " with a "+ changeOwnerItem + " will gain ownership.");
                } else {
                    //List<MetadataValue> values = event.getRightClicked().getMetadata("critterowner");
                    //for(MetadataValue val : values)
                    //{
                        //if(val.getOwningPlugin().getName().equals("critter"))
                        //{
                            //event.getPlayer().sendMessage("This " + event.getRightClicked().getType() + " with UUID " + event.getRightClicked().getUniqueId() + " has metadata " + val.asString());
                        //}
                    //}
                    event.getPlayer().sendMessage("You own this " + event.getRightClicked().getType());
                }
                return;
            }

            if (event.getPlayer().getItemInHand().getTypeId()==Material.getMaterial(changeOwnerItem).getId()) {
                if (Critter_Owners.get(event.getRightClicked().getUniqueId()) == pendingNewOwner) {

                    increaseCounts(event.getRightClicked(), "", NewOwner, MaxAnimalsTotal, MaxAnimals, "take ownership of" );

                   } else { //Non-owner may have permission to change
                    if (event.getPlayer().hasPermission("critter.change."+ownerName)) {
                        Critter_Owners.put(event.getRightClicked().getUniqueId(), pendingNewOwner);
                        setCritterMeta(event.getRightClicked(), "critterowner", pendingNewOwner);
                         reduceCounts(ownerName, aniType);
                        event.getPlayer().sendMessage("Next player to right-click this " + event.getRightClicked().getType() + " with a "+ changeOwnerItem + " will gain ownership.");
                    } else {
                        event.getPlayer().sendMessage(ChatColor.RED + "You don't have permission to change ownership of this " + event.getRightClicked().getType());
                    }
                }
                return;
            }
            //Not Right-clicking with a change item or reset item            if (ownerName.equals(pendingNewOwner)) {
                event.getPlayer().sendMessage("This " + event.getRightClicked().getType() + " is awaiting a new owner");
            } else {
                event.getPlayer().sendMessage("This " + event.getRightClicked().getType() + " is owned by " + ownerName);
            }
         }
       }

     public class CritterKiller implements Listener {
             @EventHandler
             public void onKill(EntityDeathEvent ekill) {
                 if(ekill.getEntity() instanceof Animals == false) return;
                 if (!Critter_Owners.containsKey(ekill.getEntity().getUniqueId())) return;
                 String ownerName = Critter_Owners.get(ekill.getEntity().getUniqueId());
                 String aniType = ekill.getEntity().getType().toString();
                 reduceCounts(ownerName, aniType);
             }
     }

     public class CritterHitter implements Listener {
         @EventHandler(priority = EventPriority.LOWEST) //Want to be called 1st so we can set metadata for other plugins
         public void onHit(EntityDamageByEntityEvent ehit) {
             if(ehit.getEntity() instanceof Animals && ehit.getDamager() instanceof Player) {
                 if (!Critter_Owners.containsKey(ehit.getEntity().getUniqueId())) {
                     resetCritterMeta(ehit.getEntity(), "critterowner");
                     return;
                 } else {
                     String ownerName = Critter_Owners.get(ehit.getEntity().getUniqueId());
                     setCritterMeta(ehit.getEntity(), "critterowner", ownerName);
                     String damager = ((Player)ehit.getDamager()).getName();
                     Player damagerP = ((Player)ehit.getDamager());
                     String permName = "critter.kill."+ownerName;
                     if (ownerName.equals(damager)) {
                         damagerP.sendMessage("You own this " + ehit.getEntity().getType());
                     } else {
                         if (ownerName.equals(pendingNewOwner)) {
                             damagerP.sendMessage("This " + ehit.getEntity().getType() + " is awaiting a new owner") ;
                         } else {
                             damagerP.sendMessage("This " + ehit.getEntity().getType() + " is owned by " + ownerName);
                         }
                         if (damagerP.hasPermission(permName)) {
                             ehit.setCancelled(false);
                             damagerP.sendMessage("You have permission from " + ownerName + " to kill this animal") ;
                         } else {
                             ehit.setCancelled(true);
                             damagerP.sendMessage(ChatColor.RED + "You do not have permission to kill this animal") ;
                         }
                     }
                }
            }
         }
     }

     public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
         String[] permTypes = {"breed", "change", "kill", "reset"};
         List<String> permTypesList = Arrays.asList(permTypes);
         String[] aniTypes = {"COW", "CHICKEN", "MOOSHROOM", "OCELOT","PIG","SHEEP","WOLF","ALL"};
         String[] aniTypesPlurals = {"COWS", "CHICKENS", "MOOSHROOMS", "OCELOTS","PIGS","SHEEP","WOLVES","ALL"};
         List<String> aniTypesList = Arrays.asList(aniTypes);
         List<String> aniTypesPluralsList = Arrays.asList(aniTypesPlurals);
             if(cmd.getName().equalsIgnoreCase("critterreload")){
                 if (args.length != 0) {
                    sender.sendMessage(ChatColor.RED + "Invalid parameters - enter ");
                    return false;
                }
                 reloadConfig();
                 sender.sendMessage("Critter parameters have been reloaded from config.yml ");
                 return true;
             }

             if(cmd.getName().equalsIgnoreCase("crittercounts")){
                 if (args.length > 2) {
                    sender.sendMessage(ChatColor.RED + "Invalid parameters - enter");
                    return false;
                }
                 if (args.length > 0) {
                     if (!aniTypesList.contains(args[0].toUpperCase())) {
                         sender.sendMessage(ChatColor.RED + "Invalid parameters - enter ");
                         return false;
                     }
                 }

                 String CountName = sender.getName();
                 if (args.length == 2) {
                     CountName = args[1];
                     if (!CountName.equals(sender.getName()) && !sender.isOp()) {
                         sender.sendMessage(ChatColor.RED + "You don't have permission to list another player's animals");
                         return false;
                     }
                 }

                 String CountType;
                 String countQ;

                 if (args.length == 0) {
                     CountType = "ALL";
                 } else {
                     CountType = args[0].toUpperCase();
                 }

                 Integer MaxAnimalsTotal = getConfig().getInt(pathDfltTotal);
                 Iterator<String> aniType = aniTypesList.iterator();
                 Iterator<String> aniTypePlurals = aniTypesPluralsList.iterator();

                while (aniType.hasNext()) {
                    String aniTypeL = aniType.next();
                    String aniTypePlL = aniTypePlurals.next();
                    String aniTypeMsg = aniTypePlL;
                    String pathDflt = "Default.Max." + aniTypeL;
                    Integer MaxAnimals = getConfig().getInt(pathDflt);

                    if (!aniTypeL.equals("ALL") && (aniTypeL.equalsIgnoreCase(CountType) || CountType.equals("ALL"))) {
                        countQ = CountName + "." + aniTypeL;
                        Integer count0 = Critter_Counts.get(countQ);
                        if (count0 == null) count0 = 0;
                        if (count0 == 1) aniTypeMsg = aniTypeL;
                        sender.sendMessage(ChatColor.WHITE +  CountName + " owns " + count0 + " (of max. " + MaxAnimals + ") " + aniTypeMsg);
                    }
                }                if (CountType.equals("ALL")) {
                    Integer CountAll = Critter_Counts.get(CountName);
                    String animalsTxt = " ANIMALS";
                    if (CountAll == null) CountAll = 0;
                    if (CountAll == 1) animalsTxt = " ANIMAL";
                    sender.sendMessage(ChatColor.WHITE + CountName + " owns a total of " + CountAll + " (of max. " + MaxAnimalsTotal + ") " + animalsTxt);
                }
                return true;
             }

            if(cmd.getName().equalsIgnoreCase("critterpurge")){
                if (args.length != 1) {
                    sender.sendMessage(ChatColor.RED + "Invalid parameters - enter ");
                    return false;
                }
                String purgePlayer = args[0];
                Integer remcount = 0;
                Iterator<Entry<UUID, String>> it = Critter_Owners.entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry<UUID, String> pairs = (Map.Entry<UUID, String>)it.next();
                    if(pairs.getValue().equals(purgePlayer)){
                        it.remove();
                        // But what about the metadata? Same problem as with load on enable...
                    }
                }
                Critter_Counts.put(purgePlayer, 0);
                Iterator<String> aniType = aniTypesList.iterator();
                while (aniType.hasNext()) {
                    String aniTypeP = aniType.next();
                    if (aniTypeP.equals("ALL")) break;
                    String countQ = purgePlayer + "." + aniTypeP;
                    Integer count0 = Critter_Counts.get(countQ);
                    if (count0 == null) count0 = 0;
                    String purgeTxt = " ownerships ";
                    if (count0 == 1) purgeTxt = " ownership ";
                    sender.sendMessage(count0 + " " + aniTypeP + purgeTxt + "purged for player " + purgePlayer);
                    remcount = remcount + count0;
                    Critter_Counts.put(countQ, 0);
                }

                String remcountTxt = " ownerships ";
                if (remcount == 1) remcountTxt = " ownership ";
                sender.sendMessage("A total of "  + remcount + remcountTxt + "purged for player " + purgePlayer);
                return true;
            }
            if(cmd.getName().equalsIgnoreCase("critterperm")){
                if (args.length < 2 || args.length > 3) {
                    sender.sendMessage(ChatColor.RED + "Invalid parameters - enter ");
                    return false;
                }
                if (!permTypesList.contains(args[1])) {
                    sender.sendMessage(ChatColor.RED + "Invalid parameters - enter ");
                    return false;
                }
                if (args.length == 3) {
                    if (!args[2].equals("true") && !args[2].equals("false") ) {
                        sender.sendMessage(ChatColor.RED + "Invalid parameters - enter " + args[0] + args[1] + args[2]);
                        return false;
                    }
                }
                String permName = "critter."+args[1]+"."+sender.getName();
                String commandTxt1 = "";
                String commandTxt2 = "";
                if (args[2].equals("true")) {
                    if (!getConfig().getString(path5).equals("")) {
                        commandTxt1 = getConfig().getString(path5).replaceAll("%node", permName);
                        commandTxt1 = commandTxt1.replaceAll("%player", args[0]);
                        if (Bukkit.dispatchCommand(Bukkit.getConsoleSender(), commandTxt1)) {
                            sender.sendMessage(ChatColor.WHITE + commandTxt1 + ChatColor.ITALIC.toString() + " executed successfully");
                        } else {
                            sender.sendMessage(ChatColor.YELLOW + commandTxt1 + ChatColor.ITALIC.toString() + " failed");
                        }
                    } else {
                        sender.sendMessage(ChatColor.YELLOW + "Critter permissions have not been configured - please contact your adminstrator.");
                    }
                    if (!getConfig().getString(path6).equals("")) {
                        commandTxt2 = getConfig().getString(path6).replaceAll("%node", permName);
                        commandTxt2 = commandTxt2.replaceAll("%player", args[0]);
                        if (Bukkit.dispatchCommand(Bukkit.getConsoleSender(), commandTxt2)) {
                            sender.sendMessage(ChatColor.WHITE + commandTxt2 + ChatColor.ITALIC.toString() + " executed successfully");
                        } else {
                            sender.sendMessage(ChatColor.YELLOW + commandTxt2 + ChatColor.ITALIC.toString() + " failed");
                        }
                    }
                } else {
                    if (!getConfig().getString(path7).equals("")) {
                        commandTxt1 = getConfig().getString(path7).replaceAll("%node", permName);
                        commandTxt1 = commandTxt1.replaceAll("%player", args[0]);
                        if (Bukkit.dispatchCommand(Bukkit.getConsoleSender(), commandTxt1)) {
                            sender.sendMessage(ChatColor.WHITE + commandTxt1 + ChatColor.ITALIC.toString() + " executed successfully");
                        } else {
                            sender.sendMessage(ChatColor.YELLOW + commandTxt1 + ChatColor.ITALIC.toString() + " failed");
                        }
                    } else {
                        sender.sendMessage(ChatColor.YELLOW + "Critter permissions have not been configured - please contact your adminstrator.");
                    }
                    if (!getConfig().getString(path8).equals("")) {
                        commandTxt2 = getConfig().getString(path8).replaceAll("%node", permName);
                        commandTxt2 = commandTxt2.replaceAll("%player", args[0]);
                        if (Bukkit.dispatchCommand(Bukkit.getConsoleSender(), commandTxt2)) {
                            sender.sendMessage(ChatColor.WHITE + commandTxt2 + ChatColor.ITALIC.toString() + " executed successfully");
                        } else {
                            sender.sendMessage(ChatColor.YELLOW + commandTxt2 + ChatColor.ITALIC.toString() + " failed");
                        }
                    }
                }
                return true;
            }
            return false;
         }

     public void reduceCounts(String currentOwner, String animalType) {
         String Key1 = currentOwner + "." + animalType;
         if (Critter_Counts.containsKey(currentOwner)) {
            Integer CountNTotal = Critter_Counts.get(currentOwner) - 1;
            Critter_Counts.put(currentOwner, CountNTotal);
         }
         if (Critter_Counts.containsKey(Key1)) {
            Integer CountN = Critter_Counts.get(Key1) - 1;
            Critter_Counts.put(Key1, CountN);
         }
         return;
     }

     public Boolean increaseCounts(Entity Animal, String animalDesc, String currentOwner, Integer maxAnimalsTotal, Integer maxAnimals, String maxAnimalsMsg) {
         Player p = Bukkit.getPlayer(currentOwner);
         String animalType = Animal.getType().toString();
         Boolean maxAnimalsHit = false;
         Boolean maxAnimalsTotalHit = false;
         Integer countAnimalsTotal = 1;
         Integer CountN = 1;
         String Key1 = currentOwner + "." + animalType;
         if (Critter_Counts.containsKey(currentOwner)) {
             countAnimalsTotal = Critter_Counts.get(currentOwner) + 1;
             if (countAnimalsTotal > maxAnimalsTotal) {
                 maxAnimalsTotalHit = true;
             }
         } else {
            if (maxAnimalsTotal == 0) {
                maxAnimalsTotalHit = true;
             }
         }
         if (Critter_Counts.containsKey(Key1)) {
            CountN = Critter_Counts.get(Key1) + 1;
             if (CountN > maxAnimals) {
                 maxAnimalsHit = true;
             } else {
                 if (maxAnimals == 0) {
                     maxAnimalsHit = true;
                 }
             }
         }
         if (maxAnimalsTotalHit) {
            p.sendMessage(ChatColor.RED + "You have already reached your maximum total animals (" + maxAnimalsTotal +") and cannot " +  maxAnimalsMsg + " this " + animalDesc + " " + animalType);
            return false;
         }
         if (maxAnimalsHit) {
            p.sendMessage(ChatColor.RED + "You have already reached your maximum (" + maxAnimals +") and cannot " + maxAnimalsMsg + " this "+ animalDesc + " " + animalType);
            return false;
         }
         Critter_Counts.put(Key1, CountN);
         Critter_Counts.put(currentOwner, countAnimalsTotal);
         Critter_Owners.put(Animal.getUniqueId(), currentOwner);
         setCritterMeta(Animal, "critterowner", currentOwner);
         String msgColour = "WHITE";
         if (CountN == maxAnimals) msgColour = "YELLOW";
         p.sendMessage(ChatColor.valueOf(msgColour) + "You now own this " + animalDesc + " " + animalType + " (" +  CountN + " of max. " + maxAnimals + ")");
         return true;
     }

     public void saveO(Map<UUID, String> map, String path)
     {
         try
         {
             ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
             oos.writeObject(map);
             oos.flush();
             oos.close();
             //Handle I/O exceptions
         }
         catch(Exception e)
         {
             e.printStackTrace();
         }
     }
     public void saveC(Map<String, Integer> map, String path)
     {
         try
         {
             ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
             oos.writeObject(map);
             oos.flush();
             oos.close();
             //Handle I/O exceptions
         }
         catch(Exception e)
         {
             e.printStackTrace();
         }
     }

     public void setCritterMeta(Entity animal, String key, Object value){
         animal.setMetadata(key,new FixedMetadataValue(this,value));
         }

     public void resetCritterMeta(Entity animal, String key){
         animal.removeMetadata(key,this);
         }

     public HashMap<UUID, String> loadO(String path)
     {
         try
         {
             ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
             Object result = ois.readObject();
             //you can feel free to cast result to HashMap<String, Integer> if you know there's that HashMap in the file
             return (HashMap<UUID, String>)result;
         }
         catch(Exception e)
         {
             e.printStackTrace();
         }
        return null;
     }
     public HashMap<String, Integer> loadC(String path)
     {
         try
         {
             ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
             Object result = ois.readObject();
             //you can feel free to cast result to HashMap<String, Integer> if you know there's that HashMap in the file
             return (HashMap<String, Integer>)result;
         }
         catch(Exception e)
         {
             e.printStackTrace();
         }
        return null;
     }     public void loadMetadata() {
         //Iterator<Entry<UUID, String>> it = Critter_Owners.entrySet().iterator();
         //UUID metaUUID;
         //String metaOwner;
            //while (it.hasNext()) {
                //Map.Entry<UUID, String> pairs = (Map.Entry<UUID, String>)it.next();
                //metaUUID = pairs.getKey();
                //metaOwner = pairs.getValue();
                //System.out.print("UUID: " + metaUUID + "Owner: " + metaOwner );
                //for (World world : Bukkit.getServer().getWorlds()) {
                    //for(Entity ent: world.getEntities()){
                        //System.out.print("World: " + world );
                        //System.out.print("file  UUID: " + metaUUID);
                        //System.out.print("world UUID: " + ent.getUniqueId());
                        //if(ent.getUniqueId().toString() == metaUUID.toString()) {
                            //setCritterMeta(ent, "critterowner", metaOwner);
                            //System.out.print("UUID: " + metaUUID + "Owner: " + metaOwner + "loaded");
                        //}
                    //}
                //}
            //}
         Integer entCount = 0;
            for (World world : Bukkit.getServer().getWorlds()) {
                for(Entity ent: world.getEntities()){
                    entCount = entCount + 1;
                    System.out.print(entCount + "Entity " + ent.getType() + "UUID: " + ent.getUniqueId());
                    if (Critter_Owners.containsKey(ent.getUniqueId())) {
                        String metaOwner = Critter_Owners.get(ent.getUniqueId());
                        setCritterMeta(ent, "critterowner", metaOwner);
                        System.out.print("UUID: " + ent.getUniqueId() + "Owner: " + metaOwner + "loaded");
                    }
                }
            }
            return;
        }

     public void loadConfiguration(){
         //getConfig().addDefault(path1, changeOwnerItem);
         //getConfig().addDefault(path2, resetOwnerItem);
         //getConfig().addDefault(path3, true);
         //getConfig().addDefault(path4, 16);
         //getConfig().addDefault(path5, "permissions player setperm %player %node true" );
         //getConfig().addDefault(path6, "" );
         //getConfig().addDefault(path7, "permissions player setperm %player %node false" );
         //getConfig().addDefault(path8, "" );
         //getConfig().addDefault(path9, 6);
         //getConfig().addDefault(path10, true);
         //getConfig().addDefault(path11a, 20);
         //getConfig().addDefault(path11b, 20);
         //getConfig().addDefault(path11c, 20);
         //getConfig().addDefault(path11d, 20);
         //getConfig().addDefault(path11e, 20);
         //getConfig().addDefault(path11f, 20);
         //getConfig().addDefault(path11g, 20);
         //getConfig().addDefault(path11h, 20);
         //getConfig().addDefault(path11i, 60);
         //getConfig().addDefault(path12, 60);
         getConfig().options().copyDefaults(true);
         saveConfig();
     }

}

Comments

Posts Quoted:
Reply
Clear All Quotes