Forráskód Böngészése

Attempting to make Herbalism cleaner...

GJ 12 éve
szülő
commit
2aec202e6d

+ 60 - 274
src/main/java/com/gmail/nossr50/skills/herbalism/Herbalism.java

@@ -4,6 +4,7 @@ import org.bukkit.DyeColor;
 import org.bukkit.Location;
 import org.bukkit.Material;
 import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
 import org.bukkit.entity.Player;
 import org.bukkit.event.block.BlockBreakEvent;
 import org.bukkit.event.entity.FoodLevelChangeEvent;
@@ -14,7 +15,6 @@ import org.bukkit.material.MaterialData;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.config.mods.CustomBlocksConfig;
 import com.gmail.nossr50.datatypes.PlayerProfile;
 import com.gmail.nossr50.datatypes.mods.CustomBlock;
 import com.gmail.nossr50.locale.LocaleLoader;
@@ -50,6 +50,13 @@ public class Herbalism {
     public static boolean greenTerraDirt = Config.getInstance().getHerbalismGreenThumbDirtToGrass();
     public static boolean greenTerraCobble = Config.getInstance().getHerbalismGreenThumbCobbleToMossy();
 
+    /**
+     * Handle the farmers diet skill.
+     *
+     * @param player The player to activate the skill for
+     * @param rankChange The # of levels to change rank for the food
+     * @param event The actual FoodLevelChange event
+     */
     public static void farmersDiet(Player player, int rankChange, FoodLevelChangeEvent event) {
         if (!Permissions.farmersDiet(player)) {
             return;
@@ -115,6 +122,20 @@ public class Herbalism {
         }
     }
 
+    private static int calculateCatciAndSugarDrops(Block block) {
+        Material blockType = block.getType();
+        int dropAmount = 0;
+
+        for (int y = 0;  y <= 2; y++) {
+            Block relativeBlock = block.getRelative(BlockFace.UP, y);
+            if (relativeBlock.getType().equals(blockType) && !mcMMO.placeStore.isTrue(relativeBlock)) {
+                dropAmount++;
+            }
+        }
+
+        return dropAmount;
+    }
+
     /**
      * Check for extra Herbalism drops.
      *
@@ -124,304 +145,69 @@ public class Herbalism {
      * @param plugin mcMMO plugin instance
      */
     public static void herbalismProcCheck(final Block block, Player player, BlockBreakEvent event, mcMMO plugin) {
-        final PlayerProfile profile = Users.getProfile(player);
+        if (Config.getInstance().getHerbalismAFKDisabled() && player.isInsideVehicle()) {
+            return;
+        }
 
+        PlayerProfile profile = Users.getProfile(player);
         int herbLevel = profile.getSkillLevel(SkillType.HERBALISM);
-        int id = block.getTypeId();
-        Material type = block.getType();
+        Material blockType = block.getType();
 
-        Location location = block.getLocation();
-        Material mat = null;
+        HerbalismBlock herbalismBlock = HerbalismBlock.getHerbalismBlock(blockType);
+        CustomBlock customBlock = null;
 
         int xp = 0;
-        int catciDrops = 0;
-        int caneDrops = 0;
-
-        boolean customPlant = false;
-
-        int activationChance = Misc.calculateActivationChance(Permissions.luckyHerbalism(player));
-
-        float chance = (float) ((doubleDropsMaxChance / doubleDropsMaxLevel) * herbLevel);
-        if (chance > doubleDropsMaxChance) chance = (float) doubleDropsMaxChance;
-
-        switch (type) {
-        case BROWN_MUSHROOM:
-        case RED_MUSHROOM:
-            if (!mcMMO.placeStore.isTrue(block)) {
-                mat = Material.getMaterial(id);
-                xp = Config.getInstance().getHerbalismXPMushrooms();
-            }
-            break;
-
-        case CACTUS:
-            for (int y = 0;  y <= 2; y++) {
-                Block b = block.getRelative(0, y, 0);
-                if (b.getType().equals(Material.CACTUS)) {
-                    mat = Material.CACTUS;
-                    if (!mcMMO.placeStore.isTrue(b)) {
-                        if (chance > Misc.getRandom().nextInt(activationChance)) {
-                            catciDrops++;
-                        }
-                        xp += Config.getInstance().getHerbalismXPCactus();
-                    }
-                }
-            }
-            break;
-
-        case CROPS:
-            mat = Material.WHEAT;
-            xp = Config.getInstance().getHerbalismXPWheat();
-
-            if (Permissions.greenThumbWheat(player)) {
-                greenThumbWheat(block, player, event, plugin);
-            }
-            break;
-
-        case MELON_BLOCK:
-            if (!mcMMO.placeStore.isTrue(block)) {
-                mat = Material.MELON;
-                xp = Config.getInstance().getHerbalismXPMelon();
+        int dropAmount = 1;
+        ItemStack dropItem = null;
+
+        if (herbalismBlock != null) {
+            if (blockType == Material.CACTUS || blockType == Material.SUGAR_CANE_BLOCK) {
+                dropItem = herbalismBlock.getDropItem();
+                dropAmount = calculateCatciAndSugarDrops(block);
+                xp = herbalismBlock.getXpGain() * dropAmount;
             }
-            break;
-
-        case NETHER_WARTS:
-            mat = Material.NETHER_STALK;
-            xp = Config.getInstance().getHerbalismXPNetherWart();
+            else if (herbalismBlock.hasGreenThumbPermission(player)){
+                dropItem = herbalismBlock.getDropItem();
+                xp = herbalismBlock.getXpGain();
 
-            if (Permissions.greenThumbNetherwart(player)) {
                 greenThumbWheat(block, player, event, plugin);
             }
-            break;
-
-        case PUMPKIN:
-            if (!mcMMO.placeStore.isTrue(block)) {
-                mat = Material.getMaterial(id);
-                xp = Config.getInstance().getHerbalismXPPumpkin();
-            }
-            break;
-
-        case RED_ROSE:
-        case YELLOW_FLOWER:
-            if (!mcMMO.placeStore.isTrue(block)) {
-                mat = Material.getMaterial(id);
-                xp = Config.getInstance().getHerbalismXPFlowers();
-            }
-            break;
-
-        case SUGAR_CANE_BLOCK:
-            for (int y = 0;  y <= 2; y++) {
-                Block b = block.getRelative(0, y, 0);
-                if (b.getType().equals(Material.SUGAR_CANE_BLOCK)) {
-                    mat = Material.SUGAR_CANE;
-                    if (!mcMMO.placeStore.isTrue(b)) {
-                        if (chance > Misc.getRandom().nextInt(activationChance)) {
-                            caneDrops++;
-                        }
-                        xp += Config.getInstance().getHerbalismXPSugarCane();
-                    }
+            else {
+                if (!mcMMO.placeStore.isTrue(block)) {
+                    dropItem = herbalismBlock.getDropItem();
+                    xp = herbalismBlock.getXpGain();
                 }
             }
-            break;
-
-        case VINE:
-            if (!mcMMO.placeStore.isTrue(block)) {
-                mat = type;
-                xp = Config.getInstance().getHerbalismXPVines();
-            }
-            break;
-
-        case WATER_LILY:
-            if (!mcMMO.placeStore.isTrue(block)) {
-                mat = type;
-                xp = Config.getInstance().getHerbalismXPLilyPads();
-            }
-            break;
-
-        case COCOA:
-            mat = type;
-            xp = Config.getInstance().getHerbalismXPCocoa();
-
-            if (Permissions.greenThumbCocoa(player)) {
-                greenThumbWheat(block, player, event, plugin);
-            }
-            break;
-
-        case CARROT:
-            mat = Material.CARROT;
-            xp = Config.getInstance().getHerbalismXPCarrot();
-
-            if (Permissions.greenThumbCarrots(player)) {
-                greenThumbWheat(block, player, event, plugin);
-            }
-            break;
-
-        case POTATO:
-            mat = Material.POTATO;
-            xp = Config.getInstance().getHerbalismXPPotato();
-
-            if (Permissions.greenThumbPotatoes(player)) {
-                greenThumbWheat(block, player, event, plugin);
-            }
-            break;
-
-        default:
-            // We REALLY shouldn't have to check this again, given that we check it in the BlockChecks before this function is even called.
-            // Safe to remove?
-
-            ItemStack item = (new MaterialData(block.getTypeId(), block.getData())).toItemStack(1);
-
-            if (Config.getInstance().getBlockModsEnabled() && CustomBlocksConfig.getInstance().customHerbalismBlocks.contains(item)) {
-                customPlant = true;
-                xp = ModChecks.getCustomBlock(block).getXpGain();
-            }
-            break;
         }
-
-        if (mat == null && !customPlant) {
-            return;
+        else {
+            customBlock = ModChecks.getCustomBlock(block);
+            dropItem = customBlock.getItemDrop();
+            xp = customBlock.getXpGain();
         }
 
         if (Permissions.herbalismDoubleDrops(player)) {
-            ItemStack is = null;
-
-            if (customPlant) {
-                is = new ItemStack(ModChecks.getCustomBlock(block).getItemDrop());
-            }
-            else {
-                if (mat == Material.COCOA) {
-                    try {
-                        is = new ItemStack(Material.INK_SACK, 1, DyeColor.BROWN.getDyeData());
-                    }
-                    catch (Exception e) {
-                        is = new ItemStack(Material.INK_SACK, 1, (short) 3);
-                    }
-                    catch (NoSuchMethodError e) {
-                        is = new ItemStack(Material.INK_SACK, 1, (short) 3);
-                    }
-                }
-                else if (mat == Material.CARROT) {
-                    is = new ItemStack(Material.CARROT_ITEM);
-                }
-                else if (mat == Material.POTATO) {
-                    is = new ItemStack(Material.POTATO_ITEM);
-                }
-                else {
-                    is = new ItemStack(mat);
-                }
-            }
+            int activationChance = Misc.calculateActivationChance(Permissions.luckyHerbalism(player));
+            double chance = (doubleDropsMaxChance / doubleDropsMaxLevel) * Misc.skillCheck(herbLevel, doubleDropsMaxLevel);
 
             if (chance > Misc.getRandom().nextInt(activationChance)) {
-                Config configInstance = Config.getInstance();
-
-                switch (type) {
-                case BROWN_MUSHROOM:
-                    if (configInstance.getBrownMushroomsDoubleDropsEnabled()) {
-                        Misc.dropItem(location, is);
-                    }
-                    break;
-
-                case CACTUS:
-                    if (configInstance.getCactiDoubleDropsEnabled()) {
-                        Misc.dropItems(location, is, catciDrops);
-                    }
-                    break;
-
-                case CROPS:
-                    if (configInstance.getWheatDoubleDropsEnabled()) {
-                        Misc.dropItem(location, is);
-                    }
-                    break;
-
-                case MELON_BLOCK:
-                    if (configInstance.getMelonsDoubleDropsEnabled()) {
-                        Misc.dropItem(location, is);
-                    }
-                    break;
-
-                case NETHER_WARTS:
-                    if (configInstance.getNetherWartsDoubleDropsEnabled()) {
-                        Misc.dropItem(location, is);
-                    }
-                    break;
-
-                case PUMPKIN:
-                    if (configInstance.getPumpkinsDoubleDropsEnabled()) {
-                        Misc.dropItem(location, is);
-                    }
-                    break;
-
-                case RED_MUSHROOM:
-                    if (configInstance.getRedMushroomsDoubleDropsEnabled()) {
-                        Misc.dropItem(location, is);
-                    }
-                    break;
-
-                case SUGAR_CANE_BLOCK:
-                    if (configInstance.getSugarCaneDoubleDropsEnabled()) {
-                        Misc.dropItems(location, is, caneDrops);
-                    }
-                    break;
-
-                case VINE:
-                    if (configInstance.getVinesDoubleDropsEnabled()) {
-                        Misc.dropItem(location, is);
-                    }
-                    break;
-
-                case WATER_LILY:
-                    if (configInstance.getWaterLiliesDoubleDropsEnabled()) {
-                        Misc.dropItem(location, is);
-                    }
-                    break;
+                Location location = block.getLocation();
 
-                case YELLOW_FLOWER:
-                    if (configInstance.getYellowFlowersDoubleDropsEnabled()) {
-                        Misc.dropItem(location, is);
-                    }
-                    break;
-
-                case COCOA:
-                    if (configInstance.getCocoaDoubleDropsEnabled()) {
-                        Misc.dropItem(location, is);
-                    }
-                    break;
+                if (herbalismBlock != null && herbalismBlock.canDoubleDrop()) {
+                    Misc.dropItems(location, dropItem, dropAmount);
+                }
+                else if (customBlock != null){
+                    int minimumDropAmount = customBlock.getMinimumDropAmount();
+                    int maximumDropAmount = customBlock.getMaximumDropAmount();
 
-                case CARROT:
-                    if (configInstance.getCarrotDoubleDropsEnabled()) {
-                        Misc.dropItem(location, is);
+                    if (minimumDropAmount != maximumDropAmount) {
+                        Misc.randomDropItems(location, dropItem, 50, maximumDropAmount - minimumDropAmount);
                     }
-                    break;
 
-                case POTATO:
-                    if (configInstance.getPotatoDoubleDropsEnabled()) {
-                        Misc.dropItem(location, is);
-                    }
-                    break;
-
-                default:
-                    if (customPlant) {
-                        CustomBlock customBlock = ModChecks.getCustomBlock(block);
-                        int minimumDropAmount = customBlock.getMinimumDropAmount();
-                        int maximumDropAmount = customBlock.getMaximumDropAmount();
-
-                        is = customBlock.getItemDrop();
-
-                        if (minimumDropAmount != maximumDropAmount) {
-                            Misc.dropItems(location, is, minimumDropAmount);
-                            Misc.randomDropItems(location, is, 50, maximumDropAmount - minimumDropAmount);
-                        }
-                        else {
-                            Misc.dropItems(location, is, minimumDropAmount);
-                        }
-                    }
-                    break;
+                    Misc.dropItems(location, dropItem, minimumDropAmount);
                 }
             }
         }
 
-        if (Config.getInstance().getHerbalismAFKDisabled() && player.isInsideVehicle())
-            return;
-
         SkillTools.xpProcessing(player, profile, SkillType.HERBALISM, xp);
     }
 

+ 90 - 0
src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismBlock.java

@@ -0,0 +1,90 @@
+package com.gmail.nossr50.skills.herbalism;
+
+import java.util.Map;
+
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+import com.gmail.nossr50.config.Config;
+import com.gmail.nossr50.util.Permissions;
+
+import com.google.common.collect.Maps;
+
+public enum HerbalismBlock {
+    BROWN_MUSHROOM(Material.BROWN_MUSHROOM, Config.getInstance().getHerbalismXPMushrooms(), Config.getInstance().getBrownMushroomsDoubleDropsEnabled()),
+    CACTUS(Material.CACTUS, Config.getInstance().getHerbalismXPCactus(), Config.getInstance().getCactiDoubleDropsEnabled()),
+    CARROT(Material.CARROT, Material.CARROT_ITEM, Config.getInstance().getHerbalismXPCarrot(), Config.getInstance().getCarrotDoubleDropsEnabled()),
+    COCOA(Material.COCOA, new ItemStack(Material.INK_SACK, 1, (short) 3), Config.getInstance().getHerbalismXPCocoa(), Config.getInstance().getCocoaDoubleDropsEnabled()), //Change to DyeColor.BROWN once we remove backwards compatibility
+    CROPS(Material.CROPS, Material.WHEAT, Config.getInstance().getHerbalismXPWheat(), Config.getInstance().getWheatDoubleDropsEnabled()),
+    MELON_BLOCK(Material.MELON_BLOCK, Material.MELON, Config.getInstance().getHerbalismXPMelon(), Config.getInstance().getMelonsDoubleDropsEnabled()),
+    NETHER_WARTS(Material.NETHER_WARTS, Material.NETHER_STALK, Config.getInstance().getHerbalismXPNetherWart(), Config.getInstance().getNetherWartsDoubleDropsEnabled()),
+    POTATO(Material.POTATO, Material.POTATO_ITEM, Config.getInstance().getHerbalismXPPotato(), Config.getInstance().getPotatoDoubleDropsEnabled()),
+    PUMPKIN(Material.PUMPKIN, Config.getInstance().getHerbalismXPPumpkin(), Config.getInstance().getPumpkinsDoubleDropsEnabled()),
+    RED_MUSHROOM(Material.RED_MUSHROOM, Config.getInstance().getHerbalismXPMushrooms(), Config.getInstance().getRedMushroomsDoubleDropsEnabled()),
+    RED_ROSE(Material.RED_ROSE, Config.getInstance().getHerbalismXPFlowers(), Config.getInstance().getRedRosesDoubleDropsEnabled()),
+    SUGAR_CANE_BLOCK(Material.SUGAR_CANE_BLOCK, Material.SUGAR_CANE, Config.getInstance().getHerbalismXPSugarCane(), Config.getInstance().getSugarCaneDoubleDropsEnabled()),
+    VINE(Material.VINE, Config.getInstance().getHerbalismXPVines(), Config.getInstance().getVinesDoubleDropsEnabled()),
+    WATER_LILY(Material.WATER_LILY, Config.getInstance().getHerbalismXPLilyPads(), Config.getInstance().getWaterLiliesDoubleDropsEnabled()),
+    YELLOW_FLOWER(Material.YELLOW_FLOWER, Config.getInstance().getHerbalismXPFlowers(), Config.getInstance().getYellowFlowersDoubleDropsEnabled());
+
+    private Material blockType;
+    private ItemStack dropItem;
+    private int xpGain;
+    private boolean doubleDropsEnabled;
+    private final static Map<Material, HerbalismBlock> BY_MATERIAL = Maps.newHashMap();
+
+    private HerbalismBlock(Material blockType, int xpGain, boolean doubleDropsEnabled) {
+        this(blockType, new ItemStack(blockType), xpGain, doubleDropsEnabled);
+    }
+
+    private HerbalismBlock(Material blockType, Material dropType, int xpGain, boolean doubleDropsEnabled) {
+        this(blockType, new ItemStack(dropType), xpGain, doubleDropsEnabled);
+    }
+
+    private HerbalismBlock(Material blockType, ItemStack dropItem, int xpGain, boolean doubleDropsEnabled) {
+        this.blockType = blockType;
+        this.dropItem = dropItem;
+        this.xpGain = xpGain;
+        this.doubleDropsEnabled = doubleDropsEnabled;
+    }
+
+    static {
+        for (HerbalismBlock herbalismBlock : values()) {
+            BY_MATERIAL.put(herbalismBlock.blockType, herbalismBlock);
+        }
+    }
+
+    public ItemStack getDropItem() {
+        return dropItem;
+    }
+
+    public int getXpGain() {
+        return xpGain;
+    }
+
+    public boolean canDoubleDrop() {
+        return doubleDropsEnabled;
+    }
+
+    public boolean hasGreenThumbPermission(Player player) {
+        switch (this) {
+        case CARROT:
+            return Permissions.greenThumbCarrots(player);
+        case COCOA:
+            return Permissions.greenThumbCocoa(player);
+        case CROPS:
+            return Permissions.greenThumbWheat(player);
+        case POTATO:
+            return Permissions.greenThumbPotatoes(player);
+        case NETHER_WARTS:
+            return Permissions.greenThumbNetherwart(player);
+        default:
+            return false;
+        }
+    }
+
+    public static HerbalismBlock getHerbalismBlock(Material blockType) {
+        return BY_MATERIAL.get(blockType);
+    }
+}