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:
parent
d9ce39f93b
commit
2056e62e01
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user