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();
}
}
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