The 1.13 PR (#320)
- Removes all code and config pertaining to the "mods" config section - RestoreNature has issues in oceans
This commit is contained in:
parent
ad07915664
commit
19c0f3220f
2
pom.xml
2
pom.xml
|
|
@ -61,7 +61,7 @@
|
|||
<dependency>
|
||||
<groupId>org.bukkit</groupId>
|
||||
<artifactId>bukkit</artifactId>
|
||||
<version>1.12.2-R0.1-SNAPSHOT</version>
|
||||
<version>1.13-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<!--Worldguard dependency-->
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<Material> 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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -190,11 +190,6 @@ public class GriefPrevention extends JavaPlugin
|
|||
|
||||
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<String> 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<String, Integer> config_seaLevelOverride; //override for sea level, because bukkit doesn't report the right value for all situations
|
||||
|
||||
public boolean config_limitTreeGrowth; //whether trees should be prevented from growing into a claim from outside
|
||||
|
|
@ -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<String>();
|
||||
|
||||
this.config_mods_accessTrustIds = new MaterialCollection();
|
||||
List<String> accessTrustStrings = config.getStringList("GriefPrevention.Mods.BlockIdsRequiringAccessTrust");
|
||||
|
||||
this.parseMaterialListFromConfig(accessTrustStrings, this.config_mods_accessTrustIds);
|
||||
|
||||
this.config_mods_containerTrustIds = new MaterialCollection();
|
||||
List<String> 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<String> 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<Material>();
|
||||
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
|
||||
|
|
@ -899,14 +889,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);
|
||||
|
||||
//custom logger settings
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<Material> commonAdjacentBlocks_water = new HashSet<Material>(Arrays.asList(Material.WATER, Material.STATIONARY_WATER, Material.SOIL, Material.DIRT, Material.STONE));
|
||||
private HashSet<Material> commonAdjacentBlocks_lava = new HashSet<Material>(Arrays.asList(Material.LAVA, Material.STATIONARY_LAVA, Material.DIRT, Material.STONE));
|
||||
private HashSet<Material> commonAdjacentBlocks_water = new HashSet<Material>(Arrays.asList(Material.WATER, Material.FARMLAND, Material.DIRT, Material.STONE));
|
||||
private HashSet<Material> commonAdjacentBlocks_lava = new HashSet<Material>(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());
|
||||
|
|
@ -1767,8 +1785,62 @@ class PlayerEventHandler implements Listener
|
|||
ItemStack itemInHand = instance.getItemInHand(player, hand);
|
||||
Material materialInHand = itemInHand.getType();
|
||||
|
||||
ArrayList<Material> spawn_eggs = new ArrayList<Material>();
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
(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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<Material>();
|
||||
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,23 +369,32 @@ 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<Material> excludedBlocks = new ArrayList<Material>();
|
||||
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<Material> fillableBlocks = new ArrayList<Material>();
|
||||
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<Material> notSuitableForFillBlocks = new ArrayList<Material>();
|
||||
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<Material> getPlayerBlocks(Environment environment, Biome biome)
|
||||
static ArrayList<Material> 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<Material> playerBlocks = new ArrayList<Material>();
|
||||
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.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;
|
||||
|
|
|
|||
|
|
@ -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,27 +66,27 @@ 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;
|
||||
//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);
|
||||
//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<VisualizationElement> newElements = new ArrayList<VisualizationElement>();
|
||||
|
||||
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<Claim> claims, int height, VisualizationType type, Location locality)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user