From 2e2445f77f1db727bb8b2b451f8a58d4ba83a535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C5=A0MAHEL?= <48548230+ceskyDJ@users.noreply.github.com> Date: Tue, 28 Apr 2020 19:40:00 +0200 Subject: [PATCH] Added support for ice --- .../netherwater/BlockBreakListener.java | 55 +++++++++++++++++-- .../netherwater/NetherWater.java | 50 ++++++++++++++--- .../netherwater/WaterPlaceListener.java | 31 ++--------- src/plugin.yml | 2 +- 4 files changed, 97 insertions(+), 41 deletions(-) diff --git a/src/com/leetzilantonis/netherwater/BlockBreakListener.java b/src/com/leetzilantonis/netherwater/BlockBreakListener.java index b6fbb14..c7099cf 100644 --- a/src/com/leetzilantonis/netherwater/BlockBreakListener.java +++ b/src/com/leetzilantonis/netherwater/BlockBreakListener.java @@ -1,7 +1,54 @@ package com.leetzilantonis.netherwater; -/** - * Created by Michal ŠMAHEL (ceskyDJ) on 4/28/20. - */ -public class BlockBreakListener { +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; + +import java.util.Objects; + +public class BlockBreakListener implements Listener { + private final NetherWater plugin; + + public BlockBreakListener(NetherWater plugin) { + this.plugin = plugin; + } + + @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockBreak(BlockBreakEvent event) { + this.plugin.dump("Block break event has been handled."); + this.plugin.dump("- World: " + Objects.requireNonNull(event.getBlock()).getWorld().getName() + " (type: " + event.getBlock().getWorld().getEnvironment() + ")"); + this.plugin.dump("- Player: " + event.getPlayer()); + + Player player = event.getPlayer(); + + if (event.getBlock().getType() != Material.ICE) { + return; + } + + // Silk touch has different behaviour + if (event.getPlayer().getInventory().getItemInMainHand().containsEnchantment(Enchantment.SILK_TOUCH)) { + return; + } + + // Ice to water change doesn't apply to creative game players + if (player.getGameMode() == GameMode.CREATIVE) { + return; + } + + // Check general conditions for using this plugin (world type, player permissions, world height etc.) + if (!plugin.canBeUsedThisPlugin(player, event.getBlock())) { + return; + } + + // Cancel native event actions + event.setCancelled(true); + + // Replace ice for watter block + event.getBlock().setType(Material.WATER); + } } diff --git a/src/com/leetzilantonis/netherwater/NetherWater.java b/src/com/leetzilantonis/netherwater/NetherWater.java index 248885f..f3a1d74 100644 --- a/src/com/leetzilantonis/netherwater/NetherWater.java +++ b/src/com/leetzilantonis/netherwater/NetherWater.java @@ -33,6 +33,7 @@ public void onEnable() { } this.getServer().getPluginManager().registerEvents(new WaterPlaceListener(this), this); + this.getServer().getPluginManager().registerEvents(new BlockBreakListener(this), this); this.getCommand("nwreload").setExecutor(new NWReloadCommand(this)); this.getLogger().info("Plugin loaded successfully"); @@ -53,14 +54,24 @@ private WorldGuardPlugin getWorldGuard() throws PluginNotFoundException { return (WorldGuardPlugin) plugin; } - public boolean canBuild(Player p, Block b) { + public ConfigManager getConfigManager() { + return this.configManager; + } + + public void dump(String message) { + if (this.configManager.isDebugOn()) { + this.getServer().getConsoleSender().sendMessage(ChatColor.YELLOW + "[NetherWater] " + message); + } + } + + public boolean canBuild(Player player, Block block) { if (this.worldGuard == null) { return true; } - LocalPlayer wgPlayer = this.worldGuard.wrapPlayer(p); + LocalPlayer wgPlayer = this.worldGuard.wrapPlayer(player); World weWorld = wgPlayer.getWorld(); - Location location = new Location(weWorld, b.getX(), b.getY(), b.getZ()); + Location location = new Location(weWorld, block.getX(), block.getY(), block.getZ()); RegionContainer regionContainer = WorldGuard.getInstance().getPlatform().getRegionContainer(); RegionQuery regionQuery = regionContainer.createQuery(); @@ -69,13 +80,34 @@ public boolean canBuild(Player p, Block b) { return canBypass || regionQuery.testState(location, wgPlayer, Flags.BUILD); } - public ConfigManager getConfigManager() { - return this.configManager; - } + public boolean canBeUsedThisPlugin(Player player, Block block) { + org.bukkit.World world = block.getWorld(); - public void dump(String message) { - if (this.configManager.isDebugOn()) { - this.getServer().getConsoleSender().sendMessage(ChatColor.YELLOW + "[NetherWater] " + message); + if (world.getEnvironment() != org.bukkit.World.Environment.NETHER) { + return false; + } + + if (!(player.hasPermission("netherwater.use." + world.getName()) || player.hasPermission("netherwater.use.*"))) { + return false; } + + if (this.configManager.getDisabledWorlds().contains(world.getName()) && !player.hasPermission("netherwater.world.bypass")) { + return false; + } + + if (!this.canBuild(player, block)) { + return false; + } + + int y = block.getY(); + if (y > this.configManager.getMaxHeight()) { + return false; + } + + if (y < this.configManager.getMinHeight()) { + return false; + } + + return true; } } diff --git a/src/com/leetzilantonis/netherwater/WaterPlaceListener.java b/src/com/leetzilantonis/netherwater/WaterPlaceListener.java index c33edf4..a9f1896 100644 --- a/src/com/leetzilantonis/netherwater/WaterPlaceListener.java +++ b/src/com/leetzilantonis/netherwater/WaterPlaceListener.java @@ -2,8 +2,7 @@ import org.bukkit.GameMode; import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.World.Environment; +import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -15,12 +14,9 @@ public class WaterPlaceListener implements Listener { private final NetherWater plugin; - private final ConfigManager configManager; public WaterPlaceListener(NetherWater plugin) { this.plugin = plugin; - - this.configManager = this.plugin.getConfigManager(); } @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true) @@ -39,34 +35,15 @@ public void onPlayerInteract(PlayerInteractEvent event) { return; } - World world = event.getClickedBlock().getWorld(); Player player = event.getPlayer(); - - if (world.getEnvironment() != Environment.NETHER) { - return; - } + Block selectedBlock = event.getClickedBlock().getRelative(event.getBlockFace()); if (event.getItem() == null || event.getItem().getType() != Material.WATER_BUCKET) { return; } - if (!(player.hasPermission("netherwater.use." + world.getName()) || player.hasPermission("netherwater.use.*"))) { - return; - } - - if (this.configManager.getDisabledWorlds().contains(world.getName()) && !player.hasPermission("netherwater.world.bypass")) { - return; - } - - if (!plugin.canBuild(player, event.getClickedBlock().getRelative(event.getBlockFace()))) - return; - - int y = event.getClickedBlock().getRelative(event.getBlockFace()).getY(); - if (y > this.configManager.getMaxHeight()) { - return; - } - - if (y < this.configManager.getMinHeight()) { + // Check general conditions for using this plugin (world type, player permissions, world height etc.) + if (!this.plugin.canBeUsedThisPlugin(player, selectedBlock)) { return; } diff --git a/src/plugin.yml b/src/plugin.yml index 208b8f6..ae18154 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,5 +1,5 @@ name: NetherWater -version: 1.0.6 +version: 1.0.7 description: Allow players to use water in the nether authors: [Lee Tzilantonis, ceskyDJ]