浏览代码

Moving the center of block drops to block center. Fixes #2544.

Sid Shakal 9 年之前
父节点
当前提交
123a139e43

+ 1 - 1
src/main/java/com/gmail/nossr50/listeners/PlayerListener.java

@@ -460,7 +460,7 @@ public class PlayerListener implements Listener {
                         // Make sure the player knows what he's doing when trying to salvage an enchanted item
                         // Make sure the player knows what he's doing when trying to salvage an enchanted item
                         if (!(heldItem.getEnchantments().size() > 0) || salvageManager.checkConfirmation(true)) {
                         if (!(heldItem.getEnchantments().size() > 0) || salvageManager.checkConfirmation(true)) {
                             SkillUtils.handleAbilitySpeedDecrease(player);
                             SkillUtils.handleAbilitySpeedDecrease(player);
-                            salvageManager.handleSalvage(block.getLocation(), heldItem);
+                            salvageManager.handleSalvage(Misc.getBlockCenter(block.getState()), heldItem);
                             player.updateInventory();
                             player.updateInventory();
                         }
                         }
                     }
                     }

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java

@@ -34,7 +34,7 @@ public class ExcavationManager extends SkillManager {
 
 
             if (!treasures.isEmpty()) {
             if (!treasures.isEmpty()) {
                 int skillLevel = getSkillLevel();
                 int skillLevel = getSkillLevel();
-                Location location = blockState.getLocation();
+                Location location = Misc.getBlockCenter(blockState);
 
 
                 for (ExcavationTreasure treasure : treasures) {
                 for (ExcavationTreasure treasure : treasures) {
                     if (skillLevel >= treasure.getDropLevel() && SkillUtils.treasureDropSuccessful(getPlayer(), treasure.getDropChance(), activationChance)) {
                     if (skillLevel >= treasure.getDropLevel() && SkillUtils.treasureDropSuccessful(getPlayer(), treasure.getDropChance(), activationChance)) {

+ 2 - 2
src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java

@@ -181,7 +181,7 @@ public class HerbalismManager extends SkillManager {
         for (int i = greenTerra ? 2 : 1; i != 0; i--) {
         for (int i = greenTerra ? 2 : 1; i != 0; i--) {
             if (SkillUtils.activationSuccessful(SecondaryAbility.HERBALISM_DOUBLE_DROPS, getPlayer(), getSkillLevel(), activationChance)) {
             if (SkillUtils.activationSuccessful(SecondaryAbility.HERBALISM_DOUBLE_DROPS, getPlayer(), getSkillLevel(), activationChance)) {
                 for (ItemStack item : drops) {
                 for (ItemStack item : drops) {
-                    Misc.dropItems(blockState.getLocation(), item, amount);
+                    Misc.dropItems(Misc.getBlockCenter(blockState), item, amount);
                 }
                 }
             }
             }
         }
         }
@@ -246,7 +246,7 @@ public class HerbalismManager extends SkillManager {
             return false;
             return false;
         }
         }
         int skillLevel = getSkillLevel();
         int skillLevel = getSkillLevel();
-        Location location = blockState.getLocation();
+        Location location = Misc.getBlockCenter(blockState);
 
 
         for (HylianTreasure treasure : treasures) {
         for (HylianTreasure treasure : treasures) {
             if (skillLevel >= treasure.getDropLevel() && SkillUtils.treasureDropSuccessful(getPlayer(), treasure.getDropChance(), activationChance)) {
             if (skillLevel >= treasure.getDropLevel() && SkillUtils.treasureDropSuccessful(getPlayer(), treasure.getDropChance(), activationChance)) {

+ 6 - 6
src/main/java/com/gmail/nossr50/skills/mining/Mining.java

@@ -51,7 +51,7 @@ public class Mining {
 
 
             case GLOWING_REDSTONE_ORE:
             case GLOWING_REDSTONE_ORE:
                 if (Config.getInstance().getDoubleDropsEnabled(SkillType.MINING, Material.REDSTONE_ORE)) {
                 if (Config.getInstance().getDoubleDropsEnabled(SkillType.MINING, Material.REDSTONE_ORE)) {
-                    Misc.dropItem(blockState.getLocation(), new ItemStack(Material.REDSTONE_ORE));
+                    Misc.dropItem(Misc.getBlockCenter(blockState), new ItemStack(Material.REDSTONE_ORE));
                 }
                 }
                 return;
                 return;
 
 
@@ -65,12 +65,12 @@ public class Mining {
             case REDSTONE_ORE:
             case REDSTONE_ORE:
             case STONE:
             case STONE:
             case PRISMARINE:
             case PRISMARINE:
-                Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack(1));
+                Misc.dropItem(Misc.getBlockCenter(blockState), blockState.getData().toItemStack(1));
                 return;
                 return;
 
 
             default:
             default:
                 if (mcMMO.getModManager().isCustomMiningBlock(blockState)) {
                 if (mcMMO.getModManager().isCustomMiningBlock(blockState)) {
-                    Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack(1));
+                    Misc.dropItem(Misc.getBlockCenter(blockState), blockState.getData().toItemStack(1));
                 }
                 }
                 return;
                 return;
         }
         }
@@ -101,18 +101,18 @@ public class Mining {
             case STAINED_CLAY:
             case STAINED_CLAY:
             case STONE:
             case STONE:
             case QUARTZ_ORE:
             case QUARTZ_ORE:
-                Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
+                Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops());
                 return;
                 return;
 
 
             case GLOWING_REDSTONE_ORE:
             case GLOWING_REDSTONE_ORE:
                 if (Config.getInstance().getDoubleDropsEnabled(SkillType.MINING, Material.REDSTONE_ORE)) {
                 if (Config.getInstance().getDoubleDropsEnabled(SkillType.MINING, Material.REDSTONE_ORE)) {
-                    Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
+                    Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops());
                 }
                 }
                 return;
                 return;
 
 
             default:
             default:
                 if (mcMMO.getModManager().isCustomMiningBlock(blockState)) {
                 if (mcMMO.getModManager().isCustomMiningBlock(blockState)) {
-                    Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
+                    Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops());
                 }
                 }
                 return;
                 return;
         }
         }

+ 2 - 2
src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java

@@ -148,7 +148,7 @@ public class MiningManager extends SkillManager {
                     xp += Mining.getBlockXp(blockState);
                     xp += Mining.getBlockXp(blockState);
                 }
                 }
 
 
-                Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack(1)); // Initial block that would have been dropped
+                Misc.dropItem(Misc.getBlockCenter(blockState), blockState.getData().toItemStack(1)); // Initial block that would have been dropped
 
 
                 if (!mcMMO.getPlaceStore().isTrue(blockState)) {
                 if (!mcMMO.getPlaceStore().isTrue(blockState)) {
                     for (int i = 1; i < dropMultiplier; i++) {
                     for (int i = 1; i < dropMultiplier; i++) {
@@ -161,7 +161,7 @@ public class MiningManager extends SkillManager {
         if (debrisYield > 0) {
         if (debrisYield > 0) {
             for (BlockState blockState : debris) {
             for (BlockState blockState : debris) {
                 if (Misc.getRandom().nextFloat() < debrisYield) {
                 if (Misc.getRandom().nextFloat() < debrisYield) {
-                    Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
+                    Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops());
                 }
                 }
             }
             }
         }
         }

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java

@@ -85,7 +85,7 @@ public class SmeltingManager extends SkillManager {
 
 
             SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), Config.getInstance().getAbilityToolDamage());
             SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), Config.getInstance().getAbilityToolDamage());
 
 
-            Misc.dropItems(blockState.getLocation(), item, isSecondSmeltSuccessful() ? 2 : 1);
+            Misc.dropItems(Misc.getBlockCenter(blockState), item, isSecondSmeltSuccessful() ? 2 : 1);
 
 
             blockState.setType(Material.AIR);
             blockState.setType(Material.AIR);
 
 

+ 2 - 2
src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java

@@ -72,7 +72,7 @@ public final class Woodcutting {
      */
      */
     protected static void checkForDoubleDrop(BlockState blockState) {
     protected static void checkForDoubleDrop(BlockState blockState) {
         if (mcMMO.getModManager().isCustomLog(blockState) && mcMMO.getModManager().getBlock(blockState).isDoubleDropEnabled()) {
         if (mcMMO.getModManager().isCustomLog(blockState) && mcMMO.getModManager().getBlock(blockState).isDoubleDropEnabled()) {
-            Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
+            Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops());
         }
         }
         else {
         else {
             //TODO Remove this workaround when casting to Tree works again
             //TODO Remove this workaround when casting to Tree works again
@@ -91,7 +91,7 @@ public final class Woodcutting {
             }
             }
 
 
             if (Config.getInstance().getWoodcuttingDoubleDropsEnabled(species)) {
             if (Config.getInstance().getWoodcuttingDoubleDropsEnabled(species)) {
-                Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
+                Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops());
             }
             }
         }
         }
     }
     }

+ 5 - 5
src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java

@@ -125,7 +125,7 @@ public class WoodcuttingManager extends SkillManager {
 
 
             if (material == Material.HUGE_MUSHROOM_1 || material == Material.HUGE_MUSHROOM_2) {
             if (material == Material.HUGE_MUSHROOM_1 || material == Material.HUGE_MUSHROOM_2) {
                 xp += Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.TREE_FELLER);
                 xp += Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.TREE_FELLER);
-                Misc.dropItems(blockState.getLocation(), block.getDrops());
+                Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops());
             }
             }
             else if (mcMMO.getModManager().isCustomLog(blockState)) {
             else if (mcMMO.getModManager().isCustomLog(blockState)) {
                 if (canGetDoubleDrops()) {
                 if (canGetDoubleDrops()) {
@@ -135,10 +135,10 @@ public class WoodcuttingManager extends SkillManager {
                 CustomBlock customBlock = mcMMO.getModManager().getBlock(blockState);
                 CustomBlock customBlock = mcMMO.getModManager().getBlock(blockState);
                 xp = customBlock.getXpGain();
                 xp = customBlock.getXpGain();
 
 
-                Misc.dropItems(blockState.getLocation(), block.getDrops());
+                Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops());
             }
             }
             else if (mcMMO.getModManager().isCustomLeaf(blockState)) {
             else if (mcMMO.getModManager().isCustomLeaf(blockState)) {
-                Misc.dropItems(blockState.getLocation(), block.getDrops());
+                Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops());
             }
             }
             else {
             else {
                 //TODO Remove this workaround when casting to Tree works again
                 //TODO Remove this workaround when casting to Tree works again
@@ -154,12 +154,12 @@ public class WoodcuttingManager extends SkillManager {
                             Woodcutting.checkForDoubleDrop(blockState);
                             Woodcutting.checkForDoubleDrop(blockState);
                         }
                         }
                         xp += Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.TREE_FELLER);
                         xp += Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.TREE_FELLER);
-                        Misc.dropItems(blockState.getLocation(), block.getDrops());
+                        Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops());
                         break;
                         break;
 
 
                     case LEAVES:
                     case LEAVES:
                     case LEAVES_2:
                     case LEAVES_2:
-                        Misc.dropItems(blockState.getLocation(), block.getDrops());
+                        Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops());
                         break;
                         break;
 
 
                     default:
                     default:

+ 6 - 1
src/main/java/com/gmail/nossr50/util/Misc.java

@@ -6,6 +6,7 @@ import java.util.Set;
 
 
 import org.bukkit.Location;
 import org.bukkit.Location;
 import org.bukkit.Material;
 import org.bukkit.Material;
+import org.bukkit.block.BlockState;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.Item;
 import org.bukkit.entity.Item;
 import org.bukkit.entity.NPC;
 import org.bukkit.entity.NPC;
@@ -17,7 +18,6 @@ import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.events.items.McMMOItemSpawnEvent;
 import com.gmail.nossr50.events.items.McMMOItemSpawnEvent;
 import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask;
 import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.player.UserManager;
-
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSet;
 
 
 public final class Misc {
 public final class Misc {
@@ -72,6 +72,11 @@ public final class Misc {
         return (first.getWorld() == second.getWorld()) && (first.distanceSquared(second) < (maxDistance * maxDistance) || maxDistance == 0);
         return (first.getWorld() == second.getWorld()) && (first.distanceSquared(second) < (maxDistance * maxDistance) || maxDistance == 0);
     }
     }
 
 
+    public static Location getBlockCenter(BlockState blockstate)
+    {
+        return blockstate.getLocation().add(0.5, 0.5, 0.5);
+    }
+
     public static void dropItems(Location location, Collection<ItemStack> drops) {
     public static void dropItems(Location location, Collection<ItemStack> drops) {
         for (ItemStack drop : drops) {
         for (ItemStack drop : drops) {
             dropItem(location, drop);
             dropItem(location, drop);