Replace old paint bucket recursive filling.
This commit is contained in:
parent
35a853a198
commit
a5060e014b
@ -740,53 +740,95 @@ public class Draw extends SoloGame
|
|||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void PaintBucket(PlayerInteractEvent event)
|
public void paintFill(PlayerInteractEvent e)
|
||||||
{
|
{
|
||||||
if (!IsLive())
|
if (!IsLive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Player player = event.getPlayer();
|
Player p = e.getPlayer();
|
||||||
|
|
||||||
if (!UtilGear.isMat(player.getItemInHand(), Material.IRON_HOE))
|
if (!UtilGear.isMat(p.getItemInHand(), Material.IRON_HOE))
|
||||||
return;
|
|
||||||
|
|
||||||
if (!_drawers.HasPlayer(player))
|
|
||||||
return;
|
|
||||||
|
|
||||||
Block block = player.getTargetBlock((HashSet<Byte>) null, 200);
|
|
||||||
if (block == null || !_canvas.contains(block))
|
|
||||||
return;
|
|
||||||
|
|
||||||
//Fill
|
|
||||||
byte color = block.getData();
|
|
||||||
Material material = block.getType();
|
|
||||||
|
|
||||||
if (color == _brushColor && material == _brushMaterial)
|
|
||||||
return;
|
|
||||||
|
|
||||||
FillRecurse(block, color, material);
|
|
||||||
|
|
||||||
for (Player other : UtilServer.getPlayers())
|
|
||||||
other.playSound(other.getLocation(), Sound.SPLASH, 0.4f, 1.5f);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void FillRecurse(Block block, byte color, Material material)
|
|
||||||
{
|
|
||||||
if (block.getType() != material)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (block.getData() != color)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!_canvas.contains(block))
|
|
||||||
return;
|
|
||||||
|
|
||||||
block.setType(_brushMaterial);
|
|
||||||
block.setData(_brushColor);
|
|
||||||
|
|
||||||
for (Block other : UtilBlock.getSurrounding(block, false))
|
|
||||||
{
|
{
|
||||||
FillRecurse(other, color, material);
|
// Not the correct tool (iron hoe = paint fill).
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_drawers.HasPlayer(p))
|
||||||
|
{
|
||||||
|
// Not drawing.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the target block that the player clicks on.
|
||||||
|
Block target = p.getTargetBlock((HashSet<Byte>)null, 200);
|
||||||
|
|
||||||
|
if (target == null || !_canvas.contains(target))
|
||||||
|
{
|
||||||
|
// Target block is non-existent or not in the canvas.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Play sound to all players.
|
||||||
|
for (Player player : UtilServer.getPlayers())
|
||||||
|
{
|
||||||
|
player.playSound(player.getLocation(), Sound.SPLASH, 0.4f, 1.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the current block info to check later if it's the same.
|
||||||
|
BlockInfo originalInfo = new BlockInfo(target.getType(), target.getData());
|
||||||
|
|
||||||
|
// List of blocks needing to be changed.
|
||||||
|
ArrayList<Block> pending = new ArrayList<>();
|
||||||
|
|
||||||
|
// Add the current target block to pending changes.
|
||||||
|
boolean targetBlock = true;
|
||||||
|
pending.add(target);
|
||||||
|
|
||||||
|
// Cycle through all pending blocks if there are any left.
|
||||||
|
pendingBlocks: while (!pending.isEmpty())
|
||||||
|
{
|
||||||
|
// Find the center block and remove it from the list sequentially.
|
||||||
|
Block center = pending.get(0);
|
||||||
|
pending.remove(0);
|
||||||
|
|
||||||
|
// Check if it's the original target block.
|
||||||
|
if (!targetBlock)
|
||||||
|
{
|
||||||
|
// It's not: make sure that it's the same as the original block info.
|
||||||
|
if (center.getType() != originalInfo.getType())
|
||||||
|
{
|
||||||
|
// Not the same block type.
|
||||||
|
continue pendingBlocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (center.getData() != originalInfo.getData())
|
||||||
|
{
|
||||||
|
// Not the same block data/colour.
|
||||||
|
continue pendingBlocks;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Set so that we know the next block isn't the original target.
|
||||||
|
targetBlock = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the center block type and data/colour.
|
||||||
|
center.setType(_brushMaterial);
|
||||||
|
center.setData(_brushColor);
|
||||||
|
|
||||||
|
// Cycle through the surrounding blocks and see if they need filling in.
|
||||||
|
blocks: for (Block other : UtilBlock.getSurrounding(center, false))
|
||||||
|
{
|
||||||
|
if (pending.contains(other))
|
||||||
|
{
|
||||||
|
// Already awaiting a change. :+1:
|
||||||
|
continue blocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add it to the pending list for change later.
|
||||||
|
pending.add(other);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user