Skip to content

Commit

Permalink
Moved all recipe-related tasks to a RecipeManager.
Browse files Browse the repository at this point in the history
Closes #9.
  • Loading branch information
AmauryCarrade committed Aug 10, 2014
1 parent 746bb1b commit 71a377b
Show file tree
Hide file tree
Showing 4 changed files with 388 additions and 239 deletions.
30 changes: 29 additions & 1 deletion src/main/java/me/azenet/UHPlugin/RecipeUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@


import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

Expand All @@ -34,7 +35,7 @@

/**
* Utility class to compare Bukkit recipes.<br>
* Useful for identifying your recipes in events, where recipes are re-generated in a diferent manner.
* Useful for identifying your recipes in events, where recipes are re-generated in a different manner.
*
* @version R1.3
* @author Digi
Expand Down Expand Up @@ -185,4 +186,31 @@ private static void mirrorMatrix(ItemStack[] matrix)
matrix[(r * 3) + 2] = tmp;
}
}



/**
* Returns the list of the ingredients of the given recipe.
*
* @author Amaury Carrade
*
* @param recipe The recipe to analyse.
* @return A list of the ingredients.
*/
public static List<ItemStack> getListOfIngredients(Recipe recipe) {
List<ItemStack> listOfItems = null;
if(recipe instanceof ShapelessRecipe) {
listOfItems = ((ShapelessRecipe) recipe).getIngredientList();
}
else {
try {
listOfItems = new LinkedList<ItemStack>(((ShapedRecipe) recipe).getIngredientMap().values());
}
catch(NullPointerException e) { // If the list of items is null
listOfItems = new LinkedList<ItemStack>(); // empty list
}
}

return listOfItems;
}
}
135 changes: 7 additions & 128 deletions src/main/java/me/azenet/UHPlugin/UHPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,18 @@
import me.azenet.UHPlugin.integration.UHWorldBorderIntegration;

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.SkullType;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.inventory.ShapelessRecipe;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class UHPlugin extends JavaPlugin {

private Logger logger = null;
private ShapelessRecipe goldenMelon = null;
private ShapedRecipe compass = null;
private ShapedRecipe goldenAppleFromHead = null;
private ShapedRecipe goldenAppleFromWitherHead = null;
private ShapelessRecipe goldenAppleLoreRemover = null;
private ShapelessRecipe goldenAppleLoreRemoverNotch = null;

private UHTeamManager teamManager = null;
private UHGameManager gameManager = null;
private UHPluginCommand commandManager = null;
private UHBorderManager borderManager = null;
private UHRecipeManager recipeManager = null;

private UHWorldBorderIntegration wbintegration = null;
private UHSpectatorPlusIntegration spintegration = null;
Expand All @@ -55,6 +43,7 @@ public void onEnable() {
teamManager = new UHTeamManager(this);
gameManager = new UHGameManager(this);
borderManager = new UHBorderManager(this);
recipeManager = new UHRecipeManager(this);

wbintegration = new UHWorldBorderIntegration(this);
spintegration = new UHSpectatorPlusIntegration(this);
Expand All @@ -68,7 +57,7 @@ public void onEnable() {

getServer().getPluginManager().registerEvents(new UHPluginListener(this), this);

addRecipes();
recipeManager.registerRecipes();

gameManager.initEnvironment();
gameManager.initScoreboard();
Expand Down Expand Up @@ -122,120 +111,6 @@ else if(teamRawSeparated.length == 1) { // "color"
logger.info(i18n.t("load.loaded"));
}

@SuppressWarnings("deprecation")
public void addRecipes() {
if(getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromHuman.do") || getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromWither.do")) {
// Golden apple (or notch apple): head in the center and 8 gold ingots.

/** From human head **/
short damage = 0;
String name = i18n.t("craft.goldenApple.nameGoldenAppleFromHeadNormal");
if(getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromHuman.craftNotchApple")) {
damage = 1;
name = i18n.t("craft.goldenApple.nameGoldenAppleFromHeadNotch");
}

if(getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromHuman.do")) {
ItemStack goldenAppleStack = new ItemStack(Material.GOLDEN_APPLE, getConfig().getInt("gameplay-changes.craftGoldenAppleFromHead.fromHuman.numberCrafted", 1), damage);
ItemMeta goldenAppleMeta = goldenAppleStack.getItemMeta();
goldenAppleMeta.setDisplayName(ChatColor.RESET + name);
goldenAppleStack.setItemMeta(goldenAppleMeta);

goldenAppleFromHead = new ShapedRecipe(goldenAppleStack);

goldenAppleFromHead.shape("GGG", "GHG", "GGG");
goldenAppleFromHead.setIngredient('G', Material.GOLD_INGOT);
goldenAppleFromHead.setIngredient('H', Material.SKULL_ITEM, SkullType.PLAYER.ordinal()); // TODO: deprecated, but no alternative found...

this.getServer().addRecipe(goldenAppleFromHead);
}

/** From wither head **/
damage = 0;
name = i18n.t("craft.goldenApple.nameGoldenAppleFromHeadNormal");
if(getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromWither.craftNotchApple")) {
damage = 1;
name = i18n.t("craft.goldenApple.nameGoldenAppleFromHeadNotch");
}

if(getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromWither.do")) {
ItemStack goldenAppleStack = new ItemStack(Material.GOLDEN_APPLE, getConfig().getInt("gameplay-changes.craftGoldenAppleFromHead.fromWither.numberCrafted", 1), damage);
ItemMeta goldenAppleMeta = goldenAppleStack.getItemMeta();
goldenAppleMeta.setDisplayName(ChatColor.RESET + name);
goldenAppleStack.setItemMeta(goldenAppleMeta);

goldenAppleFromWitherHead = new ShapedRecipe(goldenAppleStack);

goldenAppleFromWitherHead.shape("GGG", "GHG", "GGG");
goldenAppleFromWitherHead.setIngredient('G', Material.GOLD_INGOT);
goldenAppleFromWitherHead.setIngredient('H', Material.SKULL_ITEM, SkullType.WITHER.ordinal()); // TODO: deprecated, but no alternative found...

this.getServer().addRecipe(goldenAppleFromWitherHead);
}

/** Craft to remove the lore **/
if(getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromHuman.addLore") || getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromWither.addLore")) {
goldenAppleLoreRemover = new ShapelessRecipe(new ItemStack(Material.GOLDEN_APPLE, 1, (short) 0));
goldenAppleLoreRemover.addIngredient(Material.GOLDEN_APPLE);

goldenAppleLoreRemoverNotch = new ShapelessRecipe(new ItemStack(Material.GOLDEN_APPLE, 1, (short) 1));
goldenAppleLoreRemoverNotch.addIngredient(Material.GOLDEN_APPLE, 1);

this.getServer().addRecipe(goldenAppleLoreRemover);
this.getServer().addRecipe(goldenAppleLoreRemoverNotch);
}

logger.info(i18n.t("load.recipeApple"));
}

if(getConfig().getBoolean("gameplay-changes.craftGoldenMelonWithGoldBlock")) {
// Golden melon: gold block + melon

goldenMelon = new ShapelessRecipe(new ItemStack(Material.SPECKLED_MELON));
goldenMelon.addIngredient(1, Material.GOLD_BLOCK);
goldenMelon.addIngredient(1, Material.MELON);

this.getServer().addRecipe(goldenMelon);
logger.info(i18n.t("load.recipeMelon"));
}

if (getConfig().getBoolean("gameplay-changes.compass")) {
// Compass: redstone in center;
// then from the top, clockwise: iron, spider eye, iron, rotten flesh, iron, bone, iron, gunpowder.

compass = new ShapedRecipe(new ItemStack(Material.COMPASS));
compass.shape(new String[] {"CIE", "IRI", "BIF"});
compass.setIngredient('I', Material.IRON_INGOT);
compass.setIngredient('R', Material.REDSTONE);
compass.setIngredient('C', Material.SULPHUR);
compass.setIngredient('E', Material.SPIDER_EYE);
compass.setIngredient('B', Material.BONE);
compass.setIngredient('F', Material.ROTTEN_FLESH);

this.getServer().addRecipe(compass);
logger.info(i18n.t("load.recipeCompass"));
}
}

public Recipe getRecipe(String name) {
switch(name) {
case "goldenAppleFromHead":
return this.goldenAppleFromHead;
case "goldenAppleFromWitherHead":
return this.goldenAppleFromWitherHead;
case "goldenMelon":
return this.goldenMelon;
case "compass":
return this.compass;
case "goldenAppleLoreRemover":
return this.goldenAppleLoreRemover;
case "goldenAppleLoreRemoverNotch":
return this.goldenAppleLoreRemoverNotch;
default:
throw new IllegalArgumentException("Unknow recipe");
}
}

public UHTeamManager getTeamManager() {
return teamManager;
}
Expand All @@ -252,6 +127,10 @@ public UHBorderManager getBorderManager() {
return borderManager;
}

public UHRecipeManager getRecipeManager() {
return recipeManager;
}

public UHWorldBorderIntegration getWorldBorderIntegration() {
return wbintegration;
}
Expand Down
121 changes: 11 additions & 110 deletions src/main/java/me/azenet/UHPlugin/UHPluginListener.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package me.azenet.UHPlugin;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import me.azenet.UHPlugin.i18n.I18n;
Expand Down Expand Up @@ -48,8 +47,6 @@
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.inventory.ShapelessRecipe;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.potion.PotionEffect;
Expand Down Expand Up @@ -295,8 +292,10 @@ public void onPlayerMove(PlayerMoveEvent ev) {
/**
* Used to:
* - prevent items to be crafted;
* - add a lure to the golden apples crafted from a head.
* @param pce
* - add a lure to the golden apples crafted from a head;
* - keep the name of the item when the anti-lore craft is used.
*
* @param ev
*/
@EventHandler
public void onPreCraftEvent(PrepareItemCraftEvent ev) {
Expand All @@ -308,123 +307,25 @@ public void onPreCraftEvent(PrepareItemCraftEvent ev) {

/** Prevents items to be crafted **/

// Original recipes, for comparison
ShapedRecipe originalCompass = new ShapedRecipe(new ItemStack(Material.COMPASS));
originalCompass.shape(new String[] {" I ", "IRI", " I "});
originalCompass.setIngredient('I', Material.IRON_INGOT);
originalCompass.setIngredient('R', Material.REDSTONE);

ShapedRecipe originalGoldenMelon = new ShapedRecipe(new ItemStack(Material.SPECKLED_MELON));
originalGoldenMelon.shape(new String[] {"GGG", "GMG", "GGG"});
originalGoldenMelon.setIngredient('G', Material.GOLD_NUGGET);
originalGoldenMelon.setIngredient('M', Material.MELON);

// Compass
if(p.getConfig().getBoolean("gameplay-changes.compass") && RecipeUtil.areSimilar(recipe, originalCompass)) {
if(!p.getRecipeManager().isRecipeAllowed(recipe)) {
ev.getInventory().setResult(new ItemStack(Material.AIR));
return;
}

// Golden melon
if(p.getConfig().getBoolean("gameplay-changes.craftGoldenMelonWithGoldBlock") && RecipeUtil.areSimilar(recipe, originalGoldenMelon)) {
ev.getInventory().setResult(new ItemStack(Material.AIR));
return;
}

// Enchanted golden apple - the same technique does not work, this is a workaround
if(p.getConfig().getBoolean("gameplay-changes.goldenApple.disableNotchApples")) {
if(ev.getInventory().getResult().getType() == Material.GOLDEN_APPLE) {
if(recipe instanceof ShapelessRecipe) {
for(ItemStack item : ((ShapelessRecipe) recipe).getIngredientList()) {
if(item.getType() == Material.GOLD_BLOCK) {
// There is a gold block in a recipe for a golden apple - NOPE
ev.getInventory().setResult(new ItemStack(Material.AIR));
return;
}
}
}
else { // shaped recipe
for(ItemStack item : ((ShapedRecipe) recipe).getIngredientMap().values()) {
if(item.getType() == Material.GOLD_BLOCK) {
// There is a gold block in a recipe for a golden apple - NOPE NOPE NOPE
ev.getInventory().setResult(new ItemStack(Material.AIR));
return;
}
}
}
}
}


/** Adds a lore to the golden apples crafted from a head **/

if((p.getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromHuman.do") || p.getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromWither.do"))
&& (p.getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromHuman.addLore") || p.getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromWither.addLore"))
&& (RecipeUtil.areSimilar(recipe, p.getRecipe("goldenAppleFromHead")) || RecipeUtil.areSimilar(recipe, p.getRecipe("goldenAppleFromWitherHead")))) {

ItemStack result = ev.getInventory().getResult();
ItemMeta meta = result.getItemMeta();

// Lookup for the head in the recipe
String name = "";
Boolean wither = true;
for(ItemStack item : ev.getInventory().getContents()) {
if(item.getType() == Material.SKULL_ITEM && item.getDurability() == (short) SkullType.PLAYER.ordinal()) { // An human head
SkullMeta sm = (SkullMeta) item.getItemMeta();
if(sm.hasOwner()) { // An human head
name = sm.getOwner();
wither = false;
}
break;
}
}

if((wither && p.getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromWither.addLore"))
|| (!wither && p.getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromHuman.addLore"))) {

List<String> lore = null;
if(wither) {
lore = Arrays.asList(i.t("craft.goldenApple.loreLine1Monster"), i.t("craft.goldenApple.loreLine2Monster"));
}
else {
lore = Arrays.asList(i.t("craft.goldenApple.loreLine1Player", name), i.t("craft.goldenApple.loreLine2Player", name));
}
meta.setLore(lore);

}

result.setItemMeta(meta);
ev.getInventory().setResult(result);

ItemStack loreResult = p.getRecipeManager().addLore(recipe, ev.getInventory());
if(loreResult != null) {
ev.getInventory().setResult(loreResult);
return;
}


/** The lore removed don't change the name of the item **/

if((p.getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromHuman.addLore") || p.getConfig().getBoolean("gameplay-changes.craftGoldenAppleFromHead.fromWither.addLore"))
&& (RecipeUtil.areSimilar(recipe, p.getRecipe("goldenAppleLoreRemover")) || RecipeUtil.areSimilar(recipe, p.getRecipe("goldenAppleLoreRemoverNotch")))) {

ItemStack original = null;
for(int slot = 0; slot <= 9; slot++) {
original = ev.getInventory().getMatrix()[slot];
if(original.getType() != Material.AIR) {
break; // found
}
}

ItemMeta metaOriginal = original.getItemMeta();

if(metaOriginal != null && metaOriginal.hasDisplayName()) {
ItemStack result = ev.getInventory().getResult();
ItemMeta metaResult = result.getItemMeta();

metaResult.setDisplayName(metaOriginal.getDisplayName());
result.setItemMeta(metaResult);

ev.getInventory().setResult(result);
}

ItemStack keepNameResult = p.getRecipeManager().keepNameOnLoreRemover(recipe, ev.getInventory());
if(keepNameResult != null) {
ev.getInventory().setResult(keepNameResult);
return;
}
}
Expand Down
Loading

0 comments on commit 71a377b

Please sign in to comment.