1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 11:45:51 +00:00

Fixed Explosive Shovel duplication bug

This commit is contained in:
TheBusyBiscuit 2019-09-01 18:53:02 +02:00
parent d9ce39f93b
commit 2056e62e01
3 changed files with 204 additions and 1 deletions

View File

@ -0,0 +1,106 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.List;
import java.util.Random;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory;
import me.mrCookieSlime.CSCoreLibPlugin.general.String.StringUtils;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.HandledBlock;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable;
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun;
public class ExplosivePickaxe extends SlimefunItem implements NotPlaceable {
private String[] blacklist;
private boolean damageOnUse;
public ExplosivePickaxe(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) {
super(category, item, id, recipeType, recipe, keys, values);
}
@Override
public void register(boolean slimefun) {
Random random = new Random();
addItemHandler(new BlockBreakHandler() {
@Override
public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List<ItemStack> drops) {
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.EXPLOSIVE_PICKAXE, true)) {
e.getBlock().getWorld().createExplosion(e.getBlock().getLocation(), 0.0F);
e.getBlock().getWorld().playSound(e.getBlock().getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1F, 1F);
for (int x = -1; x <= 1; x++) {
for (int y = -1; y <= 1; y++) {
for (int z = -1; z <= 1; z++) {
Block b = e.getBlock().getRelative(x, y, z);
if (b.getType() != Material.AIR && !b.isLiquid() && !StringUtils.equals(b.getType().toString(), blacklist) && CSCoreLib.getLib().getProtectionManager().canBuild(e.getPlayer().getUniqueId(), b)) {
if (SlimefunPlugin.getHooks().isCoreProtectInstalled()) {
SlimefunPlugin.getHooks().getCoreProtectAPI().logRemoval(e.getPlayer().getName(), b.getLocation(), b.getType(), b.getBlockData());
}
b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType());
SlimefunItem sfItem = BlockStorage.check(b);
boolean allow = false;
if (sfItem != null && !(sfItem instanceof HandledBlock)) {
if (SlimefunPlugin.getUtilities().blockHandlers.containsKey(sfItem.getID())) {
allow = SlimefunPlugin.getUtilities().blockHandlers.get(sfItem.getID()).onBreak(e.getPlayer(), e.getBlock(), sfItem, UnregisterReason.PLAYER_BREAK);
}
if (allow) {
drops.add(BlockStorage.retrieve(e.getBlock()));
}
}
else if (b.getType() == Material.PLAYER_HEAD) {
b.breakNaturally();
}
else if (b.getType().name().endsWith("_SHULKER_BOX")) {
b.breakNaturally();
}
else {
for (ItemStack drop: b.getDrops()) {
b.getWorld().dropItemNaturally(b.getLocation(), (b.getType().toString().endsWith("_ORE") && b.getType() != Material.IRON_ORE && b.getType() != Material.GOLD_ORE) ? new CustomItem(drop, fortune): drop);
}
b.setType(Material.AIR);
}
if (damageOnUse && !item.getEnchantments().containsKey(Enchantment.DURABILITY) || random.nextInt(100) <= (60 + 40 / (item.getEnchantmentLevel(Enchantment.DURABILITY) + 1))) {
PlayerInventory.damageItemInHand(e.getPlayer());
}
}
}
}
}
PlayerInventory.update(e.getPlayer());
return true;
}
else return false;
}
});
super.register(slimefun);
damageOnUse = ((Boolean) Slimefun.getItemValue(getID(), "damage-on-use"));
Object value = Slimefun.getItemValue(getID(), "unbreakable-blocks");
blacklist = ((List<?>) value).stream().toArray(String[]::new);
}
}

View File

@ -0,0 +1,90 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.List;
import java.util.Random;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.materials.MaterialTools;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable;
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.Slimefun;
public class ExplosiveShovel extends SlimefunItem implements NotPlaceable {
private boolean damageOnUse;
public ExplosiveShovel(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) {
super(category, item, id, recipeType, recipe, keys, values);
}
@Override
public void register(boolean slimefun) {
Random random = new Random();
addItemHandler(new BlockBreakHandler() {
@Override
public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List<ItemStack> drops) {
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.EXPLOSIVE_SHOVEL, true)) {
e.getBlock().getWorld().createExplosion(e.getBlock().getLocation(), 0.0F);
e.getBlock().getWorld().playSound(e.getBlock().getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1F, 1F);
for (int x = -1; x <= 1; x++) {
for (int y = -1; y <= 1; y++) {
for (int z = -1; z <= 1; z++) {
Block b = e.getBlock().getRelative(x, y, z);
boolean correctType = false;
for (Material mat : MaterialTools.getShovelItems()) {
if (b.getType() == mat) {
correctType = true;
break;
}
}
if (correctType) {
if (CSCoreLib.getLib().getProtectionManager().canBuild(e.getPlayer().getUniqueId(), b)) {
if (SlimefunPlugin.getHooks().isCoreProtectInstalled()) {
SlimefunPlugin.getHooks().getCoreProtectAPI().logRemoval(e.getPlayer().getName(), b.getLocation(), b.getType(), b.getBlockData());
}
b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType());
for (ItemStack drop: b.getDrops()) {
b.getWorld().dropItemNaturally(b.getLocation(), drop);
}
b.setType(Material.AIR);
if (damageOnUse) {
if (!item.getEnchantments().containsKey(Enchantment.DURABILITY) || random.nextInt(100) <= (60 + 40 / (item.getEnchantmentLevel(Enchantment.DURABILITY) + 1))) {
PlayerInventory.damageItemInHand(e.getPlayer());
}
}
}
}
}
}
}
PlayerInventory.update(e.getPlayer());
return true;
}
else return false;
}
});
super.register(slimefun);
damageOnUse = ((Boolean) Slimefun.getItemValue(getID(), "damage-on-use"));
}
}

View File

@ -12,6 +12,7 @@ import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectionManager;
import io.github.thebusybiscuit.cscorelib2.updater.BukkitUpdater; import io.github.thebusybiscuit.cscorelib2.updater.BukkitUpdater;
import io.github.thebusybiscuit.cscorelib2.updater.GitHubBuildsUpdater; import io.github.thebusybiscuit.cscorelib2.updater.GitHubBuildsUpdater;
import io.github.thebusybiscuit.cscorelib2.updater.Updater; import io.github.thebusybiscuit.cscorelib2.updater.Updater;
@ -86,6 +87,7 @@ public final class SlimefunPlugin extends JavaPlugin {
private Config config; private Config config;
public GPSNetwork gps = new GPSNetwork(); public GPSNetwork gps = new GPSNetwork();
private ProtectionManager protections;
private Utilities utilities = new Utilities(); private Utilities utilities = new Utilities();
private Settings settings; private Settings settings;
private SlimefunHooks hooks; private SlimefunHooks hooks;
@ -186,7 +188,7 @@ public final class SlimefunPlugin extends JavaPlugin {
try { try {
SlimefunSetup.setupItems(); SlimefunSetup.setupItems();
} catch (Exception x) { } catch (Exception x) {
getLogger().log(Level.SEVERE, "An Error occured while initializing SlimefunItems for Slimefun " + Slimefun.getVersion()); getLogger().log(Level.SEVERE, "An Error occured while initializing SlimefunItems for Slimefun " + Slimefun.getVersion(), x);
} }
MiscSetup.loadDescriptions(); MiscSetup.loadDescriptions();
@ -240,6 +242,7 @@ public final class SlimefunPlugin extends JavaPlugin {
// Initiating various Stuff and all Items with a slightly delay (0ms after the Server finished loading) // Initiating various Stuff and all Items with a slightly delay (0ms after the Server finished loading)
getServer().getScheduler().scheduleSyncDelayedTask(this, () -> { getServer().getScheduler().scheduleSyncDelayedTask(this, () -> {
protections = new ProtectionManager(getServer());
MiscSetup.loadItems(settings); MiscSetup.loadItems(settings);
for (World world: Bukkit.getWorlds()) { for (World world: Bukkit.getWorlds()) {
@ -428,4 +431,8 @@ public final class SlimefunPlugin extends JavaPlugin {
return instance != null; return instance != null;
} }
public static ProtectionManager getProtectionManager() {
return instance.protections;
}
} }