diff --git a/MCRandomizer/src/scramble/plugin/FurnaceRecipeStore.java b/MCRandomizer/src/scramble/plugin/FurnaceRecipeStore.java new file mode 100644 index 0000000..7c1a6c9 --- /dev/null +++ b/MCRandomizer/src/scramble/plugin/FurnaceRecipeStore.java @@ -0,0 +1,33 @@ +package scramble.plugin; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.FurnaceRecipe; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.RecipeChoice; +import org.bukkit.inventory.ShapelessRecipe; + +public class FurnaceRecipeStore implements RecipeStore{ + public List craftingitems = new ArrayList(); + public String finalItem; + + @Override + public void createRecipe() { + FurnaceRecipe rec = new FurnaceRecipe(new NamespacedKey(Template.plugin,"furnace"+System.nanoTime()),new ItemStack(Material.getMaterial(finalItem)),new RecipeChoice.MaterialChoice(craftingitems), + Template.r.nextInt(100)+1f,Template.r.nextInt(81)+20); + Bukkit.getLogger().info("Added recipe for "+finalItem); + Bukkit.getLogger().info("Furnace recipe w/"); + Bukkit.getLogger().info(" "+craftingitems.toString()); + Bukkit.addRecipe(rec); + } + + @Override + public void setResultItem(String item) { + this.finalItem=item; + } + +} diff --git a/MCRandomizer/src/scramble/plugin/ShapedRecipeStore.java b/MCRandomizer/src/scramble/plugin/ShapedRecipeStore.java index 84af9c3..cde7fc4 100644 --- a/MCRandomizer/src/scramble/plugin/ShapedRecipeStore.java +++ b/MCRandomizer/src/scramble/plugin/ShapedRecipeStore.java @@ -24,7 +24,7 @@ public class ShapedRecipeStore implements RecipeStore{ @Override public void createRecipe() { - ShapedRecipe sr = new ShapedRecipe(new ItemStack(Material.getMaterial(finalItem))); + ShapedRecipe sr = new ShapedRecipe(new ItemStack(Material.getMaterial(finalItem),Template.randomizeAmount())); sr.shape(shape); for (Character c : ingredientsMap.keySet()) { MaterialChoice m = ingredientsMap.get(c); diff --git a/MCRandomizer/src/scramble/plugin/ShapelessRecipeStore.java b/MCRandomizer/src/scramble/plugin/ShapelessRecipeStore.java index 133892d..ed94c56 100644 --- a/MCRandomizer/src/scramble/plugin/ShapelessRecipeStore.java +++ b/MCRandomizer/src/scramble/plugin/ShapelessRecipeStore.java @@ -14,7 +14,7 @@ public class ShapelessRecipeStore implements RecipeStore{ @Override public void createRecipe() { - ShapelessRecipe sr = new ShapelessRecipe(new ItemStack(Material.getMaterial(finalItem))); + ShapelessRecipe sr = new ShapelessRecipe(new ItemStack(Material.getMaterial(finalItem),Template.randomizeAmount())); for (int i=0;i craftingrecipes; @@ -53,12 +58,17 @@ public class Template public static List recipeStorage; public static List shufflelist; + public static List archivedshufflelist; public static List shufflelist2; + public static HashMap breedingTable = new HashMap(); public static boolean enableRecipeModifications = false; + public static HashMap> monsterDropTable = new HashMap>(); + public static HashMap furnaceRecipeTables = new HashMap(); PluginDescriptionFile pdfFile; public static Random r; + public static int randomChance=10; //Chance of a random drop. public static Template getPlugin() { @@ -73,6 +83,21 @@ public class Template ReadIntoList(f2, smeltingrecipes); plugin.getLogger().info("Loaded " + craftingrecipes.size() + " crafting entries, " + smeltingrecipes.size() + " furnace entries."); String shape; + for (String s : smeltingrecipes) { + String[] split = s.split(","); + //FurnaceRecipe rec = new FurnaceRecipe(new NamespacedKey(plugin,"furnace"),new ItemStack(Material.getMaterial(name))); + if (furnaceRecipeTables.containsKey(split[1])) { + FurnaceRecipeStore frs = furnaceRecipeTables.get(split[1]); + frs.craftingitems.add(Material.getMaterial(split[0])); + furnaceRecipeTables.put(split[1], frs); + } else { + FurnaceRecipeStore frs = new FurnaceRecipeStore(); + furnaceRecipeTables.put(split[1],frs); + frs.craftingitems.add(Material.getMaterial(split[0])); + recipeStorage.add(frs); + shufflelist.add(split[1]); + } + } for (String s : craftingrecipes) { String temp = s.substring(0, s.indexOf(",")); @@ -129,7 +154,8 @@ public class Template } plugin.getLogger().info("Creating recipes..."); - while (shufflelist.size() > 0) + archivedshufflelist.addAll(shufflelist); + while (shufflelist.size()>0) { Integer numb = Integer.valueOf(r.nextInt(recipeStorage.size())); RecipeStore rs = (RecipeStore)recipeStorage.get(numb.intValue()); @@ -145,9 +171,59 @@ public class Template shufflelist.remove(0); recipeStorage.remove(rs); } + plugin.getLogger().info("Shuffling monster drops..."); + shufflelist.addAll(archivedshufflelist); + EntityType[] monsterTypeList = new EntityType[]{ + EntityType.BLAZE, + EntityType.CAVE_SPIDER, + EntityType.CREEPER, + EntityType.DROWNED, + EntityType.ELDER_GUARDIAN, + EntityType.ENDERMAN, + EntityType.ENDERMITE, + EntityType.EVOKER, + EntityType.GUARDIAN, + EntityType.HUSK, + EntityType.ILLUSIONER, + EntityType.PIG_ZOMBIE, + EntityType.PILLAGER, + EntityType.RAVAGER, + EntityType.SILVERFISH, + EntityType.SKELETON, + EntityType.SPIDER, + EntityType.STRAY, + EntityType.VEX, + EntityType.VINDICATOR, + EntityType.WITCH, + EntityType.WITHER, + EntityType.ZOMBIE, + EntityType.ZOMBIE_VILLAGER, + }; + while (shufflelist.size()>0) { + EntityType pick = monsterTypeList[r.nextInt(monsterTypeList.length)]; + ItemStack it = new ItemStack(Material.getMaterial(shufflelist.get(0))); + if (monsterDropTable.containsKey(pick)) { + List addTable = monsterDropTable.get(pick); + addTable.add(it); + monsterDropTable.put(pick, addTable); + } else { + List addTable = new ArrayList(); + addTable.add(it); + monsterDropTable.put(pick, addTable); + } + shufflelist.remove(0); + } plugin.getLogger().info("Done! All recipes shuffled!"); } } + + public static int randomizeAmount() { + int counter=1; + while (Template.r.nextInt(4)==0) { + counter++; + } + return counter; + } private static void ReadIntoList(File f, List list) { @@ -182,12 +258,48 @@ public class Template Bukkit.addRecipe(sr); } + public void setBreedingTable() { + List canBreed = new ArrayList(); + canBreed.addAll(Arrays.asList(new EntityType[]{ + EntityType.HORSE, + EntityType.VILLAGER, + EntityType.CAT, + EntityType.CHICKEN, + EntityType.COW, + EntityType.DONKEY, + EntityType.FOX, + EntityType.LLAMA, + EntityType.MULE, + EntityType.MUSHROOM_COW, + EntityType.OCELOT, + EntityType.PANDA, + EntityType.PARROT, + EntityType.PIG, + EntityType.POLAR_BEAR, + EntityType.RABBIT, + EntityType.SHEEP, + EntityType.SKELETON_HORSE, + EntityType.TURTLE, + EntityType.VILLAGER, + EntityType.WANDERING_TRADER, + EntityType.WOLF, + EntityType.ZOMBIE_HORSE + })); + while (canBreed.size()>1) { + breedingTable.put(canBreed.remove(0), canBreed.remove(r.nextInt(canBreed.size()))); + } + if (canBreed.size()>0) { + breedingTable.put(canBreed.get(0), canBreed.get(0)); + } + } + public void onEnable() { craftingrecipes = new ArrayList(); smeltingrecipes = new ArrayList(); shufflelist = new ArrayList(); + archivedshufflelist = new ArrayList(); shufflelist2 = new ArrayList(); recipeStorage = new ArrayList(); plugin = (Template)getPlugin(Template.class); @@ -268,6 +380,7 @@ public class Template } ReadRecipeData(); AddInDefaultRecipes(); + setBreedingTable(); for (String s : recipeTypeMap.keySet()) { Bukkit.getLogger().info(" Randomized " + recipeTypeMap.get(s) + " " + s + " recipes."); diff --git a/MCRandomizer/src/scramble/plugin/listener/ExampleListener.java b/MCRandomizer/src/scramble/plugin/listener/ExampleListener.java index ac57a22..1d654d4 100644 --- a/MCRandomizer/src/scramble/plugin/listener/ExampleListener.java +++ b/MCRandomizer/src/scramble/plugin/listener/ExampleListener.java @@ -4,14 +4,22 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; +import java.util.List; import java.util.Map; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.entity.Ageable; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Monster; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.entity.EntityBreedEvent; +import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.event.inventory.FurnaceSmeltEvent; import org.bukkit.event.inventory.PrepareItemCraftEvent; @@ -20,24 +28,59 @@ import org.bukkit.inventory.Recipe; import org.bukkit.inventory.RecipeChoice; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.ShapelessRecipe; +import org.bukkit.metadata.FixedMetadataValue; import net.md_5.bungee.api.ChatColor; import scramble.plugin.Template; public class ExampleListener implements Listener { + + @EventHandler + public void onEntityBreed(EntityBreedEvent ev) { + //Bukkit.getLogger().info("Breeder is "+ev.getBreeder()); + if (ev.getBreeder()!=null && + ev.getBreeder() instanceof Player) { + ev.getEntity().remove(); + if (ev.getFather()!=null && + !ev.getFather().hasMetadata("hasBred") || Math.abs(ev.getFather().getWorld().getFullTime()-ev.getFather().getMetadata("hasBred").get(0).asLong())>1) { + SpawnRandomizedEntity(ev.getFather()); + } else { + if (!ev.getMother().hasMetadata("hasBred") || Math.abs(ev.getMother().getWorld().getFullTime()-ev.getMother().getMetadata("hasBred").get(0).asLong())>1) { + SpawnRandomizedEntity(ev.getMother()); + } + } + if (ev.getFather()!=null) { + ev.getFather().setMetadata("hasBred", new FixedMetadataValue(Template.getPlugin(),ev.getFather().getWorld().getFullTime())); + Bukkit.getLogger().info("Set father hasBred to "+ev.getFather().getMetadata("hasBred").get(0).asLong()); + } + if (ev.getMother()!=null) { + ev.getMother().setMetadata("hasBred", new FixedMetadataValue(Template.getPlugin(),ev.getMother().getWorld().getFullTime())); + Bukkit.getLogger().info("Set mother hasBred to "+ev.getFather().getMetadata("hasBred").get(0).asLong()); + } + } + } + + private void SpawnRandomizedEntity(LivingEntity ent) { + Entity baby = ent.getWorld().spawnEntity(ent.getLocation(), Template.breedingTable.get(ent.getType())); + if (baby instanceof Ageable) { + Ageable baby_ent = (Ageable)baby; + baby_ent.setBaby(); + } + } + + @EventHandler + public void onEntityDeath(EntityDeathEvent ev) { + if (Template.monsterDropTable.containsKey(ev.getEntityType())) { + if (Template.r.nextInt(100) itemList = Template.monsterDropTable.get(ev.getEntityType()); + ev.getDrops().add(itemList.get(Template.r.nextInt(itemList.size()))); + } + } + } @EventHandler public void onBlockBreak(BlockBreakEvent event) { - /* - * We get the player and make a variable to make it easier to access it when we - * need to use it. - */ //Player p = event.getPlayer(); - /* - * Here we cancel the event. This means that they can't break the block. In this - * case, we send a message to the player saying they don't have the required - * permission. - */ /*if (!p.hasPermission("template.breakblocks")) { p.sendMessage(Template.CHAT_PREFIX + ChatColor.WHITE + " > " + ChatColor.RED + "You do not have permission to break blocks!"); event.setCancelled(true);