diff --git a/pom.xml b/pom.xml
index 43bbe76..6dc4246 100644
--- a/pom.xml
+++ b/pom.xml
@@ -61,7 +61,7 @@
org.bukkit
bukkit
- 1.12.2-R0.1-SNAPSHOT
+ 1.13-R0.1-SNAPSHOT
provided
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/AutoExtendClaimTask.java b/src/main/java/me/ryanhamshire/GriefPrevention/AutoExtendClaimTask.java
index f6219f6..60f7ee8 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/AutoExtendClaimTask.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/AutoExtendClaimTask.java
@@ -84,14 +84,14 @@ class AutoExtendClaimTask implements Runnable
{
for(int z = 0; z < 16; z++)
{
- int blockType = chunk.getBlockTypeId(x, y, z);
- while(!this.yTooSmall(y) && playerBlockIDs.contains(Material.getMaterial(blockType)))
- {
- ychanged = true;
- blockType = chunk.getBlockTypeId(x, --y, z);
- }
+ Material blockType = chunk.getBlockType(x, y, z);
+ while(!this.yTooSmall(y) && playerBlockIDs.contains(blockType))
+ {
+ ychanged = true;
+ blockType = chunk.getBlockType(x, --y, z);
+ }
- if(this.yTooSmall(y)) return y;
+ if(this.yTooSmall(y)) return y;
}
}
}
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/BlockEventHandler.java b/src/main/java/me/ryanhamshire/GriefPrevention/BlockEventHandler.java
index fbcc401..f72ef0f 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/BlockEventHandler.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/BlockEventHandler.java
@@ -25,6 +25,7 @@ import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
+import org.bukkit.Tag;
import org.bukkit.World.Environment;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
@@ -74,11 +75,16 @@ public class BlockEventHandler implements Listener
this.trashBlocks.add(Material.COBBLESTONE);
this.trashBlocks.add(Material.TORCH);
this.trashBlocks.add(Material.DIRT);
- this.trashBlocks.add(Material.SAPLING);
+ this.trashBlocks.add(Material.OAK_SAPLING);
+ this.trashBlocks.add(Material.SPRUCE_SAPLING);
+ this.trashBlocks.add(Material.BIRCH_SAPLING);
+ this.trashBlocks.add(Material.JUNGLE_SAPLING);
+ this.trashBlocks.add(Material.ACACIA_SAPLING);
+ this.trashBlocks.add(Material.DARK_OAK_SAPLING);
this.trashBlocks.add(Material.GRAVEL);
this.trashBlocks.add(Material.SAND);
this.trashBlocks.add(Material.TNT);
- this.trashBlocks.add(Material.WORKBENCH);
+ this.trashBlocks.add(Material.CRAFTING_TABLE);
}
//when a player breaks a block...
@@ -319,7 +325,7 @@ public class BlockEventHandler implements Listener
}
//FEATURE: limit wilderness tree planting to grass, or dirt with more blocks beneath it
- else if(block.getType() == Material.SAPLING && GriefPrevention.instance.config_blockSkyTrees && GriefPrevention.instance.claimsEnabledForWorld(player.getWorld()))
+ else if(Tag.SAPLINGS.isTagged(block.getType()) && GriefPrevention.instance.config_blockSkyTrees && GriefPrevention.instance.claimsEnabledForWorld(player.getWorld()))
{
Block earthBlock = placeEvent.getBlockAgainst();
if(earthBlock.getType() != Material.GRASS)
@@ -375,7 +381,7 @@ public class BlockEventHandler implements Listener
//warn players about disabled pistons outside of land claims
if( GriefPrevention.instance.config_pistonsInClaimsOnly &&
- (block.getType() == Material.PISTON_BASE || block.getType() == Material.PISTON_STICKY_BASE) &&
+ (block.getType() == Material.PISTON || block.getType() == Material.STICKY_PISTON) &&
claim == null )
{
GriefPrevention.sendMessage(player, TextMode.Warn, Messages.NoPistonsOutsideClaims);
@@ -406,7 +412,7 @@ public class BlockEventHandler implements Listener
static boolean isActiveBlock(Material type)
{
- if(type == Material.HOPPER || type == Material.BEACON || type == Material.MOB_SPAWNER) return true;
+ if(type == Material.HOPPER || type == Material.BEACON || type == Material.SPAWNER) return true;
return false;
}
@@ -589,7 +595,7 @@ public class BlockEventHandler implements Listener
{
event.setCancelled(true);
block.getWorld().createExplosion(block.getLocation(), 0);
- block.getWorld().dropItem(block.getLocation(), new ItemStack(Material.PISTON_STICKY_BASE));
+ block.getWorld().dropItem(block.getLocation(), new ItemStack(Material.STICKY_PISTON));
block.setType(Material.AIR);
return;
}
@@ -656,10 +662,10 @@ public class BlockEventHandler implements Listener
@EventHandler(priority = EventPriority.LOWEST)
public void onBlockBurn (BlockBurnEvent burnEvent)
{
- //don't track in worlds where claims are not enabled
- if(!GriefPrevention.instance.claimsEnabledForWorld(burnEvent.getBlock().getWorld())) return;
+ //don't track in worlds where claims are not enabled
+ if(!GriefPrevention.instance.claimsEnabledForWorld(burnEvent.getBlock().getWorld())) return;
- if(!GriefPrevention.instance.config_fireDestroys)
+ if(!GriefPrevention.instance.config_fireDestroys)
{
burnEvent.setCancelled(true);
Block block = burnEvent.getBlock();
@@ -736,7 +742,7 @@ public class BlockEventHandler implements Listener
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
- public void onForm(BlockFormEvent event)
+ public void onForm(BlockFormEvent event)
{
Block block = event.getBlock();
Location location = block.getLocation();
@@ -744,7 +750,7 @@ public class BlockEventHandler implements Listener
if(GriefPrevention.instance.creativeRulesApply(location))
{
Material type = block.getType();
- if(type == Material.COBBLESTONE || type == Material.OBSIDIAN || type == Material.STATIONARY_LAVA || type == Material.STATIONARY_WATER)
+ if(type == Material.COBBLESTONE || type == Material.OBSIDIAN || type == Material.LAVA || type == Material.WATER)
{
Claim claim = GriefPrevention.instance.dataStore.getClaimAt(location, false, null);
if(claim == null)
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/BlockSnapshot.java b/src/main/java/me/ryanhamshire/GriefPrevention/BlockSnapshot.java
index 910b801..640f330 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/BlockSnapshot.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/BlockSnapshot.java
@@ -20,6 +20,7 @@ package me.ryanhamshire.GriefPrevention;
import org.bukkit.Location;
import org.bukkit.Material;
+import org.bukkit.block.data.BlockData;
//basically, just a few data points from a block conveniently encapsulated in a class
//this is used only by the RestoreNature code
@@ -27,9 +28,9 @@ public class BlockSnapshot
{
public Location location;
public Material typeId;
- public byte data;
+ public BlockData data;
- public BlockSnapshot(Location location, Material typeId, byte data)
+ public BlockSnapshot(Location location, Material typeId, BlockData data)
{
this.location = location;
this.typeId = typeId;
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/Claim.java b/src/main/java/me/ryanhamshire/GriefPrevention/Claim.java
index 8ea8955..7d2ba95 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/Claim.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/Claim.java
@@ -145,7 +145,7 @@ public class Claim
Block block = lesser.getWorld().getBlockAt(x, y, z);
if(exclusionClaim != null && exclusionClaim.contains(block.getLocation(), true, false)) continue;
- if(block.getType() == Material.STATIONARY_LAVA || block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER || block.getType() == Material.LAVA)
+ if(block.getType() == Material.LAVA || block.getType() == Material.WATER)
{
block.setType(Material.AIR);
}
@@ -178,7 +178,7 @@ public class Claim
//dodge the exclusion claim
Block block = lesser.getWorld().getBlockAt(x, y, z);
- if(block.getType() == Material.STATIONARY_LAVA || block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER || block.getType() == Material.LAVA)
+ if(block.getType() == Material.WATER || block.getType() == Material.LAVA)
{
return true;
}
@@ -334,12 +334,12 @@ public class Claim
private List placeableFarmingBlocksList = Arrays.asList(
Material.PUMPKIN_STEM,
- Material.CROPS,
+ Material.WHEAT,
Material.MELON_STEM,
Material.CARROT,
Material.POTATO,
- Material.NETHER_WARTS,
- Material.BEETROOT_BLOCK);
+ Material.NETHER_WART,
+ Material.BEETROOT);
private boolean placeableForFarming(Material material)
{
@@ -385,14 +385,14 @@ public class Claim
if(ClaimPermission.Build == permissionLevel) return null;
//allow for farming with /containertrust permission
- if(this.allowContainers(player) == null)
- {
- //do allow for farming, if player has /containertrust permission
- if(this.placeableForFarming(material))
- {
- return null;
- }
- }
+ if(this.allowContainers(player) == null)
+ {
+ //do allow for farming, if player has /containertrust permission
+ if(this.placeableForFarming(material))
+ {
+ return null;
+ }
+ }
//subdivision permission inheritance
if(this.parent != null)
@@ -913,7 +913,7 @@ public class Claim
{
score += 10;
}
- else if(creativeMode && (block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA))
+ else if(creativeMode && (block.getType() == Material.LAVA))
{
score -= 10;
}
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/EntityCleanupTask.java b/src/main/java/me/ryanhamshire/GriefPrevention/EntityCleanupTask.java
index a2f602d..1b6cf26 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/EntityCleanupTask.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/EntityCleanupTask.java
@@ -92,7 +92,7 @@ class EntityCleanupTask implements Runnable
else
{
Material material = world.getBlockAt(vehicle.getLocation()).getType();
- if(material != Material.RAILS && material != Material.POWERED_RAIL && material != Material.DETECTOR_RAIL)
+ if(material != Material.RAIL && material != Material.POWERED_RAIL && material != Material.DETECTOR_RAIL)
{
remove = true;
}
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/EntityEventHandler.java b/src/main/java/me/ryanhamshire/GriefPrevention/EntityEventHandler.java
index 5e8c67f..78a4e2b 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/EntityEventHandler.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/EntityEventHandler.java
@@ -133,33 +133,33 @@ public class EntityEventHandler implements Listener
}
else if(!GriefPrevention.instance.config_rabbitsEatCrops && event.getEntityType() == EntityType.RABBIT)
- {
- event.setCancelled(true);
- } else if(event.getEntityType() == EntityType.WITHER && GriefPrevention.instance.config_claims_worldModes.get(event.getBlock().getWorld()) != ClaimsMode.Disabled)
+ {
+ event.setCancelled(true);
+ } else if(event.getEntityType() == EntityType.WITHER && GriefPrevention.instance.config_claims_worldModes.get(event.getBlock().getWorld()) != ClaimsMode.Disabled)
{
Claim claim = this.dataStore.getClaimAt(event.getBlock().getLocation(), false, null);
- if(claim == null || !claim.areExplosivesAllowed || !GriefPrevention.instance.config_blockClaimExplosions)
- {
- event.setCancelled(true);
- }
+ if(claim == null || !claim.areExplosivesAllowed || !GriefPrevention.instance.config_blockClaimExplosions)
+ {
+ event.setCancelled(true);
+ }
}
- //don't allow crops to be trampled, except by a player with build permission
- else if(event.getTo() == Material.DIRT && event.getBlock().getType() == Material.SOIL)
+ //don't allow crops to be trampled, except by a player with build permission
+ else if(event.getTo() == Material.DIRT && event.getBlock().getType() == Material.FARMLAND)
{
- if(event.getEntityType() != EntityType.PLAYER)
- {
- event.setCancelled(true);
- }
- else
- {
- Player player = (Player)event.getEntity();
- Block block = event.getBlock();
- if(GriefPrevention.instance.allowBreak(player, block, block.getLocation()) != null)
- {
- event.setCancelled(true);
- }
- }
+ if(event.getEntityType() != EntityType.PLAYER)
+ {
+ event.setCancelled(true);
+ }
+ else
+ {
+ Player player = (Player)event.getEntity();
+ Block block = event.getBlock();
+ if(GriefPrevention.instance.allowBreak(player, block, block.getLocation()) != null)
+ {
+ event.setCancelled(true);
+ }
+ }
}
//sand cannon fix - when the falling block doesn't fall straight down, take additional anti-grief steps
@@ -201,7 +201,7 @@ public class EntityEventHandler implements Listener
//when not allowed, drop as item instead of forming a block
event.setCancelled(true);
@SuppressWarnings("deprecation")
- ItemStack itemStack = new ItemStack(entity.getMaterial(), 1, entity.getBlockData());
+ ItemStack itemStack = new ItemStack(entity.getMaterial(), 1);
Item item = block.getWorld().dropItem(entity.getLocation(), itemStack);
item.setVelocity(new Vector());
}
@@ -244,20 +244,20 @@ public class EntityEventHandler implements Listener
public void onEntityInteract(EntityInteractEvent event)
{
Material material = event.getBlock().getType();
- if(material == Material.SOIL)
- {
- if(!GriefPrevention.instance.config_creaturesTrampleCrops)
- {
- event.setCancelled(true);
- }
- else
- {
- Entity rider = event.getEntity().getPassenger();
- if(rider != null && rider.getType() == EntityType.PLAYER)
- {
- event.setCancelled(true);
- }
- }
+ if(material == Material.FARMLAND)
+ {
+ if(!GriefPrevention.instance.config_creaturesTrampleCrops)
+ {
+ event.setCancelled(true);
+ }
+ else
+ {
+ Entity rider = event.getEntity().getPassenger();
+ if(rider != null && rider.getType() == EntityType.PLAYER)
+ {
+ event.setCancelled(true);
+ }
+ }
}
}
@@ -294,7 +294,6 @@ public class EntityEventHandler implements Listener
for(int i = 0; i < blocks.size(); i++)
{
Block block = blocks.get(i);
- if(GriefPrevention.instance.config_mods_explodableIds.Contains(new MaterialInfo(block.getType(), block.getData(), null))) continue;
blocks.remove(i--);
}
@@ -312,13 +311,6 @@ public class EntityEventHandler implements Listener
//always ignore air blocks
if(block.getType() == Material.AIR) continue;
- //always allow certain block types to explode
- if(GriefPrevention.instance.config_mods_explodableIds.Contains(new MaterialInfo(block.getType(), block.getData(), null)))
- {
- explodedBlocks.add(block);
- continue;
- }
-
//is it in a land claim?
Claim claim = this.dataStore.getClaimAt(block.getLocation(), false, cachedClaim);
if(claim != null)
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java b/src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java
index 6ef2fc4..9c21f04 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java
@@ -189,11 +189,6 @@ public class GriefPrevention extends JavaPlugin
public int config_ipLimit; //how many players can share an IP address
public boolean config_trollFilterEnabled; //whether to auto-mute new players who use banned words right after joining
-
- public MaterialCollection config_mods_accessTrustIds; //list of block IDs which should require /accesstrust for player interaction
- public MaterialCollection config_mods_containerTrustIds; //list of block IDs which should require /containertrust for player interaction
- public List config_mods_ignoreClaimsAccounts; //list of player names which ALWAYS ignore claims
- public MaterialCollection config_mods_explodableIds; //list of block IDs which can be destroyed by explosions, even in claimed areas
public HashMap config_seaLevelOverride; //override for sea level, because bukkit doesn't report the right value for all situations
@@ -622,33 +617,6 @@ public class GriefPrevention extends JavaPlugin
this.config_ban_useCommand = config.getBoolean("GriefPrevention.UseBanCommand", false);
this.config_ban_commandFormat = config.getString("GriefPrevention.BanCommandPattern", "ban %name% %reason%");
- this.config_mods_ignoreClaimsAccounts = config.getStringList("GriefPrevention.Mods.PlayersIgnoringAllClaims");
-
- if(this.config_mods_ignoreClaimsAccounts == null) this.config_mods_ignoreClaimsAccounts = new ArrayList();
-
- this.config_mods_accessTrustIds = new MaterialCollection();
- List accessTrustStrings = config.getStringList("GriefPrevention.Mods.BlockIdsRequiringAccessTrust");
-
- this.parseMaterialListFromConfig(accessTrustStrings, this.config_mods_accessTrustIds);
-
- this.config_mods_containerTrustIds = new MaterialCollection();
- List containerTrustStrings = config.getStringList("GriefPrevention.Mods.BlockIdsRequiringContainerTrust");
-
- //default values for container trust mod blocks
- if(containerTrustStrings == null || containerTrustStrings.size() == 0)
- {
- // containerTrustStrings.add(new MaterialInfo(99999, "Example - ID 99999, all data values.").toString());
- }
-
- //parse the strings from the config file
- this.parseMaterialListFromConfig(containerTrustStrings, this.config_mods_containerTrustIds);
-
- this.config_mods_explodableIds = new MaterialCollection();
- List explodableStrings = config.getStringList("GriefPrevention.Mods.BlockIdsExplodable");
-
- //parse the strings from the config file
- this.parseMaterialListFromConfig(explodableStrings, this.config_mods_explodableIds);
-
//default for claim investigation tool
String investigationToolMaterialName = Material.STICK.name();
@@ -664,7 +632,7 @@ public class GriefPrevention extends JavaPlugin
}
//default for claim creation/modification tool
- String modificationToolMaterialName = Material.GOLD_SPADE.name();
+ String modificationToolMaterialName = Material.GOLDEN_SHOVEL.name();
//get modification tool from config
modificationToolMaterialName = config.getString("GriefPrevention.Claims.ModificationTool", modificationToolMaterialName);
@@ -674,7 +642,7 @@ public class GriefPrevention extends JavaPlugin
if(this.config_claims_modificationTool == null)
{
GriefPrevention.AddLogEntry("ERROR: Material " + modificationToolMaterialName + " not found. Defaulting to the golden shovel. Please update your config.yml.");
- this.config_claims_modificationTool = Material.GOLD_SPADE;
+ this.config_claims_modificationTool = Material.GOLDEN_SHOVEL;
}
//default for siege worlds list
@@ -706,15 +674,37 @@ public class GriefPrevention extends JavaPlugin
//default siege blocks
this.config_siege_blocks = new ArrayList();
this.config_siege_blocks.add(Material.DIRT);
+ this.config_siege_blocks.add(Material.GRASS_BLOCK);
this.config_siege_blocks.add(Material.GRASS);
- this.config_siege_blocks.add(Material.LONG_GRASS);
+ this.config_siege_blocks.add(Material.FERN);
+ this.config_siege_blocks.add(Material.DEAD_BUSH);
this.config_siege_blocks.add(Material.COBBLESTONE);
this.config_siege_blocks.add(Material.GRAVEL);
this.config_siege_blocks.add(Material.SAND);
this.config_siege_blocks.add(Material.GLASS);
- this.config_siege_blocks.add(Material.THIN_GLASS);
- this.config_siege_blocks.add(Material.WOOD);
- this.config_siege_blocks.add(Material.WOOL);
+ this.config_siege_blocks.add(Material.GLASS_PANE);
+ this.config_siege_blocks.add(Material.OAK_PLANKS);
+ this.config_siege_blocks.add(Material.SPRUCE_PLANKS);
+ this.config_siege_blocks.add(Material.BIRCH_PLANKS);
+ this.config_siege_blocks.add(Material.JUNGLE_PLANKS);
+ this.config_siege_blocks.add(Material.ACACIA_PLANKS);
+ this.config_siege_blocks.add(Material.DARK_OAK_PLANKS);
+ this.config_siege_blocks.add(Material.WHITE_WOOL);
+ this.config_siege_blocks.add(Material.ORANGE_WOOL);
+ this.config_siege_blocks.add(Material.MAGENTA_WOOL);
+ this.config_siege_blocks.add(Material.LIGHT_BLUE_WOOL);
+ this.config_siege_blocks.add(Material.YELLOW_WOOL);
+ this.config_siege_blocks.add(Material.LIME_WOOL);
+ this.config_siege_blocks.add(Material.PINK_WOOL);
+ this.config_siege_blocks.add(Material.GRAY_WOOL);
+ this.config_siege_blocks.add(Material.LIGHT_GRAY_WOOL);
+ this.config_siege_blocks.add(Material.CYAN_WOOL);
+ this.config_siege_blocks.add(Material.PURPLE_WOOL);
+ this.config_siege_blocks.add(Material.BLUE_WOOL);
+ this.config_siege_blocks.add(Material.BROWN_WOOL);
+ this.config_siege_blocks.add(Material.GREEN_WOOL);
+ this.config_siege_blocks.add(Material.RED_WOOL);
+ this.config_siege_blocks.add(Material.BLACK_WOOL);
this.config_siege_blocks.add(Material.SNOW);
//build a default config entry
@@ -898,14 +888,6 @@ public class GriefPrevention extends JavaPlugin
outConfig.set("GriefPrevention.UseBanCommand", this.config_ban_useCommand);
outConfig.set("GriefPrevention.BanCommandPattern", this.config_ban_commandFormat);
-
- outConfig.set("GriefPrevention.Mods.BlockIdsRequiringAccessTrust", this.config_mods_accessTrustIds);
- outConfig.set("GriefPrevention.Mods.BlockIdsRequiringContainerTrust", this.config_mods_containerTrustIds);
- outConfig.set("GriefPrevention.Mods.BlockIdsExplodable", this.config_mods_explodableIds);
- outConfig.set("GriefPrevention.Mods.PlayersIgnoringAllClaims", this.config_mods_ignoreClaimsAccounts);
- outConfig.set("GriefPrevention.Mods.BlockIdsRequiringAccessTrust", accessTrustStrings);
- outConfig.set("GriefPrevention.Mods.BlockIdsRequiringContainerTrust", containerTrustStrings);
- outConfig.set("GriefPrevention.Mods.BlockIdsExplodable", explodableStrings);
outConfig.set("GriefPrevention.Advanced.fixNegativeClaimblockAmounts", this.config_advanced_fixNegativeClaimblockAmounts);
@@ -3368,8 +3350,8 @@ public class GriefPrevention extends JavaPlugin
PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
Claim claim = this.dataStore.getClaimAt(location, false, playerData.lastClaim);
- //exception: administrators in ignore claims mode and special player accounts created by server mods
- if(playerData.ignoreClaims || GriefPrevention.instance.config_mods_ignoreClaimsAccounts.contains(player.getName())) return null;
+ //exception: administrators in ignore claims mode
+ if(playerData.ignoreClaims) return null;
//wilderness rules
if(claim == null)
@@ -3420,8 +3402,8 @@ public class GriefPrevention extends JavaPlugin
PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
Claim claim = this.dataStore.getClaimAt(location, false, playerData.lastClaim);
- //exception: administrators in ignore claims mode, and special player accounts created by server mods
- if(playerData.ignoreClaims || GriefPrevention.instance.config_mods_ignoreClaimsAccounts.contains(player.getName())) return null;
+ //exception: administrators in ignore claims mode
+ if(playerData.ignoreClaims) return null;
//wilderness rules
if(claim == null)
@@ -3496,7 +3478,7 @@ public class GriefPrevention extends JavaPlugin
for(int y = 0; y < snapshots[0].length; y++)
{
Block block = chunk.getWorld().getBlockAt(startLocation.getBlockX() + x, startLocation.getBlockY() + y, startLocation.getBlockZ() + z);
- snapshots[x][y][z] = new BlockSnapshot(block.getLocation(), block.getType(), block.getData());
+ snapshots[x][y][z] = new BlockSnapshot(block.getLocation(), block.getType(), block.getBlockData());
}
}
}
@@ -3617,7 +3599,12 @@ public class GriefPrevention extends JavaPlugin
public static boolean isNewToServer(Player player)
{
- if(player.getStatistic(Statistic.PICKUP, Material.WOOD) > 0) return false;
+ if( player.getStatistic(Statistic.PICKUP, Material.OAK_LOG) > 0 ||
+ player.getStatistic(Statistic.PICKUP, Material.SPRUCE_LOG) > 0 ||
+ player.getStatistic(Statistic.PICKUP, Material.BIRCH_LOG) > 0 ||
+ player.getStatistic(Statistic.PICKUP, Material.JUNGLE_LOG) > 0 ||
+ player.getStatistic(Statistic.PICKUP, Material.ACACIA_LOG) > 0 ||
+ player.getStatistic(Statistic.PICKUP, Material.DARK_OAK_LOG) > 0) return false;
PlayerData playerData = instance.dataStore.getPlayerData(player.getUniqueId());
if(playerData.getClaims().size() > 0) return false;
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java b/src/main/java/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java
index 3ab1324..440ec2c 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java
@@ -42,10 +42,12 @@ import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
+import org.bukkit.Tag;
import org.bukkit.TravelAgent;
import org.bukkit.World.Environment;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
+import org.bukkit.block.data.Levelled;
import org.bukkit.command.Command;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Animals;
@@ -1059,11 +1061,11 @@ class PlayerEventHandler implements Listener
}
//if creating a new portal
- if(destination.getBlock().getType() != Material.PORTAL)
+ if(destination.getBlock().getType() != Material.NETHER_PORTAL)
{
//check for a land claim and the player's permission that land claim
Claim claim = this.dataStore.getClaimAt(destination, false, null);
- if(claim != null && claim.allowBuild(player, Material.PORTAL) != null)
+ if(claim != null && claim.allowBuild(player, Material.NETHER_PORTAL) != null)
{
//cancel and inform about the reason
event.setCancelled(true);
@@ -1296,7 +1298,7 @@ class PlayerEventHandler implements Listener
}
//if preventing theft, prevent leashing claimed creatures
- if(instance.config_claims_preventTheft && entity instanceof Creature && instance.getItemInHand(player, event.getHand()).getType() == Material.LEASH)
+ if(instance.config_claims_preventTheft && entity instanceof Creature && instance.getItemInHand(player, event.getHand()).getType() == Material.LEAD)
{
Claim claim = this.dataStore.getClaimAt(entity.getLocation(), false, playerData.lastClaim);
if(claim != null)
@@ -1426,8 +1428,8 @@ class PlayerEventHandler implements Listener
}
//block use of buckets within other players' claims
- private HashSet commonAdjacentBlocks_water = new HashSet(Arrays.asList(Material.WATER, Material.STATIONARY_WATER, Material.SOIL, Material.DIRT, Material.STONE));
- private HashSet commonAdjacentBlocks_lava = new HashSet(Arrays.asList(Material.LAVA, Material.STATIONARY_LAVA, Material.DIRT, Material.STONE));
+ private HashSet commonAdjacentBlocks_water = new HashSet(Arrays.asList(Material.WATER, Material.FARMLAND, Material.DIRT, Material.STONE));
+ private HashSet commonAdjacentBlocks_lava = new HashSet(Arrays.asList(Material.LAVA, Material.DIRT, Material.STONE));
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onPlayerBucketEmpty (PlayerBucketEmptyEvent bucketEvent)
{
@@ -1564,39 +1566,39 @@ class PlayerEventHandler implements Listener
}
//don't care about left-clicking on most blocks, this is probably a break action
- PlayerData playerData = null;
- if(action == Action.LEFT_CLICK_BLOCK && clickedBlock != null)
- {
- if(clickedBlock.getY() < clickedBlock.getWorld().getMaxHeight() - 1 || event.getBlockFace() != BlockFace.UP)
- {
- Block adjacentBlock = clickedBlock.getRelative(event.getBlockFace());
- byte lightLevel = adjacentBlock.getLightFromBlocks();
- if(lightLevel == 15 && adjacentBlock.getType() == Material.FIRE)
+ PlayerData playerData = null;
+ if(action == Action.LEFT_CLICK_BLOCK && clickedBlock != null)
{
- if(playerData == null) playerData = this.dataStore.getPlayerData(player.getUniqueId());
- Claim claim = this.dataStore.getClaimAt(clickedBlock.getLocation(), false, playerData.lastClaim);
- if(claim != null)
- {
- playerData.lastClaim = claim;
-
- String noBuildReason = claim.allowBuild(player, Material.AIR);
- if(noBuildReason != null)
+ if(clickedBlock.getY() < clickedBlock.getWorld().getMaxHeight() - 1 || event.getBlockFace() != BlockFace.UP)
+ {
+ Block adjacentBlock = clickedBlock.getRelative(event.getBlockFace());
+ byte lightLevel = adjacentBlock.getLightFromBlocks();
+ if(lightLevel == 15 && adjacentBlock.getType() == Material.FIRE)
+ {
+ if(playerData == null) playerData = this.dataStore.getPlayerData(player.getUniqueId());
+ Claim claim = this.dataStore.getClaimAt(clickedBlock.getLocation(), false, playerData.lastClaim);
+ if(claim != null)
+ {
+ playerData.lastClaim = claim;
+
+ String noBuildReason = claim.allowBuild(player, Material.AIR);
+ if(noBuildReason != null)
+ {
+ event.setCancelled(true);
+ instance.sendMessage(player, TextMode.Err, noBuildReason);
+ player.sendBlockChange(adjacentBlock.getLocation(), adjacentBlock.getType(), adjacentBlock.getData());
+ return;
+ }
+ }
+ }
+ }
+
+ //exception for blocks on a specific watch list
+ if(!this.onLeftClickWatchList(clickedBlockType))
{
- event.setCancelled(true);
- instance.sendMessage(player, TextMode.Err, noBuildReason);
- player.sendBlockChange(adjacentBlock.getLocation(), adjacentBlock.getType(), adjacentBlock.getData());
return;
}
- }
}
- }
-
- //exception for blocks on a specific watch list
- if(!this.onLeftClickWatchList(clickedBlockType) && !instance.config_mods_accessTrustIds.Contains(new MaterialInfo(clickedBlock.getType(), clickedBlock.getData(), null)))
- {
- return;
- }
- }
//apply rules for containers and crafting blocks
if( clickedBlock != null && instance.config_claims_preventTheft && (
@@ -1605,12 +1607,11 @@ class PlayerEventHandler implements Listener
clickedBlockType == Material.CAULDRON ||
clickedBlockType == Material.JUKEBOX ||
clickedBlockType == Material.ANVIL ||
- clickedBlockType == Material.CAKE_BLOCK ||
- instance.config_mods_containerTrustIds.Contains(new MaterialInfo(clickedBlock.getType(), clickedBlock.getData(), null)))))
+ clickedBlockType == Material.CAKE)))
{
- if(playerData == null) playerData = this.dataStore.getPlayerData(player.getUniqueId());
+ if(playerData == null) playerData = this.dataStore.getPlayerData(player.getUniqueId());
- //block container use while under siege, so players can't hide items from attackers
+ //block container use while under siege, so players can't hide items from attackers
if(playerData.siegeData != null)
{
instance.sendMessage(player, TextMode.Err, Messages.SiegeNoContainers);
@@ -1653,26 +1654,46 @@ class PlayerEventHandler implements Listener
//otherwise apply rules for doors and beds, if configured that way
else if( clickedBlock != null &&
- (instance.config_claims_lockWoodenDoors && (
- clickedBlockType == Material.WOODEN_DOOR ||
- clickedBlockType == Material.ACACIA_DOOR ||
- clickedBlockType == Material.BIRCH_DOOR ||
- clickedBlockType == Material.JUNGLE_DOOR ||
- clickedBlockType == Material.SPRUCE_DOOR ||
- clickedBlockType == Material.DARK_OAK_DOOR)) ||
+ (instance.config_claims_lockWoodenDoors && (
+ clickedBlockType == Material.OAK_DOOR ||
+ clickedBlockType == Material.ACACIA_DOOR ||
+ clickedBlockType == Material.BIRCH_DOOR ||
+ clickedBlockType == Material.JUNGLE_DOOR ||
+ clickedBlockType == Material.SPRUCE_DOOR ||
+ clickedBlockType == Material.DARK_OAK_DOOR)) ||
- (instance.config_claims_preventButtonsSwitches && clickedBlockType == Material.BED_BLOCK) ||
+ (instance.config_claims_preventButtonsSwitches && ( clickedBlockType == Material.WHITE_BED ||
+ clickedBlockType == Material.ORANGE_BED ||
+ clickedBlockType == Material.MAGENTA_BED ||
+ clickedBlockType == Material.LIGHT_BLUE_BED ||
+ clickedBlockType == Material.YELLOW_BED ||
+ clickedBlockType == Material.LIME_BED ||
+ clickedBlockType == Material.PINK_BED ||
+ clickedBlockType == Material.GRAY_BED ||
+ clickedBlockType == Material.LIGHT_GRAY_BED ||
+ clickedBlockType == Material.CYAN_BED ||
+ clickedBlockType == Material.PURPLE_BED ||
+ clickedBlockType == Material.BLUE_BED ||
+ clickedBlockType == Material.BROWN_BED ||
+ clickedBlockType == Material.GREEN_BED ||
+ clickedBlockType == Material.RED_BED ||
+ clickedBlockType == Material.BLACK_BED)) ||
(instance.config_claims_lockTrapDoors && (
- clickedBlockType == Material.TRAP_DOOR)) ||
+ clickedBlockType == Material.OAK_TRAPDOOR ||
+ clickedBlockType == Material.SPRUCE_TRAPDOOR ||
+ clickedBlockType == Material.BIRCH_TRAPDOOR ||
+ clickedBlockType == Material.JUNGLE_TRAPDOOR ||
+ clickedBlockType == Material.ACACIA_TRAPDOOR ||
+ clickedBlockType == Material.DARK_OAK_TRAPDOOR)) ||
(instance.config_claims_lockFenceGates && (
- clickedBlockType == Material.FENCE_GATE ||
- clickedBlockType == Material.ACACIA_FENCE_GATE ||
- clickedBlockType == Material.BIRCH_FENCE_GATE ||
- clickedBlockType == Material.JUNGLE_FENCE_GATE ||
- clickedBlockType == Material.SPRUCE_FENCE_GATE ||
- clickedBlockType == Material.DARK_OAK_FENCE_GATE)))
+ clickedBlockType == Material.OAK_FENCE_GATE ||
+ clickedBlockType == Material.ACACIA_FENCE_GATE ||
+ clickedBlockType == Material.BIRCH_FENCE_GATE ||
+ clickedBlockType == Material.JUNGLE_FENCE_GATE ||
+ clickedBlockType == Material.SPRUCE_FENCE_GATE ||
+ clickedBlockType == Material.DARK_OAK_FENCE_GATE)))
{
if(playerData == null) playerData = this.dataStore.getPlayerData(player.getUniqueId());
Claim claim = this.dataStore.getClaimAt(clickedBlock.getLocation(), false, playerData.lastClaim);
@@ -1691,7 +1712,7 @@ class PlayerEventHandler implements Listener
}
//otherwise apply rules for buttons and switches
- else if(clickedBlock != null && instance.config_claims_preventButtonsSwitches && (clickedBlockType == null || clickedBlockType == Material.STONE_BUTTON || clickedBlockType == Material.WOOD_BUTTON || clickedBlockType == Material.LEVER || instance.config_mods_accessTrustIds.Contains(new MaterialInfo(clickedBlock.getType(), clickedBlock.getData(), null))))
+ else if(clickedBlock != null && instance.config_claims_preventButtonsSwitches && (clickedBlockType == null || clickedBlockType == Material.STONE_BUTTON || Tag.BUTTONS.isTagged(clickedBlockType) || clickedBlockType == Material.LEVER))
{
if(playerData == null) playerData = this.dataStore.getPlayerData(player.getUniqueId());
Claim claim = this.dataStore.getClaimAt(clickedBlock.getLocation(), false, playerData.lastClaim);
@@ -1710,7 +1731,7 @@ class PlayerEventHandler implements Listener
}
//otherwise apply rule for cake
- else if(clickedBlock != null && instance.config_claims_preventTheft && clickedBlockType == Material.CAKE_BLOCK)
+ else if(clickedBlock != null && instance.config_claims_preventTheft && clickedBlockType == Material.CAKE)
{
if(playerData == null) playerData = this.dataStore.getPlayerData(player.getUniqueId());
Claim claim = this.dataStore.getClaimAt(clickedBlock.getLocation(), false, playerData.lastClaim);
@@ -1730,16 +1751,13 @@ class PlayerEventHandler implements Listener
//apply rule for note blocks and repeaters and daylight sensors //RoboMWM: Include flower pots
else if(clickedBlock != null &&
- (
+ (
clickedBlockType == Material.NOTE_BLOCK ||
- clickedBlockType == Material.DIODE_BLOCK_ON ||
- clickedBlockType == Material.DIODE_BLOCK_OFF ||
+ clickedBlockType == Material.REPEATER ||
clickedBlockType == Material.DRAGON_EGG ||
clickedBlockType == Material.DAYLIGHT_DETECTOR ||
- clickedBlockType == Material.DAYLIGHT_DETECTOR_INVERTED ||
- clickedBlockType == Material.REDSTONE_COMPARATOR_ON ||
- clickedBlockType == Material.REDSTONE_COMPARATOR_OFF ||
- clickedBlockType == Material.FLOWER_POT
+ clickedBlockType == Material.COMPARATOR ||
+ clickedBlockType == Material.FLOWER_POT
))
{
if(playerData == null) playerData = this.dataStore.getPlayerData(player.getUniqueId());
@@ -1765,10 +1783,64 @@ class PlayerEventHandler implements Listener
//what's the player holding?
EquipmentSlot hand = event.getHand();
ItemStack itemInHand = instance.getItemInHand(player, hand);
- Material materialInHand = itemInHand.getType();
+ Material materialInHand = itemInHand.getType();
+
+ ArrayList spawn_eggs = new ArrayList();
+
+ spawn_eggs.add(Material.BAT_SPAWN_EGG);
+ spawn_eggs.add(Material.BLAZE_SPAWN_EGG);
+ spawn_eggs.add(Material.CAVE_SPIDER_SPAWN_EGG);
+ spawn_eggs.add(Material.CHICKEN_SPAWN_EGG);
+ spawn_eggs.add(Material.COD_SPAWN_EGG);
+ spawn_eggs.add(Material.COW_SPAWN_EGG);
+ spawn_eggs.add(Material.CREEPER_SPAWN_EGG);
+ spawn_eggs.add(Material.DOLPHIN_SPAWN_EGG);
+ spawn_eggs.add(Material.DONKEY_SPAWN_EGG);
+ spawn_eggs.add(Material.DROWNED_SPAWN_EGG);
+ spawn_eggs.add(Material.ELDER_GUARDIAN_SPAWN_EGG);
+ spawn_eggs.add(Material.ENDERMAN_SPAWN_EGG);
+ spawn_eggs.add(Material.ENDERMITE_SPAWN_EGG);
+ spawn_eggs.add(Material.EVOKER_SPAWN_EGG);
+ spawn_eggs.add(Material.GHAST_SPAWN_EGG);
+ spawn_eggs.add(Material.GUARDIAN_SPAWN_EGG);
+ spawn_eggs.add(Material.HORSE_SPAWN_EGG);
+ spawn_eggs.add(Material.HUSK_SPAWN_EGG);
+ spawn_eggs.add(Material.LLAMA_SPAWN_EGG);
+ spawn_eggs.add(Material.MAGMA_CUBE_SPAWN_EGG);
+ spawn_eggs.add(Material.MOOSHROOM_SPAWN_EGG);
+ spawn_eggs.add(Material.MULE_SPAWN_EGG);
+ spawn_eggs.add(Material.OCELOT_SPAWN_EGG);
+ spawn_eggs.add(Material.PARROT_SPAWN_EGG);
+ spawn_eggs.add(Material.PHANTOM_SPAWN_EGG);
+ spawn_eggs.add(Material.PIG_SPAWN_EGG);
+ spawn_eggs.add(Material.POLAR_BEAR_SPAWN_EGG);
+ spawn_eggs.add(Material.PUFFERFISH_SPAWN_EGG);
+ spawn_eggs.add(Material.RABBIT_SPAWN_EGG);
+ spawn_eggs.add(Material.SALMON_SPAWN_EGG);
+ spawn_eggs.add(Material.SHEEP_SPAWN_EGG);
+ spawn_eggs.add(Material.SHULKER_SPAWN_EGG);
+ spawn_eggs.add(Material.SILVERFISH_SPAWN_EGG);
+ spawn_eggs.add(Material.SKELETON_SPAWN_EGG);
+ spawn_eggs.add(Material.SKELETON_HORSE_SPAWN_EGG);
+ spawn_eggs.add(Material.SLIME_SPAWN_EGG);
+ spawn_eggs.add(Material.SPIDER_SPAWN_EGG);
+ spawn_eggs.add(Material.SQUID_SPAWN_EGG);
+ spawn_eggs.add(Material.STRAY_SPAWN_EGG);
+ spawn_eggs.add(Material.TROPICAL_FISH_SPAWN_EGG);
+ spawn_eggs.add(Material.TURTLE_SPAWN_EGG);
+ spawn_eggs.add(Material.VEX_SPAWN_EGG);
+ spawn_eggs.add(Material.VILLAGER_SPAWN_EGG);
+ spawn_eggs.add(Material.VINDICATOR_SPAWN_EGG);
+ spawn_eggs.add(Material.WITCH_SPAWN_EGG);
+ spawn_eggs.add(Material.WITHER_SKELETON_SPAWN_EGG);
+ spawn_eggs.add(Material.WOLF_SPAWN_EGG);
+ spawn_eggs.add(Material.ZOMBIE_SPAWN_EGG);
+ spawn_eggs.add(Material.ZOMBIE_HORSE_SPAWN_EGG);
+ spawn_eggs.add(Material.ZOMBIE_PIGMAN_SPAWN_EGG);
+ spawn_eggs.add(Material.ZOMBIE_VILLAGER_SPAWN_EGG);
//if it's bonemeal, armor stand, spawn egg, etc - check for build permission (ink sac == bone meal, must be a Bukkit bug?)
- if(clickedBlock != null && (materialInHand == Material.INK_SACK || materialInHand == Material.ARMOR_STAND || (materialInHand == Material.MONSTER_EGG && GriefPrevention.instance.config_claims_preventGlobalMonsterEggs) || materialInHand == Material.END_CRYSTAL))
+ if(clickedBlock != null && (materialInHand == Material.BONE_MEAL || materialInHand == Material.ARMOR_STAND || (spawn_eggs.contains(materialInHand) && GriefPrevention.instance.config_claims_preventGlobalMonsterEggs) || materialInHand == Material.END_CRYSTAL))
{
String noBuildReason = instance.allowBuild(player, clickedBlock.getLocation(), clickedBlockType);
if(noBuildReason != null)
@@ -1781,18 +1853,18 @@ class PlayerEventHandler implements Listener
}
else if(clickedBlock != null && (
- materialInHand == Material.BOAT ||
- materialInHand == Material.BOAT_ACACIA ||
- materialInHand == Material.BOAT_BIRCH ||
- materialInHand == Material.BOAT_DARK_OAK ||
- materialInHand == Material.BOAT_JUNGLE ||
- materialInHand == Material.BOAT_SPRUCE))
+ materialInHand == Material.OAK_BOAT ||
+ materialInHand == Material.SPRUCE_BOAT ||
+ materialInHand == Material.BIRCH_BOAT ||
+ materialInHand == Material.JUNGLE_BOAT ||
+ materialInHand == Material.ACACIA_BOAT ||
+ materialInHand == Material.DARK_OAK_BOAT))
{
if(playerData == null) playerData = this.dataStore.getPlayerData(player.getUniqueId());
Claim claim = this.dataStore.getClaimAt(clickedBlock.getLocation(), false, playerData.lastClaim);
if(claim != null)
{
- String noBuildReason = claim.allowBuild(player, Material.BOAT);
+ String noBuildReason = claim.allowBuild(player, Material.OAK_BOAT); // Though only checks OAK_BOAT, permission should be same for all boats. Plus it being a boat doesn't seem to make a difference currently.
if(noBuildReason != null)
{
instance.sendMessage(player, TextMode.Err, noBuildReason);
@@ -1805,26 +1877,44 @@ class PlayerEventHandler implements Listener
//survival world minecart placement requires container trust, which is the permission required to remove the minecart later
else if(clickedBlock != null &&
- (materialInHand == Material.MINECART || materialInHand == Material.POWERED_MINECART || materialInHand == Material.STORAGE_MINECART || materialInHand == Material.EXPLOSIVE_MINECART || materialInHand == Material.HOPPER_MINECART) &&
- !instance.creativeRulesApply(clickedBlock.getLocation()))
- {
- if(playerData == null) playerData = this.dataStore.getPlayerData(player.getUniqueId());
- Claim claim = this.dataStore.getClaimAt(clickedBlock.getLocation(), false, playerData.lastClaim);
- if(claim != null)
- {
- String reason = claim.allowContainers(player);
- if(reason != null)
- {
- instance.sendMessage(player, TextMode.Err, reason);
- event.setCancelled(true);
- }
- }
-
- return;
- }
+ (materialInHand == Material.MINECART ||
+ materialInHand == Material.FURNACE_MINECART ||
+ materialInHand == Material.CHEST_MINECART ||
+ materialInHand == Material.TNT_MINECART ||
+ materialInHand == Material.HOPPER_MINECART) &&
+ !instance.creativeRulesApply(clickedBlock.getLocation()))
+ {
+ if(playerData == null) playerData = this.dataStore.getPlayerData(player.getUniqueId());
+ Claim claim = this.dataStore.getClaimAt(clickedBlock.getLocation(), false, playerData.lastClaim);
+ if(claim != null)
+ {
+ String reason = claim.allowContainers(player);
+ if(reason != null)
+ {
+ instance.sendMessage(player, TextMode.Err, reason);
+ event.setCancelled(true);
+ }
+ }
+
+ return;
+ }
//if it's a spawn egg, minecart, or boat, and this is a creative world, apply special rules
- else if(clickedBlock != null && (materialInHand == Material.MINECART || materialInHand == Material.POWERED_MINECART || materialInHand == Material.STORAGE_MINECART || materialInHand == Material.ARMOR_STAND || materialInHand == Material.ITEM_FRAME || materialInHand == Material.MONSTER_EGG || materialInHand == Material.MONSTER_EGGS || materialInHand == Material.EXPLOSIVE_MINECART || materialInHand == Material.HOPPER_MINECART) && instance.creativeRulesApply(clickedBlock.getLocation()))
+ else if(clickedBlock != null && (materialInHand == Material.MINECART ||
+ materialInHand == Material.FURNACE_MINECART ||
+ materialInHand == Material.CHEST_MINECART ||
+ materialInHand == Material.TNT_MINECART ||
+ materialInHand == Material.ARMOR_STAND ||
+ materialInHand == Material.ITEM_FRAME ||
+ spawn_eggs.contains(materialInHand) ||
+ materialInHand == Material.INFESTED_STONE ||
+ materialInHand == Material.INFESTED_COBBLESTONE ||
+ materialInHand == Material.INFESTED_STONE_BRICKS ||
+ materialInHand == Material.INFESTED_MOSSY_STONE_BRICKS ||
+ materialInHand == Material.INFESTED_CRACKED_STONE_BRICKS ||
+ materialInHand == Material.INFESTED_CHISELED_STONE_BRICKS ||
+ materialInHand == Material.HOPPER_MINECART) &&
+ instance.creativeRulesApply(clickedBlock.getLocation()))
{
//player needs build permission at this location
String noBuildReason = instance.allowBuild(player, clickedBlock.getLocation(), Material.MINECART);
@@ -2043,7 +2133,7 @@ class PlayerEventHandler implements Listener
}
else if(environment == Environment.THE_END)
{
- allowedFillBlocks.add(Material.ENDER_STONE);
+ allowedFillBlocks.add(Material.END_STONE);
}
else
{
@@ -2084,7 +2174,7 @@ class PlayerEventHandler implements Listener
}
//if the player clicks on water, try to sink through the water to find something underneath that's useful for a filler
- else if(centerBlock.getType() == Material.WATER || centerBlock.getType() == Material.STATIONARY_WATER)
+ else if(centerBlock.getType() == Material.WATER)
{
Block block = centerBlock.getWorld().getBlockAt(centerBlock.getLocation());
while(!allowedFillBlocks.contains(block.getType()) && block.getY() > centerBlock.getY() - 10)
@@ -2111,7 +2201,7 @@ class PlayerEventHandler implements Listener
}
//only replace air, spilling water, snow, long grass
- if(block.getType() == Material.AIR || block.getType() == Material.SNOW || (block.getType() == Material.STATIONARY_WATER && block.getData() != 0) || block.getType() == Material.LONG_GRASS)
+ if(block.getType() == Material.AIR || block.getType() == Material.SNOW || (block.getType() == Material.WATER && ((Levelled) block.getBlockData()).getLevel() != 0) || block.getType() == Material.GRASS)
{
//if the top level, always use the default filler picked above
if(y == maxHeight)
@@ -2511,18 +2601,22 @@ class PlayerEventHandler implements Listener
this.inventoryHolderCache.put(cacheKey, isHolder);
return isHolder;
}
- }
+ }
private boolean onLeftClickWatchList(Material material)
{
switch(material)
{
- case WOOD_BUTTON:
+ case OAK_BUTTON:
+ case SPRUCE_BUTTON:
+ case BIRCH_BUTTON:
+ case JUNGLE_BUTTON:
+ case ACACIA_BUTTON:
+ case DARK_OAK_BUTTON:
case STONE_BUTTON:
case LEVER:
- case DIODE_BLOCK_ON: //redstone repeater
- case DIODE_BLOCK_OFF:
- case CAKE_BLOCK:
+ case REPEATER:
+ case CAKE:
case DRAGON_EGG:
return true;
default:
@@ -2534,7 +2628,7 @@ class PlayerEventHandler implements Listener
{
Location eye = player.getEyeLocation();
Material eyeMaterial = eye.getBlock().getType();
- boolean passThroughWater = (eyeMaterial == Material.WATER || eyeMaterial == Material.STATIONARY_WATER);
+ boolean passThroughWater = (eyeMaterial == Material.WATER);
BlockIterator iterator = new BlockIterator(player.getLocation(), player.getEyeHeight(), maxDistance);
Block result = player.getLocation().getBlock().getRelative(BlockFace.UP);
while (iterator.hasNext())
@@ -2542,9 +2636,8 @@ class PlayerEventHandler implements Listener
result = iterator.next();
Material type = result.getType();
if(type != Material.AIR &&
- (!passThroughWater || type != Material.STATIONARY_WATER) &&
(!passThroughWater || type != Material.WATER) &&
- type != Material.LONG_GRASS &&
+ type != Material.GRASS &&
type != Material.SNOW) return result;
}
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/RestoreNatureExecutionTask.java b/src/main/java/me/ryanhamshire/GriefPrevention/RestoreNatureExecutionTask.java
index 8911d6d..84fe486 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/RestoreNatureExecutionTask.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/RestoreNatureExecutionTask.java
@@ -56,7 +56,7 @@ class RestoreNatureExecutionTask implements Runnable
}
@SuppressWarnings("deprecation")
- @Override
+ @Override
public void run()
{
//apply changes to the world, but ONLY to unclaimed blocks
@@ -71,7 +71,7 @@ class RestoreNatureExecutionTask implements Runnable
{
BlockSnapshot blockUpdate = this.snapshots[x][y][z];
Block currentBlock = blockUpdate.location.getBlock();
- if(blockUpdate.typeId != currentBlock.getType()|| blockUpdate.data != currentBlock.getData())
+ if(blockUpdate.typeId != currentBlock.getType()|| !blockUpdate.data.equals(currentBlock.getBlockData()))
{
Claim claim = GriefPrevention.instance.dataStore.getClaimAt(blockUpdate.location, false, cachedClaim);
if(claim != null)
@@ -82,8 +82,8 @@ class RestoreNatureExecutionTask implements Runnable
try
{
- currentBlock.setType(blockUpdate.typeId, false);
- currentBlock.setData(blockUpdate.data, false);
+ currentBlock.setType(blockUpdate.typeId, false);
+ currentBlock.setBlockData(blockUpdate.data, false);
}
catch(IllegalArgumentException e)
{
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/RestoreNatureProcessingTask.java b/src/main/java/me/ryanhamshire/GriefPrevention/RestoreNatureProcessingTask.java
index 2685dab..abbb408 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/RestoreNatureProcessingTask.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/RestoreNatureProcessingTask.java
@@ -22,8 +22,11 @@ import java.util.ArrayList;
import org.bukkit.Location;
import org.bukkit.Material;
+import org.bukkit.Tag;
import org.bukkit.World.Environment;
import org.bukkit.block.Biome;
+import org.bukkit.block.data.Levelled;
+import org.bukkit.block.data.type.Leaves;
import org.bukkit.entity.Player;
//non-main-thread task which processes world data to repair the unnatural
@@ -67,9 +70,14 @@ class RestoreNatureProcessingTask implements Runnable
this.notAllowedToHang = new ArrayList();
this.notAllowedToHang.add(Material.DIRT);
- this.notAllowedToHang.add(Material.LONG_GRASS);
+ this.notAllowedToHang.add(Material.GRASS);
this.notAllowedToHang.add(Material.SNOW);
- this.notAllowedToHang.add(Material.LOG);
+ this.notAllowedToHang.add(Material.OAK_LOG);
+ this.notAllowedToHang.add(Material.SPRUCE_LOG);
+ this.notAllowedToHang.add(Material.BIRCH_LOG);
+ this.notAllowedToHang.add(Material.JUNGLE_LOG);
+ this.notAllowedToHang.add(Material.ACACIA_LOG);
+ this.notAllowedToHang.add(Material.DARK_OAK_LOG);
if(this.aggressiveMode)
{
@@ -88,21 +96,28 @@ class RestoreNatureProcessingTask implements Runnable
this.playerBlocks.add(Material.IRON_ORE);
this.playerBlocks.add(Material.GOLD_ORE);
this.playerBlocks.add(Material.DIAMOND_ORE);
- this.playerBlocks.add(Material.MELON_BLOCK);
+ this.playerBlocks.add(Material.MELON);
this.playerBlocks.add(Material.MELON_STEM);
this.playerBlocks.add(Material.BEDROCK);
this.playerBlocks.add(Material.COAL_ORE);
this.playerBlocks.add(Material.PUMPKIN);
this.playerBlocks.add(Material.PUMPKIN_STEM);
- this.playerBlocks.add(Material.MELON);
}
if(this.aggressiveMode)
{
- this.playerBlocks.add(Material.LEAVES);
- this.playerBlocks.add(Material.LEAVES_2);
- this.playerBlocks.add(Material.LOG);
- this.playerBlocks.add(Material.LOG_2);
+ this.playerBlocks.add(Material.OAK_LEAVES);
+ this.playerBlocks.add(Material.SPRUCE_LEAVES);
+ this.playerBlocks.add(Material.BIRCH_LEAVES);
+ this.playerBlocks.add(Material.JUNGLE_LEAVES);
+ this.playerBlocks.add(Material.ACACIA_LEAVES);
+ this.playerBlocks.add(Material.DARK_OAK_LEAVES);
+ this.playerBlocks.add(Material.OAK_LOG);
+ this.playerBlocks.add(Material.SPRUCE_LOG);
+ this.playerBlocks.add(Material.BIRCH_LOG);
+ this.playerBlocks.add(Material.JUNGLE_LOG);
+ this.playerBlocks.add(Material.ACACIA_LOG);
+ this.playerBlocks.add(Material.DARK_OAK_LOG);
this.playerBlocks.add(Material.VINE);
}
}
@@ -161,9 +176,8 @@ class RestoreNatureProcessingTask implements Runnable
{
for(int y = this.seaLevel - 1; y < snapshots[0].length; y++)
{
- //note: see minecraft wiki data values for leaves
BlockSnapshot block = snapshots[x][y][z];
- if(block.typeId == Material.LEAVES && (block.data & 0x4) != 0)
+ if(Tag.LEAVES.isTagged(block.typeId) && ((Leaves) block.data).isPersistent())
{
block.typeId = Material.AIR;
}
@@ -233,19 +247,19 @@ class RestoreNatureProcessingTask implements Runnable
//count adjacent non-air/non-leaf blocks
byte adjacentBlockCount = 0;
- if(leftBlock.typeId != Material.AIR && leftBlock.typeId != Material.LEAVES && leftBlock.typeId != Material.VINE)
+ if(leftBlock.typeId != Material.AIR && !Tag.LEAVES.isTagged(leftBlock.typeId) && leftBlock.typeId != Material.VINE)
{
adjacentBlockCount++;
}
- if(rightBlock.typeId != Material.AIR && rightBlock.typeId != Material.LEAVES && rightBlock.typeId != Material.VINE)
+ if(rightBlock.typeId != Material.AIR && !Tag.LEAVES.isTagged(rightBlock.typeId) && rightBlock.typeId != Material.VINE)
{
adjacentBlockCount++;
}
- if(downBlock.typeId != Material.AIR && downBlock.typeId != Material.LEAVES && downBlock.typeId != Material.VINE)
+ if(downBlock.typeId != Material.AIR && !Tag.LEAVES.isTagged(downBlock.typeId) && downBlock.typeId != Material.VINE)
{
adjacentBlockCount++;
}
- if(upBlock.typeId != Material.AIR && upBlock.typeId != Material.LEAVES && upBlock.typeId != Material.VINE)
+ if(upBlock.typeId != Material.AIR && !Tag.LEAVES.isTagged(upBlock.typeId) && upBlock.typeId != Material.VINE)
{
adjacentBlockCount++;
}
@@ -278,11 +292,10 @@ class RestoreNatureProcessingTask implements Runnable
BlockSnapshot block = snapshots[x][y][z];
//skip non-logs
- if(block.typeId != Material.LOG) continue;
- if(block.typeId != Material.LOG_2) continue;
+ if(!Tag.LOGS.isTagged(block.typeId)) continue;
//if in jungle biome, skip jungle logs
- if(jungleBiome && block.data == 3) continue;
+ if(jungleBiome && block.typeId == Material.JUNGLE_LOG) continue;
//examine adjacent blocks for logs
BlockSnapshot leftBlock = this.snapshots[x + 1][y][z];
@@ -291,7 +304,7 @@ class RestoreNatureProcessingTask implements Runnable
BlockSnapshot downBlock = this.snapshots[x][y][z - 1];
//if any, remove the log
- if(leftBlock.typeId == Material.LOG || rightBlock.typeId == Material.LOG || upBlock.typeId == Material.LOG || downBlock.typeId == Material.LOG)
+ if(Tag.LOGS.isTagged(leftBlock.typeId) || Tag.LOGS.isTagged(rightBlock.typeId) || Tag.LOGS.isTagged(upBlock.typeId) || Tag.LOGS.isTagged(downBlock.typeId))
{
this.snapshots[x][y][z].typeId = Material.AIR;
}
@@ -338,7 +351,7 @@ class RestoreNatureProcessingTask implements Runnable
BlockSnapshot block = snapshots[x][y][z];
BlockSnapshot underBlock = snapshots[x][y - 1][z];
- if(underBlock.typeId == Material.AIR || underBlock.typeId == Material.STATIONARY_WATER || underBlock.typeId == Material.STATIONARY_LAVA || underBlock.typeId == Material.LEAVES)
+ if(underBlock.typeId == Material.AIR || underBlock.typeId == Material.WATER || Tag.LEAVES.isTagged(underBlock.typeId))
{
if(this.notAllowedToHang.contains(block.typeId))
{
@@ -356,22 +369,31 @@ class RestoreNatureProcessingTask implements Runnable
Material [] excludedBlocksArray = new Material []
{
Material.CACTUS,
- Material.LONG_GRASS,
+ Material.GRASS,
Material.RED_MUSHROOM,
Material.BROWN_MUSHROOM,
Material.DEAD_BUSH,
- Material.SAPLING,
- Material.YELLOW_FLOWER,
- Material.RED_ROSE,
- Material.SUGAR_CANE_BLOCK,
+ Material.DANDELION,
+ Material.POPPY,
+ Material.ALLIUM,
+ Material.BLUE_ORCHID,
+ Material.AZURE_BLUET,
+ Material.RED_TULIP,
+ Material.ORANGE_TULIP,
+ Material.WHITE_TULIP,
+ Material.PINK_TULIP,
+ Material.OXEYE_DAISY,
+ Material.SUGAR_CANE,
Material.VINE,
Material.PUMPKIN,
- Material.WATER_LILY,
- Material.LEAVES
+ Material.LILY_PAD
};
ArrayList excludedBlocks = new ArrayList();
for(int i = 0; i < excludedBlocksArray.length; i++) excludedBlocks.add(excludedBlocksArray[i]);
+
+ excludedBlocks.addAll(Tag.SAPLINGS.getValues());
+ excludedBlocks.addAll(Tag.LEAVES.getValues());
boolean changed;
do
@@ -414,9 +436,9 @@ class RestoreNatureProcessingTask implements Runnable
int y = this.highestY(x, z, true);
BlockSnapshot block = snapshots[x][y][z];
- if(block.typeId == Material.STONE || block.typeId == Material.GRAVEL || block.typeId == Material.SOIL || block.typeId == Material.DIRT || block.typeId == Material.SANDSTONE)
+ if(block.typeId == Material.STONE || block.typeId == Material.GRAVEL || block.typeId == Material.FARMLAND || block.typeId == Material.DIRT || block.typeId == Material.SANDSTONE)
{
- if(this.biome == Biome.DESERT || this.biome == Biome.DESERT_HILLS || this.biome == Biome.BEACHES)
+ if(this.biome == Biome.DESERT || this.biome == Biome.DESERT_HILLS || this.biome == Biome.BEACH)
{
this.snapshots[x][y][z].typeId = Material.SAND;
}
@@ -434,17 +456,16 @@ class RestoreNatureProcessingTask implements Runnable
{
ArrayList fillableBlocks = new ArrayList();
fillableBlocks.add(Material.AIR);
- fillableBlocks.add(Material.STATIONARY_WATER);
- fillableBlocks.add(Material.STATIONARY_LAVA);
- fillableBlocks.add(Material.LONG_GRASS);
+ fillableBlocks.add(Material.WATER);
+ fillableBlocks.add(Material.LAVA);
+ fillableBlocks.add(Material.GRASS);
ArrayList notSuitableForFillBlocks = new ArrayList();
- notSuitableForFillBlocks.add(Material.LONG_GRASS);
+ notSuitableForFillBlocks.add(Material.GRASS);
notSuitableForFillBlocks.add(Material.CACTUS);
- notSuitableForFillBlocks.add(Material.STATIONARY_WATER);
- notSuitableForFillBlocks.add(Material.STATIONARY_LAVA);
- notSuitableForFillBlocks.add(Material.LOG);
- notSuitableForFillBlocks.add(Material.LOG_2);
+ notSuitableForFillBlocks.add(Material.WATER);
+ notSuitableForFillBlocks.add(Material.LAVA);
+ notSuitableForFillBlocks.addAll(Tag.LOGS.getValues());
boolean changed;
do
@@ -504,10 +525,11 @@ class RestoreNatureProcessingTask implements Runnable
for(int y = miny; y < snapshots[0].length - 1; y++)
{
BlockSnapshot block = this.snapshots[x][y][z];
- BlockSnapshot underBlock = this.snapshots[x][y][z];
- if(block.typeId == Material.STATIONARY_WATER || block.typeId == Material.STATIONARY_LAVA)
+ BlockSnapshot underBlock = this.snapshots[x][y--][z];
+ if(block.typeId == Material.WATER || block.typeId == Material.LAVA)
{
- if(underBlock.typeId == Material.AIR || (underBlock.data != 0))
+ // check if block below is air or is a non-source fluid block (level 1-7 = flowing, 8 = falling)
+ if(underBlock.typeId == Material.AIR || (underBlock.typeId == Material.WATER && (((Levelled) underBlock.data).getLevel() != 0)))
{
block.typeId = Material.AIR;
}
@@ -529,7 +551,7 @@ class RestoreNatureProcessingTask implements Runnable
BlockSnapshot block = snapshots[x][y][z];
//only consider air blocks and flowing water blocks for upgrade to water source blocks
- if(block.typeId == Material.AIR || (block.typeId == Material.STATIONARY_WATER && block.data != 0))
+ if(block.typeId == Material.AIR || (block.typeId == Material.WATER && ((Levelled) block.data).getLevel() != 0))
{
BlockSnapshot leftBlock = this.snapshots[x + 1][y][z];
BlockSnapshot rightBlock = this.snapshots[x - 1][y][z];
@@ -538,23 +560,23 @@ class RestoreNatureProcessingTask implements Runnable
BlockSnapshot underBlock = this.snapshots[x][y - 1][z];
//block underneath MUST be source water
- if(underBlock.typeId != Material.STATIONARY_WATER || underBlock.data != 0) continue;
+ if(!(underBlock.typeId == Material.WATER && ((Levelled) underBlock.data).getLevel() == 0)) continue;
//count adjacent source water blocks
byte adjacentSourceWaterCount = 0;
- if(leftBlock.typeId == Material.STATIONARY_WATER && leftBlock.data == 0)
+ if(leftBlock.typeId == Material.WATER && ((Levelled) leftBlock.data).getLevel() == 0)
{
adjacentSourceWaterCount++;
}
- if(rightBlock.typeId == Material.STATIONARY_WATER && rightBlock.data == 0)
+ if(rightBlock.typeId == Material.WATER && ((Levelled) rightBlock.data).getLevel() == 0)
{
adjacentSourceWaterCount++;
}
- if(upBlock.typeId == Material.STATIONARY_WATER && upBlock.data == 0)
+ if(upBlock.typeId == Material.WATER && ((Levelled) upBlock.data).getLevel() == 0)
{
adjacentSourceWaterCount++;
}
- if(downBlock.typeId == Material.STATIONARY_WATER && downBlock.data == 0)
+ if(downBlock.typeId == Material.WATER && ((Levelled) downBlock.data).getLevel() == 0)
{
adjacentSourceWaterCount++;
}
@@ -562,8 +584,8 @@ class RestoreNatureProcessingTask implements Runnable
//at least two adjacent blocks must be source water
if(adjacentSourceWaterCount >= 2)
{
- block.typeId = Material.STATIONARY_WATER;
- block.data = 0;
+ block.typeId = Material.WATER;
+ ((Levelled) downBlock.data).setLevel(0);
changed = true;
}
}
@@ -578,7 +600,7 @@ class RestoreNatureProcessingTask implements Runnable
{
if(this.seaLevel < 1) return;
- //remove any surface water or lava above sea level, presumed to be placed by players
+ //remove any surface water or lava above sea level, presumed to be placed by players
//sometimes, this is naturally generated. but replacing it is very easy with a bucket, so overall this is a good plan
if(this.environment == Environment.NETHER) return;
for(int x = 1; x < snapshots.length - 1; x++)
@@ -588,8 +610,7 @@ class RestoreNatureProcessingTask implements Runnable
for(int y = this.seaLevel - 1; y < snapshots[0].length - 1; y++)
{
BlockSnapshot block = snapshots[x][y][z];
- if(block.typeId == Material.STATIONARY_WATER || block.typeId == Material.STATIONARY_LAVA ||
- block.typeId == Material.WATER || block.typeId == Material.LAVA)
+ if(block.typeId == Material.WATER || block.typeId == Material.LAVA)
{
block.typeId = Material.AIR;
}
@@ -599,7 +620,7 @@ class RestoreNatureProcessingTask implements Runnable
}
@SuppressWarnings("deprecation")
- private int highestY(int x, int z, boolean ignoreLeaves)
+ private int highestY(int x, int z, boolean ignoreLeaves)
{
int y;
for(y = snapshots[0].length - 1; y > 0; y--)
@@ -607,12 +628,9 @@ class RestoreNatureProcessingTask implements Runnable
BlockSnapshot block = this.snapshots[x][y][z];
if(block.typeId != Material.AIR &&
!(ignoreLeaves && block.typeId == Material.SNOW) &&
- !(ignoreLeaves && block.typeId == Material.LEAVES) &&
- !(ignoreLeaves && block.typeId == Material.LEAVES_2) &&
- !(block.typeId == Material.STATIONARY_WATER) &&
+ !(ignoreLeaves && Tag.LEAVES.isTagged(block.typeId)) &&
!(block.typeId == Material.WATER) &&
- !(block.typeId == Material.LAVA) &&
- !(block.typeId == Material.STATIONARY_LAVA))
+ !(block.typeId == Material.LAVA))
{
return y;
}
@@ -622,15 +640,35 @@ class RestoreNatureProcessingTask implements Runnable
}
@SuppressWarnings("deprecation")
- static ArrayList getPlayerBlocks(Environment environment, Biome biome)
+ static ArrayList getPlayerBlocks(Environment environment, Biome biome)
{
//NOTE on this list. why not make a list of natural blocks?
//answer: better to leave a few player blocks than to remove too many natural blocks. remember we're "restoring nature"
//a few extra player blocks can be manually removed, but it will be impossible to guess exactly which natural materials to use in manual repair of an overzealous block removal
ArrayList playerBlocks = new ArrayList();
playerBlocks.add(Material.FIRE);
- playerBlocks.add(Material.BED_BLOCK);
- playerBlocks.add(Material.WOOD);
+ playerBlocks.add(Material.WHITE_BED);
+ playerBlocks.add(Material.ORANGE_BED);
+ playerBlocks.add(Material.MAGENTA_BED);
+ playerBlocks.add(Material.LIGHT_BLUE_BED);
+ playerBlocks.add(Material.YELLOW_BED);
+ playerBlocks.add(Material.LIME_BED);
+ playerBlocks.add(Material.PINK_BED);
+ playerBlocks.add(Material.GRAY_BED);
+ playerBlocks.add(Material.LIGHT_GRAY_BED);
+ playerBlocks.add(Material.CYAN_BED);
+ playerBlocks.add(Material.PURPLE_BED);
+ playerBlocks.add(Material.BLUE_BED);
+ playerBlocks.add(Material.BROWN_BED);
+ playerBlocks.add(Material.GREEN_BED);
+ playerBlocks.add(Material.RED_BED);
+ playerBlocks.add(Material.BLACK_BED);
+ playerBlocks.add(Material.OAK_PLANKS);
+ playerBlocks.add(Material.SPRUCE_PLANKS);
+ playerBlocks.add(Material.BIRCH_PLANKS);
+ playerBlocks.add(Material.JUNGLE_PLANKS);
+ playerBlocks.add(Material.ACACIA_PLANKS);
+ playerBlocks.add(Material.DARK_OAK_PLANKS);
playerBlocks.add(Material.BOOKSHELF);
playerBlocks.add(Material.BREWING_STAND);
playerBlocks.add(Material.BRICK);
@@ -641,99 +679,201 @@ class RestoreNatureProcessingTask implements Runnable
playerBlocks.add(Material.NOTE_BLOCK);
playerBlocks.add(Material.POWERED_RAIL);
playerBlocks.add(Material.DETECTOR_RAIL);
- playerBlocks.add(Material.PISTON_STICKY_BASE);
- playerBlocks.add(Material.PISTON_BASE);
- playerBlocks.add(Material.PISTON_EXTENSION);
- playerBlocks.add(Material.WOOL);
- playerBlocks.add(Material.PISTON_MOVING_PIECE);
+ playerBlocks.add(Material.STICKY_PISTON);
+ playerBlocks.add(Material.PISTON);
+ playerBlocks.add(Material.PISTON_HEAD);
+ playerBlocks.add(Material.MOVING_PISTON);
+ playerBlocks.add(Material.WHITE_WOOL);
+ playerBlocks.add(Material.ORANGE_WOOL);
+ playerBlocks.add(Material.MAGENTA_WOOL);
+ playerBlocks.add(Material.LIGHT_BLUE_WOOL);
+ playerBlocks.add(Material.YELLOW_WOOL);
+ playerBlocks.add(Material.LIME_WOOL);
+ playerBlocks.add(Material.PINK_WOOL);
+ playerBlocks.add(Material.GRAY_WOOL);
+ playerBlocks.add(Material.LIGHT_GRAY_WOOL);
+ playerBlocks.add(Material.CYAN_WOOL);
+ playerBlocks.add(Material.PURPLE_WOOL);
+ playerBlocks.add(Material.BLUE_WOOL);
+ playerBlocks.add(Material.BROWN_WOOL);
+ playerBlocks.add(Material.GREEN_WOOL);
+ playerBlocks.add(Material.RED_WOOL);
+ playerBlocks.add(Material.BLACK_WOOL);
playerBlocks.add(Material.GOLD_BLOCK);
playerBlocks.add(Material.IRON_BLOCK);
- playerBlocks.add(Material.DOUBLE_STEP);
- playerBlocks.add(Material.STEP);
- playerBlocks.add(Material.CROPS);
+ playerBlocks.add(Material.OAK_SLAB);
+ playerBlocks.add(Material.SPRUCE_SLAB);
+ playerBlocks.add(Material.BIRCH_SLAB);
+ playerBlocks.add(Material.JUNGLE_SLAB);
+ playerBlocks.add(Material.ACACIA_SLAB);
+ playerBlocks.add(Material.DARK_OAK_SLAB);
+ playerBlocks.add(Material.STONE_SLAB);
+ playerBlocks.add(Material.SANDSTONE_SLAB);
+ playerBlocks.add(Material.PETRIFIED_OAK_SLAB);
+ playerBlocks.add(Material.COBBLESTONE_SLAB);
+ playerBlocks.add(Material.BRICK_SLAB);
+ playerBlocks.add(Material.STONE_BRICK_SLAB);
+ playerBlocks.add(Material.NETHER_BRICK_SLAB);
+ playerBlocks.add(Material.QUARTZ_SLAB);
+ playerBlocks.add(Material.RED_SANDSTONE_SLAB);
+ playerBlocks.add(Material.PURPUR_SLAB);
+ playerBlocks.add(Material.PRISMARINE_SLAB);
+ playerBlocks.add(Material.PRISMARINE_BRICK_SLAB);
+ playerBlocks.add(Material.DARK_PRISMARINE_SLAB);
+ playerBlocks.add(Material.WHEAT);
playerBlocks.add(Material.TNT);
playerBlocks.add(Material.MOSSY_COBBLESTONE);
playerBlocks.add(Material.TORCH);
playerBlocks.add(Material.FIRE);
- playerBlocks.add(Material.WOOD_STAIRS);
+ playerBlocks.add(Material.OAK_STAIRS);
+ playerBlocks.add(Material.SPRUCE_STAIRS);
+ playerBlocks.add(Material.BIRCH_STAIRS);
+ playerBlocks.add(Material.JUNGLE_STAIRS);
+ playerBlocks.add(Material.ACACIA_STAIRS);
+ playerBlocks.add(Material.DARK_OAK_STAIRS);
playerBlocks.add(Material.CHEST);
playerBlocks.add(Material.REDSTONE_WIRE);
playerBlocks.add(Material.DIAMOND_BLOCK);
- playerBlocks.add(Material.WORKBENCH);
+ playerBlocks.add(Material.CRAFTING_TABLE);
playerBlocks.add(Material.FURNACE);
- playerBlocks.add(Material.BURNING_FURNACE);
- playerBlocks.add(Material.WOODEN_DOOR);
- playerBlocks.add(Material.SIGN_POST);
+ playerBlocks.add(Material.OAK_DOOR);
+ playerBlocks.add(Material.SIGN);
playerBlocks.add(Material.LADDER);
- playerBlocks.add(Material.RAILS);
+ playerBlocks.add(Material.RAIL);
playerBlocks.add(Material.COBBLESTONE_STAIRS);
playerBlocks.add(Material.WALL_SIGN);
- playerBlocks.add(Material.STONE_PLATE);
+ playerBlocks.add(Material.STONE_PRESSURE_PLATE);
playerBlocks.add(Material.LEVER);
- playerBlocks.add(Material.IRON_DOOR_BLOCK);
- playerBlocks.add(Material.WOOD_PLATE);
- playerBlocks.add(Material.REDSTONE_TORCH_ON);
- playerBlocks.add(Material.REDSTONE_TORCH_OFF);
+ playerBlocks.add(Material.IRON_DOOR);
+ playerBlocks.add(Material.OAK_PRESSURE_PLATE);
+ playerBlocks.add(Material.SPRUCE_PRESSURE_PLATE);
+ playerBlocks.add(Material.BIRCH_PRESSURE_PLATE);
+ playerBlocks.add(Material.JUNGLE_PRESSURE_PLATE);
+ playerBlocks.add(Material.ACACIA_PRESSURE_PLATE);
+ playerBlocks.add(Material.DARK_OAK_PRESSURE_PLATE);
+ playerBlocks.add(Material.REDSTONE_TORCH);
playerBlocks.add(Material.STONE_BUTTON);
playerBlocks.add(Material.SNOW_BLOCK);
playerBlocks.add(Material.JUKEBOX);
- playerBlocks.add(Material.FENCE);
- playerBlocks.add(Material.PORTAL);
+ playerBlocks.add(Material.OAK_FENCE);
+ playerBlocks.add(Material.SPRUCE_FENCE);
+ playerBlocks.add(Material.BIRCH_FENCE);
+ playerBlocks.add(Material.JUNGLE_FENCE);
+ playerBlocks.add(Material.ACACIA_FENCE);
+ playerBlocks.add(Material.DARK_OAK_FENCE);
+ playerBlocks.add(Material.NETHER_PORTAL);
playerBlocks.add(Material.JACK_O_LANTERN);
- playerBlocks.add(Material.CAKE_BLOCK);
- playerBlocks.add(Material.DIODE_BLOCK_ON);
- playerBlocks.add(Material.DIODE_BLOCK_OFF);
- playerBlocks.add(Material.TRAP_DOOR);
- playerBlocks.add(Material.SMOOTH_BRICK);
- playerBlocks.add(Material.HUGE_MUSHROOM_1);
- playerBlocks.add(Material.HUGE_MUSHROOM_2);
- playerBlocks.add(Material.IRON_FENCE);
- playerBlocks.add(Material.THIN_GLASS);
+ playerBlocks.add(Material.CAKE);
+ playerBlocks.add(Material.REPEATER);
+ playerBlocks.add(Material.OAK_TRAPDOOR);
+ playerBlocks.add(Material.SPRUCE_TRAPDOOR);
+ playerBlocks.add(Material.BIRCH_TRAPDOOR);
+ playerBlocks.add(Material.JUNGLE_TRAPDOOR);
+ playerBlocks.add(Material.ACACIA_TRAPDOOR);
+ playerBlocks.add(Material.DARK_OAK_TRAPDOOR);
+ playerBlocks.add(Material.STONE_BRICKS);
+ playerBlocks.add(Material.MOSSY_STONE_BRICKS);
+ playerBlocks.add(Material.CRACKED_STONE_BRICKS);
+ playerBlocks.add(Material.CHISELED_STONE_BRICKS);
+ playerBlocks.add(Material.MUSHROOM_STEM);
+ playerBlocks.add(Material.RED_MUSHROOM_BLOCK);
+ playerBlocks.add(Material.BROWN_MUSHROOM_BLOCK);
+ playerBlocks.add(Material.IRON_BARS);
+ playerBlocks.add(Material.GLASS_PANE);
playerBlocks.add(Material.MELON_STEM);
- playerBlocks.add(Material.FENCE_GATE);
+ playerBlocks.add(Material.OAK_FENCE_GATE);
+ playerBlocks.add(Material.SPRUCE_FENCE_GATE);
+ playerBlocks.add(Material.BIRCH_FENCE_GATE);
+ playerBlocks.add(Material.JUNGLE_FENCE_GATE);
+ playerBlocks.add(Material.ACACIA_FENCE_GATE);
+ playerBlocks.add(Material.DARK_OAK_FENCE_GATE);
playerBlocks.add(Material.BRICK_STAIRS);
- playerBlocks.add(Material.SMOOTH_STAIRS);
- playerBlocks.add(Material.ENCHANTMENT_TABLE);
+ playerBlocks.add(Material.ENCHANTING_TABLE);
playerBlocks.add(Material.BREWING_STAND);
- playerBlocks.add(Material.CAULDRON);
- playerBlocks.add(Material.DIODE_BLOCK_ON);
- playerBlocks.add(Material.DIODE_BLOCK_ON);
- playerBlocks.add(Material.WEB);
+ playerBlocks.add(Material.CAULDRON);
+ playerBlocks.add(Material.COBWEB);
playerBlocks.add(Material.SPONGE);
playerBlocks.add(Material.GRAVEL);
playerBlocks.add(Material.EMERALD_BLOCK);
playerBlocks.add(Material.SANDSTONE);
- playerBlocks.add(Material.WOOD_STEP);
- playerBlocks.add(Material.WOOD_DOUBLE_STEP);
playerBlocks.add(Material.ENDER_CHEST);
playerBlocks.add(Material.SANDSTONE_STAIRS);
- playerBlocks.add(Material.SPRUCE_WOOD_STAIRS);
- playerBlocks.add(Material.JUNGLE_WOOD_STAIRS);
- playerBlocks.add(Material.COMMAND);
+ playerBlocks.add(Material.COMMAND_BLOCK);
+ playerBlocks.add(Material.REPEATING_COMMAND_BLOCK);
+ playerBlocks.add(Material.CHAIN_COMMAND_BLOCK);
playerBlocks.add(Material.BEACON);
- playerBlocks.add(Material.COBBLE_WALL);
+ playerBlocks.add(Material.COBBLESTONE_WALL);
+ playerBlocks.add(Material.MOSSY_COBBLESTONE_WALL);
playerBlocks.add(Material.FLOWER_POT);
playerBlocks.add(Material.CARROT);
playerBlocks.add(Material.POTATO);
- playerBlocks.add(Material.WOOD_BUTTON);
- playerBlocks.add(Material.SKULL);
+ playerBlocks.add(Material.OAK_BUTTON);
+ playerBlocks.add(Material.SPRUCE_BUTTON);
+ playerBlocks.add(Material.BIRCH_BUTTON);
+ playerBlocks.add(Material.JUNGLE_BUTTON);
+ playerBlocks.add(Material.ACACIA_BUTTON);
+ playerBlocks.add(Material.DARK_OAK_BUTTON);
+ playerBlocks.add(Material.SKELETON_SKULL);
+ playerBlocks.add(Material.WITHER_SKELETON_SKULL);
+ playerBlocks.add(Material.CREEPER_HEAD);
+ playerBlocks.add(Material.ZOMBIE_HEAD);
+ playerBlocks.add(Material.PLAYER_HEAD);
+ playerBlocks.add(Material.DRAGON_HEAD);
playerBlocks.add(Material.ANVIL);
playerBlocks.add(Material.SPONGE);
- playerBlocks.add(Material.DOUBLE_STONE_SLAB2);
- playerBlocks.add(Material.STAINED_GLASS);
- playerBlocks.add(Material.STAINED_GLASS_PANE);
- playerBlocks.add(Material.BANNER);
- playerBlocks.add(Material.STANDING_BANNER);
- playerBlocks.add(Material.ACACIA_STAIRS);
- playerBlocks.add(Material.BIRCH_WOOD_STAIRS);
- playerBlocks.add(Material.DARK_OAK_STAIRS);
+ playerBlocks.add(Material.WHITE_STAINED_GLASS);
+ playerBlocks.add(Material.ORANGE_STAINED_GLASS);
+ playerBlocks.add(Material.MAGENTA_STAINED_GLASS);
+ playerBlocks.add(Material.LIGHT_BLUE_STAINED_GLASS);
+ playerBlocks.add(Material.YELLOW_STAINED_GLASS);
+ playerBlocks.add(Material.LIME_STAINED_GLASS);
+ playerBlocks.add(Material.PINK_STAINED_GLASS);
+ playerBlocks.add(Material.GRAY_STAINED_GLASS);
+ playerBlocks.add(Material.LIGHT_GRAY_STAINED_GLASS);
+ playerBlocks.add(Material.CYAN_STAINED_GLASS);
+ playerBlocks.add(Material.PURPLE_STAINED_GLASS);
+ playerBlocks.add(Material.BLUE_STAINED_GLASS);
+ playerBlocks.add(Material.BROWN_STAINED_GLASS);
+ playerBlocks.add(Material.GREEN_STAINED_GLASS);
+ playerBlocks.add(Material.RED_STAINED_GLASS);
+ playerBlocks.add(Material.BLACK_STAINED_GLASS);
+ playerBlocks.add(Material.WHITE_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.ORANGE_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.MAGENTA_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.LIGHT_BLUE_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.YELLOW_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.LIME_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.PINK_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.GRAY_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.LIGHT_GRAY_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.CYAN_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.PURPLE_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.BLUE_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.BROWN_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.GREEN_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.RED_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.BLACK_STAINED_GLASS_PANE);
+ playerBlocks.add(Material.WHITE_BANNER);
+ playerBlocks.add(Material.ORANGE_BANNER);
+ playerBlocks.add(Material.MAGENTA_BANNER);
+ playerBlocks.add(Material.LIGHT_BLUE_BANNER);
+ playerBlocks.add(Material.YELLOW_BANNER);
+ playerBlocks.add(Material.LIME_BANNER);
+ playerBlocks.add(Material.PINK_BANNER);
+ playerBlocks.add(Material.GRAY_BANNER);
+ playerBlocks.add(Material.LIGHT_GRAY_BANNER);
+ playerBlocks.add(Material.CYAN_BANNER);
+ playerBlocks.add(Material.PURPLE_BANNER);
+ playerBlocks.add(Material.BLUE_BANNER);
+ playerBlocks.add(Material.BROWN_BANNER);
+ playerBlocks.add(Material.GREEN_BANNER);
+ playerBlocks.add(Material.RED_BANNER);
+ playerBlocks.add(Material.BLACK_BANNER);
playerBlocks.add(Material.TRAPPED_CHEST);
- playerBlocks.add(Material.GOLD_PLATE);
- playerBlocks.add(Material.IRON_PLATE);
- playerBlocks.add(Material.REDSTONE_COMPARATOR_OFF);
- playerBlocks.add(Material.REDSTONE_COMPARATOR_ON);
+ playerBlocks.add(Material.LIGHT_WEIGHTED_PRESSURE_PLATE);
+ playerBlocks.add(Material.HEAVY_WEIGHTED_PRESSURE_PLATE);
+ playerBlocks.add(Material.COMPARATOR);
playerBlocks.add(Material.DAYLIGHT_DETECTOR);
- playerBlocks.add(Material.DAYLIGHT_DETECTOR_INVERTED);
playerBlocks.add(Material.REDSTONE_BLOCK);
playerBlocks.add(Material.HOPPER);
playerBlocks.add(Material.QUARTZ_BLOCK);
@@ -743,10 +883,24 @@ class RestoreNatureProcessingTask implements Runnable
playerBlocks.add(Material.IRON_TRAPDOOR);
playerBlocks.add(Material.PRISMARINE);
playerBlocks.add(Material.HAY_BLOCK);
- playerBlocks.add(Material.CARPET);
+ playerBlocks.add(Material.WHITE_CARPET);
+ playerBlocks.add(Material.ORANGE_CARPET);
+ playerBlocks.add(Material.MAGENTA_CARPET);
+ playerBlocks.add(Material.LIGHT_BLUE_CARPET);
+ playerBlocks.add(Material.YELLOW_CARPET);
+ playerBlocks.add(Material.LIME_CARPET);
+ playerBlocks.add(Material.PINK_CARPET);
+ playerBlocks.add(Material.GRAY_CARPET);
+ playerBlocks.add(Material.LIGHT_GRAY_CARPET);
+ playerBlocks.add(Material.CYAN_CARPET);
+ playerBlocks.add(Material.PURPLE_CARPET);
+ playerBlocks.add(Material.BLUE_CARPET);
+ playerBlocks.add(Material.BROWN_CARPET);
+ playerBlocks.add(Material.GREEN_CARPET);
+ playerBlocks.add(Material.RED_CARPET);
+ playerBlocks.add(Material.BLACK_CARPET);
playerBlocks.add(Material.SEA_LANTERN);
playerBlocks.add(Material.RED_SANDSTONE_STAIRS);
- playerBlocks.add(Material.STONE_SLAB2);
playerBlocks.add(Material.ACACIA_FENCE);
playerBlocks.add(Material.ACACIA_FENCE_GATE);
playerBlocks.add(Material.BIRCH_FENCE);
@@ -754,25 +908,23 @@ class RestoreNatureProcessingTask implements Runnable
playerBlocks.add(Material.DARK_OAK_FENCE);
playerBlocks.add(Material.DARK_OAK_FENCE_GATE);
playerBlocks.add(Material.JUNGLE_FENCE);
- playerBlocks.add(Material.JUNGLE_FENCE_GATE);
- playerBlocks.add(Material.SPRUCE_FENCE);
- playerBlocks.add(Material.SPRUCE_FENCE_GATE);
- playerBlocks.add(Material.ACACIA_DOOR);
- playerBlocks.add(Material.SPRUCE_DOOR);
- playerBlocks.add(Material.DARK_OAK_DOOR);
- playerBlocks.add(Material.JUNGLE_DOOR);
- playerBlocks.add(Material.BIRCH_DOOR);
- playerBlocks.add(Material.COAL_BLOCK);
- playerBlocks.add(Material.REDSTONE_LAMP_OFF);
- playerBlocks.add(Material.REDSTONE_LAMP_ON);
- playerBlocks.add(Material.PURPUR_BLOCK);
- playerBlocks.add(Material.PURPUR_SLAB);
- playerBlocks.add(Material.PURPUR_DOUBLE_SLAB);
- playerBlocks.add(Material.PURPUR_PILLAR);
- playerBlocks.add(Material.PURPUR_STAIRS);
- playerBlocks.add(Material.NETHER_WART_BLOCK);
- playerBlocks.add(Material.RED_NETHER_BRICK);
- playerBlocks.add(Material.BONE_BLOCK);
+ playerBlocks.add(Material.JUNGLE_FENCE_GATE);
+ playerBlocks.add(Material.SPRUCE_FENCE);
+ playerBlocks.add(Material.SPRUCE_FENCE_GATE);
+ playerBlocks.add(Material.ACACIA_DOOR);
+ playerBlocks.add(Material.SPRUCE_DOOR);
+ playerBlocks.add(Material.DARK_OAK_DOOR);
+ playerBlocks.add(Material.JUNGLE_DOOR);
+ playerBlocks.add(Material.BIRCH_DOOR);
+ playerBlocks.add(Material.COAL_BLOCK);
+ playerBlocks.add(Material.REDSTONE_LAMP);
+ playerBlocks.add(Material.PURPUR_BLOCK);
+ playerBlocks.add(Material.PURPUR_SLAB);
+ playerBlocks.add(Material.PURPUR_PILLAR);
+ playerBlocks.add(Material.PURPUR_STAIRS);
+ playerBlocks.add(Material.NETHER_WART_BLOCK);
+ playerBlocks.add(Material.RED_NETHER_BRICKS);
+ playerBlocks.add(Material.BONE_BLOCK);
//these are unnatural in the standard world, but not in the nether
if(environment != Environment.NETHER)
@@ -781,28 +933,36 @@ class RestoreNatureProcessingTask implements Runnable
playerBlocks.add(Material.SOUL_SAND);
playerBlocks.add(Material.GLOWSTONE);
playerBlocks.add(Material.NETHER_BRICK);
- playerBlocks.add(Material.NETHER_FENCE);
+ playerBlocks.add(Material.NETHER_BRICK_FENCE);
playerBlocks.add(Material.NETHER_BRICK_STAIRS);
- playerBlocks.add(Material.MAGMA);
+ playerBlocks.add(Material.MAGMA_BLOCK);
}
//these are unnatural in the standard and nether worlds, but not in the end
if(environment != Environment.THE_END)
{
playerBlocks.add(Material.OBSIDIAN);
- playerBlocks.add(Material.ENDER_STONE);
- playerBlocks.add(Material.ENDER_PORTAL_FRAME);
+ playerBlocks.add(Material.END_STONE);
+ playerBlocks.add(Material.END_PORTAL_FRAME);
playerBlocks.add(Material.CHORUS_PLANT);
playerBlocks.add(Material.CHORUS_FLOWER);
}
//these are unnatural in sandy biomes, but not elsewhere
- if(biome == Biome.DESERT || biome == Biome.DESERT_HILLS || biome == Biome.BEACHES || environment != Environment.NORMAL)
+ if(biome == Biome.DESERT || biome == Biome.DESERT_HILLS || biome == Biome.BEACH || environment != Environment.NORMAL)
{
- playerBlocks.add(Material.LEAVES);
- playerBlocks.add(Material.LEAVES_2);
- playerBlocks.add(Material.LOG);
- playerBlocks.add(Material.LOG_2);
+ playerBlocks.add(Material.OAK_LEAVES);
+ playerBlocks.add(Material.SPRUCE_LEAVES);
+ playerBlocks.add(Material.BIRCH_LEAVES);
+ playerBlocks.add(Material.JUNGLE_LEAVES);
+ playerBlocks.add(Material.ACACIA_LEAVES);
+ playerBlocks.add(Material.DARK_OAK_LEAVES);
+ playerBlocks.add(Material.OAK_LOG);
+ playerBlocks.add(Material.SPRUCE_LOG);
+ playerBlocks.add(Material.BIRCH_LOG);
+ playerBlocks.add(Material.JUNGLE_LOG);
+ playerBlocks.add(Material.ACACIA_LOG);
+ playerBlocks.add(Material.DARK_OAK_LOG);
}
return playerBlocks;
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/Visualization.java b/src/main/java/me/ryanhamshire/GriefPrevention/Visualization.java
index d5347ae..718a0b1 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/Visualization.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/Visualization.java
@@ -25,6 +25,8 @@ import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.block.data.Lightable;
import org.bukkit.entity.Player;
//represents a visualization sent to a player
@@ -54,7 +56,7 @@ public class Visualization
//reverts a visualization by sending another block change list, this time with the real world block values
@SuppressWarnings("deprecation")
- public static void Revert(Player player)
+ public static void Revert(Player player)
{
if(!player.isOnline()) return;
@@ -64,29 +66,29 @@ public class Visualization
if(playerData.currentVisualization != null)
{
- //locality
- int minx = player.getLocation().getBlockX() - 100;
- int minz = player.getLocation().getBlockZ() - 100;
- int maxx = player.getLocation().getBlockX() + 100;
- int maxz = player.getLocation().getBlockZ() + 100;
-
- //remove any elements which are too far away
- visualization.removeElementsOutOfRange(visualization.elements, minx, minz, maxx, maxz);
+ //locality
+ int minx = player.getLocation().getBlockX() - 100;
+ int minz = player.getLocation().getBlockZ() - 100;
+ int maxx = player.getLocation().getBlockX() + 100;
+ int maxz = player.getLocation().getBlockZ() + 100;
+
+ //remove any elements which are too far away
+ visualization.removeElementsOutOfRange(visualization.elements, minx, minz, maxx, maxz);
//send real block information for any remaining elements
- for(int i = 0; i < visualization.elements.size(); i++)
+ for(int i = 0; i < visualization.elements.size(); i++)
{
VisualizationElement element = visualization.elements.get(i);
-
+
//check player still in world where visualization exists
if(i == 0)
{
- if(!player.getWorld().equals(element.location.getWorld())) return;
+ if(!player.getWorld().equals(element.location.getWorld())) return;
}
-
- player.sendBlockChange(element.location, element.realMaterial, element.realData);
+
+ player.sendBlockChange(element.location, element.realBlock);
}
-
+
playerData.currentVisualization = null;
}
}
@@ -127,51 +129,52 @@ public class Visualization
//handy for combining several visualizations together, as when visualization a top level claim with several subdivisions inside
//locality is a performance consideration. only create visualization blocks for around 100 blocks of the locality
@SuppressWarnings("deprecation")
- private void addClaimElements(Claim claim, int height, VisualizationType visualizationType, Location locality)
+ private void addClaimElements(Claim claim, int height, VisualizationType visualizationType, Location locality)
{
Location smallXsmallZ = claim.getLesserBoundaryCorner();
Location bigXbigZ = claim.getGreaterBoundaryCorner();
World world = smallXsmallZ.getWorld();
- boolean waterIsTransparent = locality.getBlock().getType() == Material.STATIONARY_WATER;
+ boolean waterIsTransparent = locality.getBlock().getType() == Material.WATER;
int smallx = smallXsmallZ.getBlockX();
int smallz = smallXsmallZ.getBlockZ();
int bigx = bigXbigZ.getBlockX();
int bigz = bigXbigZ.getBlockZ();
- Material cornerMaterial;
- Material accentMaterial;
+ BlockData cornerBlockData;
+ BlockData accentBlockData;
ArrayList newElements = new ArrayList();
if(visualizationType == VisualizationType.Claim)
{
- cornerMaterial = Material.GLOWSTONE;
- accentMaterial = Material.GOLD_BLOCK;
+ cornerBlockData = Material.GLOWSTONE.createBlockData();
+ accentBlockData = Material.GOLD_BLOCK.createBlockData();
}
else if(visualizationType == VisualizationType.AdminClaim)
- {
- cornerMaterial = Material.GLOWSTONE;
- accentMaterial = Material.PUMPKIN;
- }
+ {
+ cornerBlockData = Material.GLOWSTONE.createBlockData();
+ accentBlockData = Material.PUMPKIN.createBlockData();
+}
else if(visualizationType == VisualizationType.Subdivision)
{
- cornerMaterial = Material.IRON_BLOCK;
- accentMaterial = Material.WOOL;
+ cornerBlockData = Material.IRON_BLOCK.createBlockData();
+ accentBlockData = Material.WHITE_WOOL.createBlockData();
}
else if(visualizationType == VisualizationType.RestoreNature)
{
- cornerMaterial = Material.DIAMOND_BLOCK;
- accentMaterial = Material.DIAMOND_BLOCK;
+ cornerBlockData = Material.DIAMOND_BLOCK.createBlockData();
+ accentBlockData = Material.DIAMOND_BLOCK.createBlockData();
}
else
{
- cornerMaterial = Material.GLOWING_REDSTONE_ORE;
- accentMaterial = Material.NETHERRACK;
+ cornerBlockData = Material.REDSTONE_ORE.createBlockData();
+ ((Lightable) cornerBlockData).setLit(true);
+ accentBlockData = Material.NETHERRACK.createBlockData();
}
//initialize visualization elements without Y values and real data
@@ -186,46 +189,46 @@ public class Visualization
final int STEP = 10;
//top line
- newElements.add(new VisualizationElement(new Location(world, smallx, 0, bigz), cornerMaterial, (byte)0, Material.AIR, (byte)0));
- newElements.add(new VisualizationElement(new Location(world, smallx + 1, 0, bigz), accentMaterial, (byte)0, Material.AIR, (byte)0));
+ newElements.add(new VisualizationElement(new Location(world, smallx, 0, bigz), cornerBlockData, Material.AIR.createBlockData()));
+ newElements.add(new VisualizationElement(new Location(world, smallx + 1, 0, bigz), accentBlockData, Material.AIR.createBlockData()));
for(int x = smallx + STEP; x < bigx - STEP / 2; x += STEP)
{
if(x > minx && x < maxx)
- newElements.add(new VisualizationElement(new Location(world, x, 0, bigz), accentMaterial, (byte)0, Material.AIR, (byte)0));
+ newElements.add(new VisualizationElement(new Location(world, x, 0, bigz), accentBlockData, Material.AIR.createBlockData()));
}
- newElements.add(new VisualizationElement(new Location(world, bigx - 1, 0, bigz), accentMaterial, (byte)0, Material.AIR, (byte)0));
+ newElements.add(new VisualizationElement(new Location(world, bigx - 1, 0, bigz), accentBlockData, Material.AIR.createBlockData()));
//bottom line
- newElements.add(new VisualizationElement(new Location(world, smallx + 1, 0, smallz), accentMaterial, (byte)0, Material.AIR, (byte)0));
- for(int x = smallx + STEP; x < bigx - STEP / 2; x += STEP)
+ newElements.add(new VisualizationElement(new Location(world, smallx + 1, 0, smallz), accentBlockData, Material.AIR.createBlockData()));
+ for(int x = smallx + STEP; x < bigx - STEP / 2; x += STEP)
{
if(x > minx && x < maxx)
- newElements.add(new VisualizationElement(new Location(world, x, 0, smallz), accentMaterial, (byte)0, Material.AIR, (byte)0));
+ newElements.add(new VisualizationElement(new Location(world, x, 0, smallz), accentBlockData, Material.AIR.createBlockData()));
}
- newElements.add(new VisualizationElement(new Location(world, bigx - 1, 0, smallz), accentMaterial, (byte)0, Material.AIR, (byte)0));
+ newElements.add(new VisualizationElement(new Location(world, bigx - 1, 0, smallz), accentBlockData, Material.AIR.createBlockData()));
//left line
- newElements.add(new VisualizationElement(new Location(world, smallx, 0, smallz), cornerMaterial, (byte)0, Material.AIR, (byte)0));
- newElements.add(new VisualizationElement(new Location(world, smallx, 0, smallz + 1), accentMaterial, (byte)0, Material.AIR, (byte)0));
+ newElements.add(new VisualizationElement(new Location(world, smallx, 0, smallz), cornerBlockData, Material.AIR.createBlockData()));
+ newElements.add(new VisualizationElement(new Location(world, smallx, 0, smallz + 1), accentBlockData, Material.AIR.createBlockData()));
for(int z = smallz + STEP; z < bigz - STEP / 2; z += STEP)
{
if(z > minz && z < maxz)
- newElements.add(new VisualizationElement(new Location(world, smallx, 0, z), accentMaterial, (byte)0, Material.AIR, (byte)0));
+ newElements.add(new VisualizationElement(new Location(world, smallx, 0, z), accentBlockData, Material.AIR.createBlockData()));
}
- newElements.add(new VisualizationElement(new Location(world, smallx, 0, bigz - 1), accentMaterial, (byte)0, Material.AIR, (byte)0));
+ newElements.add(new VisualizationElement(new Location(world, smallx, 0, bigz - 1), accentBlockData, Material.AIR.createBlockData()));
//right line
- newElements.add(new VisualizationElement(new Location(world, bigx, 0, smallz), cornerMaterial, (byte)0, Material.AIR, (byte)0));
- newElements.add(new VisualizationElement(new Location(world, bigx, 0, smallz + 1), accentMaterial, (byte)0, Material.AIR, (byte)0));
+ newElements.add(new VisualizationElement(new Location(world, bigx, 0, smallz), cornerBlockData, Material.AIR.createBlockData()));
+ newElements.add(new VisualizationElement(new Location(world, bigx, 0, smallz + 1), accentBlockData, Material.AIR.createBlockData()));
for(int z = smallz + STEP; z < bigz - STEP / 2; z += STEP)
{
if(z > minz && z < maxz)
- newElements.add(new VisualizationElement(new Location(world, bigx, 0, z), accentMaterial, (byte)0, Material.AIR, (byte)0));
+ newElements.add(new VisualizationElement(new Location(world, bigx, 0, z), accentBlockData, Material.AIR.createBlockData()));
}
- newElements.add(new VisualizationElement(new Location(world, bigx, 0, bigz - 1), accentMaterial, (byte)0, Material.AIR, (byte)0));
- newElements.add(new VisualizationElement(new Location(world, bigx, 0, bigz), cornerMaterial, (byte)0, Material.AIR, (byte)0));
+ newElements.add(new VisualizationElement(new Location(world, bigx, 0, bigz - 1), accentBlockData, Material.AIR.createBlockData()));
+ newElements.add(new VisualizationElement(new Location(world, bigx, 0, bigz), cornerBlockData, Material.AIR.createBlockData()));
- //remove any out of range elements
+ //remove any out of range elements
this.removeElementsOutOfRange(newElements, minx, minz, maxx, maxz);
//remove any elements outside the claim
@@ -244,8 +247,7 @@ public class Visualization
Location tempLocation = element.location;
element.location = getVisibleLocation(tempLocation.getWorld(), tempLocation.getBlockX(), height, tempLocation.getBlockZ(), waterIsTransparent);
height = element.location.getBlockY();
- element.realMaterial = element.location.getBlock().getType();
- element.realData = element.location.getBlock().getData();
+ element.realBlock = element.location.getBlock().getBlockData();
}
this.elements.addAll(newElements);
@@ -265,7 +267,7 @@ public class Visualization
}
//finds a block the player can probably see. this is how visualizations "cling" to the ground or ceiling
- private static Location getVisibleLocation(World world, int x, int y, int z, boolean waterIsTransparent)
+ private static Location getVisibleLocation(World world, int x, int y, int z, boolean waterIsTransparent)
{
Block block = world.getBlockAt(x, y, z);
BlockFace direction = (isTransparent(block, waterIsTransparent)) ? BlockFace.DOWN : BlockFace.UP;
@@ -294,29 +296,26 @@ public class Visualization
switch (block.getType())
{
case AIR:
- case FENCE:
+ case OAK_FENCE:
case ACACIA_FENCE:
case BIRCH_FENCE:
case DARK_OAK_FENCE:
case JUNGLE_FENCE:
- case NETHER_FENCE:
+ case NETHER_BRICK_FENCE:
case SPRUCE_FENCE:
- case FENCE_GATE:
+ case OAK_FENCE_GATE:
case ACACIA_FENCE_GATE:
case BIRCH_FENCE_GATE:
case DARK_OAK_FENCE_GATE:
case SPRUCE_FENCE_GATE:
case JUNGLE_FENCE_GATE:
case SIGN:
- case SIGN_POST:
case WALL_SIGN:
return true;
}
- if ((waterIsTransparent && block.getType() == Material.STATIONARY_WATER) ||
- block.getType().isTransparent())
- return true;
- return false;
+ return (waterIsTransparent && block.getType() == Material.WATER) ||
+ block.getType().isTransparent();
}
public static Visualization fromClaims(Iterable claims, int height, VisualizationType type, Location locality)
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/VisualizationApplicationTask.java b/src/main/java/me/ryanhamshire/GriefPrevention/VisualizationApplicationTask.java
index 6351811..e9380c1 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/VisualizationApplicationTask.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/VisualizationApplicationTask.java
@@ -45,7 +45,7 @@ class VisualizationApplicationTask implements Runnable
//send the player a fake block change event
if(!element.location.getChunk().isLoaded()) continue; //cheap distance check
- player.sendBlockChange(element.location, element.visualizedMaterial, element.visualizedData);
+ player.sendBlockChange(element.location, element.visualizedBlock);
}
//remember the visualization applied to this player for later (so it can be inexpensively reverted)
diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/VisualizationElement.java b/src/main/java/me/ryanhamshire/GriefPrevention/VisualizationElement.java
index 99acb09..3786bb4 100644
--- a/src/main/java/me/ryanhamshire/GriefPrevention/VisualizationElement.java
+++ b/src/main/java/me/ryanhamshire/GriefPrevention/VisualizationElement.java
@@ -19,22 +19,19 @@
package me.ryanhamshire.GriefPrevention;
import org.bukkit.Location;
import org.bukkit.Material;
+import org.bukkit.block.data.BlockData;
//represents a "fake" block sent to a player as part of a visualization
public class VisualizationElement
{
public Location location;
- public Material visualizedMaterial;
- public byte visualizedData;
- public Material realMaterial;
- public byte realData;
+ public BlockData visualizedBlock;
+ public BlockData realBlock;
- public VisualizationElement(Location location, Material visualizedMaterial, byte visualizedData, Material realMaterial, byte realData)
+ public VisualizationElement(Location location, BlockData visualizedBlock, BlockData realBlock)
{
this.location = location;
- this.visualizedMaterial= visualizedMaterial;
- this.visualizedData = visualizedData;
- this.realData = realData;
- this.realMaterial = realMaterial;
+ this.visualizedBlock = visualizedBlock;
+ this.realBlock = realBlock;
}
}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 62443f2..dab131d 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -4,6 +4,7 @@ softdepend: [Vault, Multiverse-Core, My Worlds, MystCraft, Transporter, TheUnder
dev-url: http://dev.bukkit.org/server-mods/grief-prevention
loadbefore: [TheUnderground]
version: ${project.version}
+api-version: 1.13
commands:
abandonclaim:
description: Deletes a claim.