1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-19 19:25:48 +00:00

[CI skip] More refactoring

This commit is contained in:
TheBusyBiscuit 2020-01-12 11:01:29 +01:00
parent b94121e55b
commit fe6caccee9
9 changed files with 509 additions and 472 deletions

View File

@ -37,6 +37,7 @@
* Fixed #1355
* Fixed Localization mistakes
* Fixed #1366
* Fixed GitHub cache
## Release Candidate 4 (06 Jan 2020)
https://thebusybiscuit.github.io/builds/TheBusyBiscuit/Slimefun4/stable/#4

View File

@ -19,13 +19,11 @@ import me.mrCookieSlime.Slimefun.api.Slimefun;
public abstract class GitHubConnector {
protected final File file;
protected File file;
protected final GitHubService github;
public GitHubConnector(GitHubService github) {
this.github = github;
file = new File("plugins/Slimefun/cache/github/" + this.getFileName() + ".json");
}
public abstract String getFileName();
@ -38,6 +36,8 @@ public abstract class GitHubConnector {
}
public void pullFile() {
file = new File("plugins/Slimefun/cache/github/" + getFileName() + ".json");
if (github.isLoggingEnabled()) {
Slimefun.getLogger().log(Level.INFO, "Retrieving '" + this.getFileName() + ".json' from GitHub...");
}
@ -53,7 +53,7 @@ public abstract class GitHubConnector {
try (ReadableByteChannel channel = Channels.newChannel(connection.getInputStream())) {
try (FileOutputStream stream = new FileOutputStream(file)) {
stream.getChannel().transferFrom(channel, 0, Long.MAX_VALUE);
this.parseData();
parseData();
}
}
} catch (IOException e) {
@ -62,24 +62,24 @@ public abstract class GitHubConnector {
}
if (hasData()) {
this.parseData();
parseData();
}
else {
this.onFailure();
onFailure();
}
}
}
public boolean hasData() {
return this.getFile().exists();
return getFile().exists();
}
public File getFile() {
return this.file;
return file;
}
public void parseData() {
try (BufferedReader reader = new BufferedReader(new FileReader(this.getFile()))) {
try (BufferedReader reader = new BufferedReader(new FileReader(getFile()))) {
StringBuilder builder = new StringBuilder();
String line;
@ -88,11 +88,11 @@ public abstract class GitHubConnector {
}
JsonElement element = new JsonParser().parse(builder.toString());
this.onSuccess(element);
onSuccess(element);
}
catch (IOException x) {
Slimefun.getLogger().log(Level.SEVERE, "An Error occured while parsing GitHub-Data for Slimefun " + Slimefun.getVersion(), x);
this.onFailure();
onFailure();
}
}
}

View File

@ -1,63 +1,290 @@
package io.github.thebusybiscuit.slimefun4.implementation.listeners;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.Block;
import org.bukkit.entity.FallingBlock;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.TileState;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
import io.github.thebusybiscuit.slimefun4.utils.FireworkUtils;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
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.Objects.handlers.BlockPlaceHandler;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import me.mrCookieSlime.Slimefun.utils.Utilities;
public class BlockListener implements Listener {
// Materials that require a Block under it, e.g. Pressure Plates
private final Set<Material> sensitiveMaterials = new HashSet<>();
private final Utilities utilities;
public BlockListener(SlimefunPlugin plugin) {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
utilities = SlimefunPlugin.getUtilities();
sensitiveMaterials.add(Material.STONE_PRESSURE_PLATE);
sensitiveMaterials.add(Material.LIGHT_WEIGHTED_PRESSURE_PLATE);
sensitiveMaterials.add(Material.HEAVY_WEIGHTED_PRESSURE_PLATE);
sensitiveMaterials.addAll(Tag.SAPLINGS.getValues());
sensitiveMaterials.addAll(Tag.WOODEN_PRESSURE_PLATES.getValues());
}
@EventHandler
public void onBlockFall(EntityChangeBlockEvent event) {
if (event.getEntity() instanceof FallingBlock && BlockStorage.hasBlockInfo(event.getBlock())) {
event.setCancelled(true);
FallingBlock fb = (FallingBlock) event.getEntity();
if (fb.getDropItem()) {
fb.getWorld().dropItemNaturally(fb.getLocation(), new ItemStack(fb.getBlockData().getMaterial(), 1));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockRegister(BlockPlaceEvent e) {
if (BlockStorage.hasBlockInfo(e.getBlock())) {
e.setCancelled(true);
return;
}
}
@EventHandler
public void onPistonExtend(BlockPistonExtendEvent e) {
for (Block b : e.getBlocks()) {
if (BlockStorage.hasBlockInfo(b) || b.getRelative(e.getDirection()).getType() == Material.AIR && BlockStorage.hasBlockInfo(b.getRelative(e.getDirection()))) {
ItemStack item = e.getItemInHand();
SlimefunItem sfItem = SlimefunItem.getByItem(item);
if (sfItem != null && !sfItem.isDisabled() && !(sfItem instanceof NotPlaceable)) {
if (!Slimefun.hasUnlocked(e.getPlayer(), sfItem, true)) {
e.setCancelled(true);
return;
}
else {
BlockState state = e.getBlock().getState();
boolean supportsPersistentData = state instanceof TileState;
if (supportsPersistentData) {
SlimefunPlugin.getBlockDataService().setBlockData((TileState) state, sfItem.getID());
}
BlockStorage.addBlockInfo(e.getBlock(), "id", sfItem.getID(), true);
SlimefunBlockHandler blockHandler = utilities.blockHandlers.get(sfItem.getID());
if (blockHandler != null) {
blockHandler.onPlace(e.getPlayer(), e.getBlock(), sfItem);
}
else {
for (ItemHandler handler : SlimefunItem.getHandlers("BlockPlaceHandler")) {
if (((BlockPlaceHandler) handler).onBlockPlace(e, item)) break;
}
}
}
}
else {
for (ItemHandler handler : SlimefunItem.getHandlers("BlockPlaceHandler")) {
if (((BlockPlaceHandler) handler).onBlockPlace(e, item)) break;
}
}
}
@EventHandler
public void onPistonRetract(BlockPistonRetractEvent e) {
if (e.isSticky()) {
for (Block b : e.getBlocks()) {
if (BlockStorage.hasBlockInfo(b) || b.getRelative(e.getDirection()).getType() == Material.AIR && BlockStorage.hasBlockInfo(b.getRelative(e.getDirection()))) {
public void onBlockPlace(BlockPlaceEvent e) {
ItemStack item = e.getItemInHand();
if (utilities.cancelPlace.remove(e.getPlayer().getUniqueId()))
e.setCancelled(true);
if (SlimefunManager.isItemSimilar(item, SlimefunItems.BASIC_CIRCUIT_BOARD, true)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.ADVANCED_CIRCUIT_BOARD, true)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.PORTABLE_CRAFTER, true)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.PORTABLE_DUSTBIN, true)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.BACKPACK_SMALL, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.BACKPACK_MEDIUM, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.BACKPACK_LARGE, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.WOVEN_BACKPACK, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.GILDED_BACKPACK, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.RADIANT_BACKPACK, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.BOUND_BACKPACK, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.COOLER, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.ENDER_BACKPACK, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CARBON, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.COMPRESSED_CARBON, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CARBON_CHUNK, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.ANDROID_MEMORY_CORE, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.LAVA_CRYSTAL, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.TINY_URANIUM, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.SMALL_URANIUM, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.BROKEN_SPAWNER, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.GPS_MARKER_TOOL, true)) {
e.setCancelled(true);
Slimefun.getGPSNetwork().addWaypoint(e.getPlayer(), e.getBlock().getLocation());
}
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CHRISTMAS_PRESENT, false)) {
e.setCancelled(true);
if (e.getPlayer().getGameMode() != GameMode.CREATIVE) {
ItemUtils.consumeItem(item, false);
}
FireworkUtils.launchRandom(e.getPlayer(), 3);
List<ItemStack> gifts = new ArrayList<>();
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_HOT_CHOCOLATE, 1));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CHOCOLATE_APPLE, 4));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CARAMEL_APPLE, 4));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CAKE, 4));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_COOKIE, 8));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_PRESENT, 1));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_EGG_NOG, 1));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_MILK, 1));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_APPLE_CIDER, 1));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_FRUIT_CAKE, 4));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_APPLE_PIE, 4));
gifts.add(new ItemStack(Material.EMERALD));
e.getBlockPlaced().getWorld().dropItemNaturally(e.getBlockPlaced().getLocation(), gifts.get(ThreadLocalRandom.current().nextInt(gifts.size())));
}
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CARGO_INPUT, false)) {
if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
e.setCancelled(true);
}
}
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CARGO_OUTPUT, false)) {
if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
e.setCancelled(true);
}
}
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CARGO_OUTPUT_ADVANCED, false)) {
if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
e.setCancelled(true);
}
}
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CT_IMPORT_BUS, false) && e.getBlock().getY() != e.getBlockAgainst().getY()) {
SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
e.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent e) {
boolean allow = true;
List<ItemStack> drops = new ArrayList<>();
ItemStack item = e.getPlayer().getInventory().getItemInMainHand();
int fortune = 1;
Block block2 = e.getBlock().getRelative(BlockFace.UP);
if (sensitiveMaterials.contains(block2.getType())) {
SlimefunItem sfItem = BlockStorage.check(e.getBlock().getRelative(BlockFace.UP));
if (sfItem == null) {
BlockState state = block2.getState();
if (state instanceof TileState) {
Optional<String> blockData = SlimefunPlugin.getBlockDataService().getBlockData((TileState) state);
if (blockData.isPresent()) {
sfItem = SlimefunItem.getByID(blockData.get());
}
}
}
if (sfItem != null && !(sfItem instanceof HandledBlock)) {
SlimefunBlockHandler blockHandler = utilities.blockHandlers.get(sfItem.getID());
if (blockHandler != null) {
allow = blockHandler.onBreak(e.getPlayer(), block2, sfItem, UnregisterReason.PLAYER_BREAK);
}
if (allow) {
block2.getWorld().dropItemNaturally(block2.getLocation(), BlockStorage.retrieve(block2));
block2.setType(Material.AIR);
}
else {
e.setCancelled(true);
return;
}
}
}
}
@EventHandler
public void onLiquidFlow(BlockFromToEvent e) {
Block block = e.getToBlock();
String item = BlockStorage.checkID(block);
if (item != null) e.setCancelled(true);
SlimefunItem sfItem = BlockStorage.check(e.getBlock());
if (sfItem == null) {
BlockState state = e.getBlock().getState();
if (state instanceof TileState) {
Optional<String> blockData = SlimefunPlugin.getBlockDataService().getBlockData((TileState) state);
if (blockData.isPresent()) {
sfItem = SlimefunItem.getByID(blockData.get());
}
}
}
if (sfItem != null && !(sfItem instanceof HandledBlock)) {
SlimefunBlockHandler blockHandler = utilities.blockHandlers.get(sfItem.getID());
if (blockHandler != null) {
allow = blockHandler.onBreak(e.getPlayer(), e.getBlock(), sfItem, UnregisterReason.PLAYER_BREAK);
}
else {
// Walk over all registered block break handlers until one says that it'll handle it.
for (ItemHandler handler : SlimefunItem.getHandlers("BlockBreakHandler")) {
if (((BlockBreakHandler) handler).onBlockBreak(e, item, fortune, drops)) break;
}
}
if (allow) {
drops.addAll(sfItem.getDrops());
BlockStorage.clearBlockInfo(e.getBlock());
}
else {
e.setCancelled(true);
return;
}
}
else if (item != null) {
if (item.getEnchantments().containsKey(Enchantment.LOOT_BONUS_BLOCKS) && !item.getEnchantments().containsKey(Enchantment.SILK_TOUCH)) {
Random random = ThreadLocalRandom.current();
fortune = random.nextInt(item.getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS) + 2) - 1;
if (fortune <= 0) fortune = 1;
fortune = (e.getBlock().getType() == Material.LAPIS_ORE ? 4 + random.nextInt(5) : 1) * (fortune + 1);
}
for (ItemHandler handler : SlimefunItem.getHandlers("BlockBreakHandler")) {
if (((BlockBreakHandler) handler).onBlockBreak(e, item, fortune, drops)) break;
}
}
if (!drops.isEmpty()) {
e.getBlock().setType(Material.AIR);
if (e.isDropItems()) {
for (ItemStack drop : drops) {
if (drop != null) {
e.getBlock().getWorld().dropItemNaturally(e.getBlock().getLocation(), drop);
}
}
}
}
}
}

View File

@ -0,0 +1,93 @@
package io.github.thebusybiscuit.slimefun4.implementation.listeners;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Wither;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
public class BlockPhysicsListener implements Listener {
public BlockPhysicsListener(SlimefunPlugin plugin) {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@EventHandler
public void onBlockFall(EntityChangeBlockEvent e) {
if (e.getEntity() instanceof FallingBlock) {
if (SlimefunPlugin.getUtilities().blocks.contains(e.getEntity().getUniqueId())) {
e.setCancelled(true);
e.getEntity().remove();
}
else if (BlockStorage.hasBlockInfo(e.getBlock())) {
e.setCancelled(true);
FallingBlock fb = (FallingBlock) e.getEntity();
if (fb.getDropItem()) {
fb.getWorld().dropItemNaturally(fb.getLocation(), new ItemStack(fb.getBlockData().getMaterial(), 1));
}
}
}
}
@EventHandler
public void onPistonExtend(BlockPistonExtendEvent e) {
for (Block b : e.getBlocks()) {
if (BlockStorage.hasBlockInfo(b) || b.getRelative(e.getDirection()).getType() == Material.AIR && BlockStorage.hasBlockInfo(b.getRelative(e.getDirection()))) {
e.setCancelled(true);
return;
}
}
}
@EventHandler
public void onPistonRetract(BlockPistonRetractEvent e) {
if (e.isSticky()) {
for (Block b : e.getBlocks()) {
if (BlockStorage.hasBlockInfo(b) || b.getRelative(e.getDirection()).getType() == Material.AIR && BlockStorage.hasBlockInfo(b.getRelative(e.getDirection()))) {
e.setCancelled(true);
return;
}
}
}
}
@EventHandler
public void onLiquidFlow(BlockFromToEvent e) {
Block block = e.getToBlock();
String item = BlockStorage.checkID(block);
if (item != null) e.setCancelled(true);
}
@EventHandler
public void onBucketUse(PlayerBucketEmptyEvent e) {
// Fix for placing water on player heads
Location l = e.getBlockClicked().getRelative(e.getBlockFace()).getLocation();
if (BlockStorage.hasBlockInfo(l)) {
e.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onWitherDestroy(EntityChangeBlockEvent e) {
if (e.getEntity() instanceof Wither) {
String id = BlockStorage.checkID(e.getBlock());
if (id != null && id.startsWith("WITHER_PROOF_")) {
e.setCancelled(true);
}
}
}
}

View File

@ -0,0 +1,26 @@
package io.github.thebusybiscuit.slimefun4.implementation.listeners;
import org.bukkit.block.Hopper;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.inventory.InventoryHolder;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
public class IgnitionChamberListener implements Listener {
public IgnitionChamberListener(SlimefunPlugin plugin) {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@EventHandler
public void onIgnitionChamberItemMove(InventoryMoveItemEvent e) {
InventoryHolder holder = e.getInitiator().getHolder();
if (holder instanceof Hopper && BlockStorage.check(((Hopper) holder).getBlock(), "IGNITION_CHAMBER")) {
e.setCancelled(true);
}
}
}

View File

@ -1,37 +1,22 @@
package me.mrCookieSlime.Slimefun.listeners;
package io.github.thebusybiscuit.slimefun4.implementation.listeners;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BrewingStand;
import org.bukkit.block.Hopper;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.IronGolem;
import org.bukkit.entity.Player;
import org.bukkit.entity.Wither;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.inventory.PrepareItemCraftEvent;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
import org.bukkit.inventory.BrewerInventory;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.inventory.meta.PotionMeta;
@ -40,7 +25,6 @@ import org.bukkit.potion.PotionEffectType;
import io.github.thebusybiscuit.slimefun4.core.guide.GuideSettings;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.BackpackListener;
import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent;
import me.mrCookieSlime.Slimefun.SlimefunGuide;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
@ -62,47 +46,15 @@ import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu;
import me.mrCookieSlime.Slimefun.utils.Utilities;
public class ItemListener implements Listener {
public class SlimefunItemListener implements Listener {
private final Utilities utilities;
public ItemListener(SlimefunPlugin plugin) {
public SlimefunItemListener(SlimefunPlugin plugin) {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
utilities = SlimefunPlugin.getUtilities();
}
@EventHandler
public void onIgnitionChamberItemMove(InventoryMoveItemEvent e) {
InventoryHolder holder = e.getInitiator().getHolder();
if (holder instanceof Hopper && BlockStorage.check(((Hopper) holder).getBlock(), "IGNITION_CHAMBER")) {
e.setCancelled(true);
}
}
@EventHandler
public void onGrindstone(InventoryClickEvent e) {
if (e.getRawSlot() == 2 && e.getWhoClicked() instanceof Player && e.getInventory().getType() == InventoryType.GRINDSTONE) {
ItemStack slot0 = e.getInventory().getContents()[0];
ItemStack slot1 = e.getInventory().getContents()[1];
if (SlimefunItem.getByItem(slot0) != null && !SlimefunItem.isDisabled(slot0))
e.setCancelled(true);
else if (SlimefunItem.getByItem(slot1) != null && !SlimefunItem.isDisabled(slot1))
e.setCancelled(true);
if (SlimefunManager.isItemSimilar(slot0, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true))
e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(slot0, SlimefunGuide.getItem(SlimefunGuideLayout.CHEST), true))
e.setCancelled(true);
if (SlimefunManager.isItemSimilar(slot1, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true))
e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(slot1, SlimefunGuide.getItem(SlimefunGuideLayout.CHEST), true))
e.setCancelled(true);
}
}
/*
* Handles Left click use and checks for disabled items.
*/
@ -118,15 +70,6 @@ public class ItemListener implements Listener {
}
}
@EventHandler
public void onBucketUse(PlayerBucketEmptyEvent e) {
// Fix for placing water on player heads
Location l = e.getBlockClicked().getRelative(e.getBlockFace()).getLocation();
if (BlockStorage.hasBlockInfo(l)) {
e.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.NORMAL)
public void onRightClick(ItemUseEvent e) {
if (e.getParentEvent() != null && e.getParentEvent().getHand() != EquipmentSlot.HAND) {
@ -304,48 +247,6 @@ public class ItemListener implements Listener {
}
}
@EventHandler
public void onCraft(CraftItemEvent e) {
for (ItemStack item : e.getInventory().getContents()) {
SlimefunItem sfItem = SlimefunItem.getByItem(item);
if (sfItem != null && !sfItem.isUseableInWorkbench()) {
e.setCancelled(true);
SlimefunPlugin.getLocal().sendMessage((Player) e.getWhoClicked(), "workbench.not-enhanced", true);
break;
}
}
}
@EventHandler
public void onPrepareCraft(PrepareItemCraftEvent e) {
for (ItemStack item : e.getInventory().getContents()) {
SlimefunItem sfItem = SlimefunItem.getByItem(item);
if (sfItem != null && !sfItem.isUseableInWorkbench()) {
e.getInventory().setResult(null);
break;
}
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onEntityChangeBlock(EntityChangeBlockEvent e) {
if (e.getEntity() instanceof FallingBlock) {
if (utilities.blocks.contains(e.getEntity().getUniqueId())) {
e.setCancelled(true);
e.getEntity().remove();
}
}
else if (e.getEntity() instanceof Wither) {
String id = BlockStorage.checkID(e.getBlock());
if (id != null && id.startsWith("WITHER_PROOF_")) {
e.setCancelled(true);
}
}
}
@EventHandler
public void onIronGolemHeal(PlayerInteractEntityEvent e) {
if (e.getRightClicked() instanceof IronGolem) {
@ -375,38 +276,6 @@ public class ItemListener implements Listener {
}
}
@EventHandler
public void onAnvil(InventoryClickEvent e) {
if (e.getRawSlot() == 2 && e.getWhoClicked() instanceof Player && e.getInventory().getType() == InventoryType.ANVIL) {
ItemStack slot0 = e.getInventory().getContents()[0];
ItemStack slot1 = e.getInventory().getContents()[1];
if (SlimefunManager.isItemSimilar(slot0, SlimefunItems.ELYTRA, true)) return;
if (SlimefunItem.getByItem(slot0) != null && !SlimefunItem.isDisabled(slot0) ||
SlimefunItem.getByItem(slot1) != null && !SlimefunItem.isDisabled(slot1) ||
SlimefunManager.isItemSimilar(slot0, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true) ||
SlimefunManager.isItemSimilar(slot0, SlimefunGuide.getItem(SlimefunGuideLayout.CHEST), true)||
SlimefunManager.isItemSimilar(slot1, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true) ||
SlimefunManager.isItemSimilar(slot1, SlimefunGuide.getItem(SlimefunGuideLayout.CHEST), true)) {
e.setCancelled(true);
SlimefunPlugin.getLocal().sendMessage((Player) e.getWhoClicked(), "anvil.not-working", true);
}
}
}
@EventHandler(ignoreCancelled = true)
public void onPreBrew(InventoryClickEvent e) {
Inventory inventory = e.getInventory();
if (inventory instanceof BrewerInventory && inventory.getHolder() instanceof BrewingStand && e.getRawSlot() < inventory.getSize()) {
e.setCancelled(SlimefunItem.getByItem(e.getCursor()) != null);
}
}
@EventHandler
public void onItemDrop(PlayerDropItemEvent e) {
for (ItemHandler handler : SlimefunItem.getHandlers("ItemDropHandler")) {

View File

@ -0,0 +1,107 @@
package io.github.thebusybiscuit.slimefun4.implementation.listeners;
import org.bukkit.block.BrewingStand;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.inventory.PrepareItemCraftEvent;
import org.bukkit.inventory.BrewerInventory;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import me.mrCookieSlime.Slimefun.SlimefunGuide;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
public class VanillaMachinesListener implements Listener {
public VanillaMachinesListener(SlimefunPlugin plugin) {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@EventHandler(ignoreCancelled = true)
public void onGrindstone(InventoryClickEvent e) {
if (e.getRawSlot() == 2 && e.getWhoClicked() instanceof Player && e.getInventory().getType() == InventoryType.GRINDSTONE) {
ItemStack item1 = e.getInventory().getContents()[0];
ItemStack item2 = e.getInventory().getContents()[1];
if (checkForUnallowedItems(item1, item2)) {
e.setCancelled(true);
}
}
}
@EventHandler
public void onCraft(CraftItemEvent e) {
for (ItemStack item : e.getInventory().getContents()) {
SlimefunItem sfItem = SlimefunItem.getByItem(item);
if (sfItem != null && !sfItem.isUseableInWorkbench()) {
e.setCancelled(true);
SlimefunPlugin.getLocal().sendMessage((Player) e.getWhoClicked(), "workbench.not-enhanced", true);
break;
}
}
}
@EventHandler
public void onPrepareCraft(PrepareItemCraftEvent e) {
for (ItemStack item : e.getInventory().getContents()) {
SlimefunItem sfItem = SlimefunItem.getByItem(item);
if (sfItem != null && !sfItem.isUseableInWorkbench()) {
e.getInventory().setResult(null);
break;
}
}
}
@EventHandler
public void onAnvil(InventoryClickEvent e) {
if (e.getRawSlot() == 2 && e.getWhoClicked() instanceof Player && e.getInventory().getType() == InventoryType.ANVIL) {
ItemStack item1 = e.getInventory().getContents()[0];
ItemStack item2 = e.getInventory().getContents()[1];
if (!SlimefunManager.isItemSimilar(item1, SlimefunItems.ELYTRA, true) && checkForUnallowedItems(item1, item2)) {
e.setCancelled(true);
SlimefunPlugin.getLocal().sendMessage((Player) e.getWhoClicked(), "anvil.not-working", true);
}
}
}
@EventHandler(ignoreCancelled = true)
public void onPreBrew(InventoryClickEvent e) {
Inventory inventory = e.getInventory();
if (inventory instanceof BrewerInventory && inventory.getHolder() instanceof BrewingStand && e.getRawSlot() < inventory.getSize()) {
e.setCancelled(SlimefunItem.getByItem(e.getCursor()) != null);
}
}
private boolean checkForUnallowedItems(ItemStack item1, ItemStack item2) {
if (SlimefunManager.isItemSimilar(item1, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true))
return true;
else if (SlimefunManager.isItemSimilar(item1, SlimefunGuide.getItem(SlimefunGuideLayout.CHEST), true))
return true;
else if (SlimefunManager.isItemSimilar(item2, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true))
return true;
else if (SlimefunManager.isItemSimilar(item2, SlimefunGuide.getItem(SlimefunGuideLayout.CHEST), true))
return true;
else {
SlimefunItem sfItem1 = SlimefunItem.getByItem(item1);
SlimefunItem sfItem2 = SlimefunItem.getByItem(item2);
if ((sfItem1 != null && !sfItem1.isDisabled()) || (sfItem2 != null && !sfItem2.isDisabled())) {
return true;
}
}
return false;
}
}

View File

@ -32,6 +32,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.listeners.AndroidKillin
import io.github.thebusybiscuit.slimefun4.implementation.listeners.AutonomousToolsListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.BackpackListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.BlockListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.BlockPhysicsListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.CoolerListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.DamageListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.DeathpointListener;
@ -40,6 +41,8 @@ import io.github.thebusybiscuit.slimefun4.implementation.listeners.EnhancedFurna
import io.github.thebusybiscuit.slimefun4.implementation.listeners.ExplosionsListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.GearListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.GrapplingHookListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.IgnitionChamberListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.SlimefunItemListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.ItemPickupListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.MultiBlockListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.NetworkListener;
@ -50,6 +53,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.listeners.SlimefunGuide
import io.github.thebusybiscuit.slimefun4.implementation.listeners.SoulboundListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.TalismanListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.TeleporterListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.VanillaMachinesListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.WorldListener;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.Slimefun.GEO.OreGenSystem;
@ -71,8 +75,6 @@ import me.mrCookieSlime.Slimefun.api.Slimefun;
import me.mrCookieSlime.Slimefun.api.SlimefunBackup;
import me.mrCookieSlime.Slimefun.api.TickerTask;
import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu;
import me.mrCookieSlime.Slimefun.listeners.ItemListener;
import me.mrCookieSlime.Slimefun.listeners.ToolListener;
import me.mrCookieSlime.Slimefun.utils.ConfigCache;
import me.mrCookieSlime.Slimefun.utils.Utilities;
@ -213,14 +215,14 @@ public final class SlimefunPlugin extends JavaPlugin {
// All Slimefun Listeners
new SlimefunBootsListener(this);
new ItemListener(this);
new BlockListener(this);
new SlimefunItemListener(this);
new BlockPhysicsListener(this);
new MultiBlockListener(this);
new GearListener(this);
new AutonomousToolsListener(this);
new DamageListener(this);
new SlimefunBowListener(this);
new ToolListener(this);
new BlockListener(this);
new EnhancedFurnaceListener(this);
new TeleporterListener(this);
new AndroidKillingListener(this);
@ -229,6 +231,7 @@ public final class SlimefunPlugin extends JavaPlugin {
new DeathpointListener(this);
new ExplosionsListener(this);
new DebugFishListener(this);
new VanillaMachinesListener(this);
// Toggleable Listeners for performance
if (config.getBoolean("items.talismans")) new TalismanListener(this);
@ -257,6 +260,7 @@ public final class SlimefunPlugin extends JavaPlugin {
if (SlimefunItem.getByID("ANCIENT_ALTAR") != null) new AncientAltarListener(this);
if (SlimefunItem.getByID("GRAPPLING_HOOK") != null) new GrapplingHookListener(this);
if (SlimefunItem.getByID("IGNITION_CHAMBER") != null) new IgnitionChamberListener(this);
}, 0);
SlimefunCommand command = new SlimefunCommand(this);

View File

@ -1,290 +0,0 @@
package me.mrCookieSlime.Slimefun.listeners;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.TileState;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
import io.github.thebusybiscuit.slimefun4.utils.FireworkUtils;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
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.Objects.handlers.BlockPlaceHandler;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import me.mrCookieSlime.Slimefun.utils.Utilities;
public class ToolListener implements Listener {
// Materials that require a Block under it, e.g. Pressure Plates
private final Set<Material> sensitiveMaterials = new HashSet<>();
private final Utilities utilities;
public ToolListener(SlimefunPlugin plugin) {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
utilities = SlimefunPlugin.getUtilities();
sensitiveMaterials.add(Material.STONE_PRESSURE_PLATE);
sensitiveMaterials.add(Material.LIGHT_WEIGHTED_PRESSURE_PLATE);
sensitiveMaterials.add(Material.HEAVY_WEIGHTED_PRESSURE_PLATE);
sensitiveMaterials.addAll(Tag.SAPLINGS.getValues());
sensitiveMaterials.addAll(Tag.WOODEN_PRESSURE_PLATES.getValues());
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockRegister(BlockPlaceEvent e) {
if (BlockStorage.hasBlockInfo(e.getBlock())) {
e.setCancelled(true);
return;
}
ItemStack item = e.getItemInHand();
SlimefunItem sfItem = SlimefunItem.getByItem(item);
if (sfItem != null && !sfItem.isDisabled() && !(sfItem instanceof NotPlaceable)) {
if (!Slimefun.hasUnlocked(e.getPlayer(), sfItem, true)) {
e.setCancelled(true);
}
else {
BlockState state = e.getBlock().getState();
boolean supportsPersistentData = state instanceof TileState;
if (supportsPersistentData) {
SlimefunPlugin.getBlockDataService().setBlockData((TileState) state, sfItem.getID());
}
BlockStorage.addBlockInfo(e.getBlock(), "id", sfItem.getID(), true);
SlimefunBlockHandler blockHandler = utilities.blockHandlers.get(sfItem.getID());
if (blockHandler != null) {
blockHandler.onPlace(e.getPlayer(), e.getBlock(), sfItem);
}
else {
for (ItemHandler handler : SlimefunItem.getHandlers("BlockPlaceHandler")) {
if (((BlockPlaceHandler) handler).onBlockPlace(e, item)) break;
}
}
}
}
else {
for (ItemHandler handler : SlimefunItem.getHandlers("BlockPlaceHandler")) {
if (((BlockPlaceHandler) handler).onBlockPlace(e, item)) break;
}
}
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent e) {
ItemStack item = e.getItemInHand();
if (utilities.cancelPlace.remove(e.getPlayer().getUniqueId()))
e.setCancelled(true);
if (SlimefunManager.isItemSimilar(item, SlimefunItems.BASIC_CIRCUIT_BOARD, true)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.ADVANCED_CIRCUIT_BOARD, true)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.PORTABLE_CRAFTER, true)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.PORTABLE_DUSTBIN, true)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.BACKPACK_SMALL, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.BACKPACK_MEDIUM, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.BACKPACK_LARGE, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.WOVEN_BACKPACK, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.GILDED_BACKPACK, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.RADIANT_BACKPACK, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.BOUND_BACKPACK, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.COOLER, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.ENDER_BACKPACK, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CARBON, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.COMPRESSED_CARBON, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CARBON_CHUNK, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.ANDROID_MEMORY_CORE, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.LAVA_CRYSTAL, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.TINY_URANIUM, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.SMALL_URANIUM, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.BROKEN_SPAWNER, false)) e.setCancelled(true);
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.GPS_MARKER_TOOL, true)) {
e.setCancelled(true);
Slimefun.getGPSNetwork().addWaypoint(e.getPlayer(), e.getBlock().getLocation());
}
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CHRISTMAS_PRESENT, false)) {
e.setCancelled(true);
if (e.getPlayer().getGameMode() != GameMode.CREATIVE) {
ItemUtils.consumeItem(item, false);
}
FireworkUtils.launchRandom(e.getPlayer(), 3);
List<ItemStack> gifts = new ArrayList<>();
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_HOT_CHOCOLATE, 1));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CHOCOLATE_APPLE, 4));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CARAMEL_APPLE, 4));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CAKE, 4));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_COOKIE, 8));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_PRESENT, 1));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_EGG_NOG, 1));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_MILK, 1));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_APPLE_CIDER, 1));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_FRUIT_CAKE, 4));
gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_APPLE_PIE, 4));
gifts.add(new ItemStack(Material.EMERALD));
e.getBlockPlaced().getWorld().dropItemNaturally(e.getBlockPlaced().getLocation(), gifts.get(ThreadLocalRandom.current().nextInt(gifts.size())));
}
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CARGO_INPUT, false)) {
if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
e.setCancelled(true);
}
}
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CARGO_OUTPUT, false)) {
if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
e.setCancelled(true);
}
}
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CARGO_OUTPUT_ADVANCED, false)) {
if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
e.setCancelled(true);
}
}
else if (SlimefunManager.isItemSimilar(item, SlimefunItems.CT_IMPORT_BUS, false) && e.getBlock().getY() != e.getBlockAgainst().getY()) {
SlimefunPlugin.getLocal().sendMessage(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
e.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent e) {
boolean allow = true;
List<ItemStack> drops = new ArrayList<>();
ItemStack item = e.getPlayer().getInventory().getItemInMainHand();
int fortune = 1;
Block block2 = e.getBlock().getRelative(BlockFace.UP);
if (sensitiveMaterials.contains(block2.getType())) {
SlimefunItem sfItem = BlockStorage.check(e.getBlock().getRelative(BlockFace.UP));
if (sfItem == null) {
BlockState state = block2.getState();
if (state instanceof TileState) {
Optional<String> blockData = SlimefunPlugin.getBlockDataService().getBlockData((TileState) state);
if (blockData.isPresent()) {
sfItem = SlimefunItem.getByID(blockData.get());
}
}
}
if (sfItem != null && !(sfItem instanceof HandledBlock)) {
SlimefunBlockHandler blockHandler = utilities.blockHandlers.get(sfItem.getID());
if (blockHandler != null) {
allow = blockHandler.onBreak(e.getPlayer(), block2, sfItem, UnregisterReason.PLAYER_BREAK);
}
if (allow) {
block2.getWorld().dropItemNaturally(block2.getLocation(), BlockStorage.retrieve(block2));
block2.setType(Material.AIR);
}
else {
e.setCancelled(true);
return;
}
}
}
SlimefunItem sfItem = BlockStorage.check(e.getBlock());
if (sfItem == null) {
BlockState state = e.getBlock().getState();
if (state instanceof TileState) {
Optional<String> blockData = SlimefunPlugin.getBlockDataService().getBlockData((TileState) state);
if (blockData.isPresent()) {
sfItem = SlimefunItem.getByID(blockData.get());
}
}
}
if (sfItem != null && !(sfItem instanceof HandledBlock)) {
SlimefunBlockHandler blockHandler = utilities.blockHandlers.get(sfItem.getID());
if (blockHandler != null) {
allow = blockHandler.onBreak(e.getPlayer(), e.getBlock(), sfItem, UnregisterReason.PLAYER_BREAK);
}
else {
// Walk over all registered block break handlers until one says that it'll handle it.
for (ItemHandler handler : SlimefunItem.getHandlers("BlockBreakHandler")) {
if (((BlockBreakHandler) handler).onBlockBreak(e, item, fortune, drops)) break;
}
}
if (allow) {
drops.addAll(sfItem.getDrops());
BlockStorage.clearBlockInfo(e.getBlock());
}
else {
e.setCancelled(true);
return;
}
}
else if (item != null) {
if (item.getEnchantments().containsKey(Enchantment.LOOT_BONUS_BLOCKS) && !item.getEnchantments().containsKey(Enchantment.SILK_TOUCH)) {
Random random = ThreadLocalRandom.current();
fortune = random.nextInt(item.getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS) + 2) - 1;
if (fortune <= 0) fortune = 1;
fortune = (e.getBlock().getType() == Material.LAPIS_ORE ? 4 + random.nextInt(5) : 1) * (fortune + 1);
}
for (ItemHandler handler : SlimefunItem.getHandlers("BlockBreakHandler")) {
if (((BlockBreakHandler) handler).onBlockBreak(e, item, fortune, drops)) break;
}
}
if (!drops.isEmpty()) {
e.getBlock().setType(Material.AIR);
if (e.isDropItems()) {
for (ItemStack drop : drops) {
if (drop != null) {
e.getBlock().getWorld().dropItemNaturally(e.getBlock().getLocation(), drop);
}
}
}
}
}
}