Water in Nether

This commit is contained in:
Fabrizio La Rosa 2020-06-14 17:09:11 +02:00
parent 9d1b0a7f89
commit 93ee9d5092
6 changed files with 266 additions and 44 deletions

View File

@ -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;
}

View File

@ -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<Entity> 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<Generator> 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;
}
}
}
}

View File

@ -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);
}
}
}

View File

@ -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) {

View File

@ -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() {
}
}

View File

@ -319,4 +319,9 @@ Island:
FallDamage: true
Limits:
# Should slime split bypass limits.yml
AllowSlimeSplit: true
AllowSlimeSplit: true
Nether:
AllowNetherWater: false
WaterDisappearWithNetherMobs: false
WaterDoNotFlowNearNetherMobs: false
BlazeImmuneToWaterInNether: false