diff --git a/src/main/java/com/songoda/skyblock/SkyBlock.java b/src/main/java/com/songoda/skyblock/SkyBlock.java index 551e91fb..aede1d17 100644 --- a/src/main/java/com/songoda/skyblock/SkyBlock.java +++ b/src/main/java/com/songoda/skyblock/SkyBlock.java @@ -39,6 +39,7 @@ import com.songoda.skyblock.scoreboard.ScoreboardManager; import com.songoda.skyblock.sound.SoundManager; import com.songoda.skyblock.stackable.StackableManager; import com.songoda.skyblock.structure.StructureManager; +import com.songoda.skyblock.tasks.MobNetherWaterTask; import com.songoda.skyblock.upgrade.UpgradeManager; import com.songoda.skyblock.usercache.UserCacheManager; import com.songoda.skyblock.utils.SignMenuFactory; @@ -81,6 +82,7 @@ public class SkyBlock extends SongodaPlugin { private PlaceholderManager placeholderManager; private MessageManager messageManager; private HologramTask hologramTask; + private MobNetherWaterTask mobNetherWaterTask; private LimitationInstanceHandler limitationHandler; private LocalizationManager localizationManager; private RewardManager rewardManager; @@ -162,6 +164,7 @@ public class SkyBlock extends SongodaPlugin { // Start Tasks hologramTask = HologramTask.startTask(this); + mobNetherWaterTask = MobNetherWaterTask.startTask(this); PluginManager pluginManager = getServer().getPluginManager(); pluginManager.registerEvents(new Join(this), this); @@ -229,6 +232,10 @@ public class SkyBlock extends SongodaPlugin { this.hologramTask.onDisable(); } + if (this.mobNetherWaterTask != null) { + this.mobNetherWaterTask.onDisable(); + } + if (this.fabledChallenge != null) { this.fabledChallenge.onDisable(); } @@ -342,6 +349,10 @@ public class SkyBlock extends SongodaPlugin { return hologramTask; } + public MobNetherWaterTask getMobNetherWaterTask() { + return mobNetherWaterTask; + } + public StackableManager getStackableManager() { return stackableManager; } diff --git a/src/main/java/com/songoda/skyblock/listeners/Block.java b/src/main/java/com/songoda/skyblock/listeners/Block.java index 57b41bb1..cc83827b 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Block.java +++ b/src/main/java/com/songoda/skyblock/listeners/Block.java @@ -20,14 +20,13 @@ import com.songoda.skyblock.utils.version.NMSUtil; import com.songoda.skyblock.utils.world.LocationUtil; import com.songoda.skyblock.world.WorldManager; import org.apache.commons.lang.WordUtils; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; +import org.bukkit.*; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -192,6 +191,10 @@ public class Block implements Listener { Island island = islandManager.getIslandAtLocation(blockLoc); + // Check permissions. + if (!skyblock.getPermissionManager().processPermission(event, player, island)) + return; + if (island == null) { event.setCancelled(true); return; @@ -204,10 +207,6 @@ public class Block implements Listener { return; } - // Check permissions. - if (!skyblock.getPermissionManager().processPermission(event, player, island)) - return; - Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); FileConfiguration configLoad = config.getFileConfiguration(); IslandWorld world = worldManager.getIslandWorld(block.getWorld()); @@ -296,6 +295,32 @@ public class Block implements Listener { return; } + // Nether mobs + if(configLoad.getBoolean("Island.Nether.WaterDoNotFlowNearNetherMobs", false) && worldManager.getIslandWorld(block.getWorld()).equals(IslandWorld.Nether)){ + Collection entities = block.getWorld().getNearbyEntities(block.getLocation(), 1d, 1d, 1d); + if(entities.size() > 0){ + EntityCycle: for(Entity ent : entities){ + switch(ent.getType()){ + case PIG_ZOMBIE: + case BLAZE: + case MAGMA_CUBE: + case WITHER_SKELETON: + case WITHER: + case GHAST: + if(block.getRelative(event.getFace().getOppositeFace()).getType().equals(Material.WATER)){ + event.setCancelled(true); + event.getToBlock().getWorld().playSound(block.getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, 1f, 1f); + event.getToBlock().getWorld().playEffect(block.getLocation(), Effect.SMOKE, 1); + } + break EntityCycle; // TODO No spaghetti code + default: + break; + } + } + } + } + + // Generators if (NMSUtil.getVersionNumber() < 12) { if (generatorManager != null && generatorManager.getGenerators().size() > 0 && generatorManager.isGenerator(block)) { List generators = new ArrayList<>(generatorManager.getGenerators()); @@ -313,23 +338,25 @@ public class Block implements Listener { // Find highest generator available for (Generator generator : generators) { - for (Player p : possiblePlayers) { + if(generator.getIsWorld().equals(world)){ + for (Player p : possiblePlayers) { - if (generator.isPermission() && - !p.hasPermission(generator.getPermission()) && - !p.hasPermission("fabledskyblock.generator.*") && - !p.hasPermission("fabledskyblock.*")) { - continue; + if (generator.isPermission() && + !p.hasPermission(generator.getPermission()) && + !p.hasPermission("fabledskyblock.generator.*") && + !p.hasPermission("fabledskyblock.*")) { + continue; + } + + org.bukkit.block.BlockState genState = generatorManager.generateBlock(generator, block); + org.bukkit.block.BlockState toBlockState = event.getToBlock().getState(); + + toBlockState.setData(genState.getData()); + toBlockState.setType(genState.getType()); + toBlockState.update(); + updateLevel(island, genState.getLocation()); + return; } - - org.bukkit.block.BlockState genState = generatorManager.generateBlock(generator, block); - org.bukkit.block.BlockState toBlockState = event.getToBlock().getState(); - - toBlockState.setData(genState.getData()); - toBlockState.setType(genState.getType()); - toBlockState.update(); - updateLevel(island, genState.getLocation()); - return; } } } @@ -550,12 +577,14 @@ public class Block implements Listener { } } - org.bukkit.block.BlockState genState = generatorManager.generateBlock(generator, block); - state.setType(genState.getType()); + if(worldManager.getIslandWorld(event.getBlock().getWorld()).equals(generator.getIsWorld())){ + org.bukkit.block.BlockState genState = generatorManager.generateBlock(generator, block); + state.setType(genState.getType()); - if (NMSUtil.getVersionNumber() < 13) state.setData(genState.getData()); - updateLevel(island, genState.getLocation()); - return; + if (NMSUtil.getVersionNumber() < 13) state.setData(genState.getData()); + updateLevel(island, genState.getLocation()); + return; + } } } } diff --git a/src/main/java/com/songoda/skyblock/listeners/Entity.java b/src/main/java/com/songoda/skyblock/listeners/Entity.java index 80abcdf8..68e2e585 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Entity.java +++ b/src/main/java/com/songoda/skyblock/listeners/Entity.java @@ -55,22 +55,32 @@ public class Entity implements Listener { @EventHandler public void onEntityDamage(EntityDamageEvent event) { IslandManager islandManager = skyblock.getIslandManager(); - if (!(event.getEntity() instanceof Player)) { - return; - } + if(event.getEntity() instanceof Blaze){ + WorldManager worldManager = skyblock.getWorldManager(); - Player player = (Player) event.getEntity(); + Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - // Check permissions. - skyblock.getPermissionManager().processPermission(event, player, islandManager.getIslandAtLocation(player.getLocation())); - } + if(configLoad.getBoolean("Island.Nether.BlazeImmuneToWaterInNether", false) && + worldManager.getIslandWorld(event.getEntity().getWorld()).equals(IslandWorld.Nether)){ + if(event.getCause().equals(DamageCause.DROWNING)){ + event.setCancelled(true); + } + } + } else if (event.getEntity() instanceof Player) { + Player player = (Player) event.getEntity(); - // Fix a bug in minecraft where arrows with flame still apply fire ticks even if - // the shot entity isn't damaged - if (preventFireTicks.contains(player.getUniqueId()) && event.getCause() == DamageCause.FIRE_TICK) { - player.setFireTicks(0); - event.setCancelled(true); + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + // Check permissions. + skyblock.getPermissionManager().processPermission(event, player, islandManager.getIslandAtLocation(player.getLocation())); + } + + // Fix a bug in minecraft where arrows with flame still apply fire ticks even if + // the shot entity isn't damaged + if (preventFireTicks.contains(player.getUniqueId()) && event.getCause() == DamageCause.FIRE_TICK) { + player.setFireTicks(0); + event.setCancelled(true); + } } } diff --git a/src/main/java/com/songoda/skyblock/listeners/Interact.java b/src/main/java/com/songoda/skyblock/listeners/Interact.java index 49a14c00..7b6ff44b 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Interact.java +++ b/src/main/java/com/songoda/skyblock/listeners/Interact.java @@ -18,11 +18,11 @@ import com.songoda.skyblock.stackable.Stackable; import com.songoda.skyblock.stackable.StackableManager; import com.songoda.skyblock.utils.NumberUtil; import com.songoda.skyblock.utils.structure.StructureUtil; +import com.songoda.skyblock.utils.world.LocationUtil; import com.songoda.skyblock.world.WorldManager; import org.apache.commons.lang.WordUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; +import org.bukkit.*; +import org.bukkit.block.BlockFace; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -48,6 +48,86 @@ public class Interact implements Listener { this.skyblock = skyblock; } + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onWaterPlace(PlayerInteractEvent event){ + Player player = event.getPlayer(); + org.bukkit.block.Block block = event.getClickedBlock().getRelative(event.getBlockFace()); + + IslandManager islandManager = skyblock.getIslandManager(); + WorldManager worldManager = skyblock.getWorldManager(); + IslandLevelManager levellingManager = skyblock.getLevellingManager(); + if (!worldManager.isIslandWorld(block.getWorld())) return; + + if (event.getAction() == Action.RIGHT_CLICK_BLOCK && + worldManager.getIslandWorld(block.getWorld()).equals(IslandWorld.Nether) && + event.getItem().getType().equals(Material.WATER_BUCKET)){ + Location blockLoc = block.getLocation(); + + Island island = islandManager.getIslandAtLocation(blockLoc); + + // Check permissions. + if (!skyblock.getPermissionManager().processPermission(event, player, island)) + return; + + if (island == null) { + event.setCancelled(true); + return; + } + + if (levellingManager.isScanning(island)) { + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Command.Island.Level.Scanning.BlockPlacing.Message")); + event.setCancelled(true); + return; + } + + FileManager.Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + IslandWorld world = worldManager.getIslandWorld(block.getWorld()); + + // Check spawn protection + if (configLoad.getBoolean("Island.Spawn.Protection")) { + boolean isObstructing = false; + // Directly on the block + if (LocationUtil.isLocationAffectingIslandSpawn(blockLoc, island, world)) { + isObstructing = true; + } + + if (isObstructing) { + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.SpawnProtection.Place.Message")); + skyblock.getSoundManager().playSound(player, CompatibleSound.ENTITY_VILLAGER_NO.getSound(), 1.0F, 1.0F); + + event.setCancelled(true); + return; + } + } + + BlockLimitation limits = skyblock.getLimitationHandler().getInstance(BlockLimitation.class); + + long limit = limits.getBlockLimit(player, Material.WATER); + + if (limits.isBlockLimitExceeded(event.getItem().getType(), block.getLocation(), limit)) { + CompatibleMaterial material = CompatibleMaterial.getMaterial(event.getItem().getType()); + + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Limit.Block.Exceeded.Message") + .replace("%type", WordUtils.capitalizeFully(material.name().replace("_", " "))).replace("%limit", NumberUtil.formatNumber(limit))); + skyblock.getSoundManager().playSound(player, CompatibleSound.ENTITY_VILLAGER_NO.getSound(), 1.0F, 1.0F); + + event.setCancelled(true); + return; + } + + if(configLoad.getBoolean("Island.Nether.AllowNetherWater", false)){ + event.setCancelled(true); + block.setType(Material.WATER, true); + block.getWorld().playSound(block.getLocation(), Sound.ITEM_BUCKET_EMPTY, 1f, 1f); + if(!event.getPlayer().getGameMode().equals(GameMode.CREATIVE)){ + event.getItem().setType(Material.BUCKET); + } + } + } + } + @SuppressWarnings("deprecation") @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPlayerInteract(PlayerInteractEvent event) { diff --git a/src/main/java/com/songoda/skyblock/tasks/MobNetherWaterTask.java b/src/main/java/com/songoda/skyblock/tasks/MobNetherWaterTask.java new file mode 100644 index 00000000..5ae7bd69 --- /dev/null +++ b/src/main/java/com/songoda/skyblock/tasks/MobNetherWaterTask.java @@ -0,0 +1,87 @@ +package com.songoda.skyblock.tasks; + +import com.songoda.core.utils.TextUtils; +import com.songoda.skyblock.SkyBlock; +import com.songoda.skyblock.config.FileManager; +import com.songoda.skyblock.hologram.Hologram; +import com.songoda.skyblock.hologram.HologramType; +import com.songoda.skyblock.island.IslandLevel; +import com.songoda.skyblock.island.IslandWorld; +import com.songoda.skyblock.leaderboard.Leaderboard; +import com.songoda.skyblock.leaderboard.LeaderboardManager; +import com.songoda.skyblock.utils.NumberUtil; +import com.songoda.skyblock.utils.player.OfflinePlayer; +import com.songoda.skyblock.utils.world.LocationUtil; +import com.songoda.skyblock.visit.Visit; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class MobNetherWaterTask extends BukkitRunnable { + + private static MobNetherWaterTask instance; + private static SkyBlock plugin; + + public MobNetherWaterTask(SkyBlock plug) { + plugin = plug; + } + + public static MobNetherWaterTask startTask(SkyBlock plug) { + plugin = plug; + if (instance == null) { + instance = new MobNetherWaterTask(plugin); + instance.runTaskTimer(plugin, 0, 2L); + } + + return instance; + } + + @Override + public void run() { + FileManager fileManager = plugin.getFileManager(); + if (fileManager.getConfig(new File(plugin.getDataFolder(), "config.yml")) + .getFileConfiguration().getBoolean("Island.Nether.WaterDisappearWithNetherMobs", false)){ + for(World world : Bukkit.getServer().getWorlds()){ + if(plugin.getWorldManager().isIslandWorld(world) && plugin.getWorldManager().getIslandWorld(world).equals(IslandWorld.Nether)){ + for(Entity ent : world.getEntities()){ + switch(ent.getType()){ + case PIG_ZOMBIE: + case BLAZE: + case MAGMA_CUBE: + case WITHER_SKELETON: + case WITHER: + case GHAST: + Block block = ent.getLocation().getBlock(); + if(block.getType().equals(Material.WATER)){ + block.setType(Material.AIR, true); + world.playSound(block.getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, 1f, 1f); + world.playEffect(block.getLocation(), Effect.SMOKE, 1); + } + block = block.getRelative(BlockFace.UP); + if(block.getType().equals(Material.WATER)){ + block.setType(Material.AIR, true); + world.playSound(block.getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, 1f, 1f); + world.playEffect(block.getLocation(), Effect.SMOKE, 1); + } + default: + break; + } + } + } + } + } + } + + public void onDisable() { + } + + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ea08b30d..74e15f86 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -319,4 +319,9 @@ Island: FallDamage: true Limits: # Should slime split bypass limits.yml - AllowSlimeSplit: true \ No newline at end of file + AllowSlimeSplit: true + Nether: + AllowNetherWater: false + WaterDisappearWithNetherMobs: false + WaterDoNotFlowNearNetherMobs: false + BlazeImmuneToWaterInNether: false \ No newline at end of file