From b74a00de22e472b18ce4143e030ccd4da15d8b76 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sat, 31 Oct 2020 14:45:50 -0400 Subject: [PATCH] Dust mech --- .../com/volmit/iris/manager/BlockSignal.java | 35 ++++++ .../com/volmit/iris/manager/DustRevealer.java | 101 ++++++++++++++++++ .../com/volmit/iris/manager/WandManager.java | 39 +++++++ 3 files changed, 175 insertions(+) create mode 100644 src/main/java/com/volmit/iris/manager/BlockSignal.java create mode 100644 src/main/java/com/volmit/iris/manager/DustRevealer.java diff --git a/src/main/java/com/volmit/iris/manager/BlockSignal.java b/src/main/java/com/volmit/iris/manager/BlockSignal.java new file mode 100644 index 000000000..ce9c1f7b7 --- /dev/null +++ b/src/main/java/com/volmit/iris/manager/BlockSignal.java @@ -0,0 +1,35 @@ +package com.volmit.iris.manager; + +import com.volmit.iris.util.J; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Entity; +import org.bukkit.entity.FallingBlock; +import org.bukkit.util.Vector; + +public class BlockSignal { + public BlockSignal(Block block, int ticks) + { + Location tg = block.getLocation().clone().add(0.5, 0, 0.5).clone(); + FallingBlock e = block.getWorld().spawnFallingBlock(tg.clone(), block.getBlockData()); + e.setGravity(false); + e.setInvulnerable(true); + e.setGlowing(true); + e.teleport(tg.clone()); + e.setDropItem(false); + e.setHurtEntities(false); + e.setSilent(true); + e.setTicksLived(1); + e.setVelocity(new Vector(0, 0, 0)); + J.s(() -> { + e.remove(); + BlockData type = block.getBlockData(); + block.setType(Material.AIR, false); + block.setBlockData(type, false); + }, ticks); + } +} diff --git a/src/main/java/com/volmit/iris/manager/DustRevealer.java b/src/main/java/com/volmit/iris/manager/DustRevealer.java new file mode 100644 index 000000000..02fc18ca8 --- /dev/null +++ b/src/main/java/com/volmit/iris/manager/DustRevealer.java @@ -0,0 +1,101 @@ +package com.volmit.iris.manager; + +import com.volmit.iris.util.BlockPosition; +import com.volmit.iris.util.J; +import com.volmit.iris.util.KList; +import com.volmit.iris.util.RNG; +import com.volmit.iris.v2.scaffold.engine.EngineCompositeGenerator; +import com.volmit.iris.v2.scaffold.parallax.ParallaxAccess; +import com.volmit.iris.v2.scaffold.parallax.ParallaxWorld; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.checkerframework.checker.units.qual.A; +import sun.security.mscapi.PRNG; + +import java.awt.*; + +@Data +public class DustRevealer { + private final ParallaxAccess parallax; + private final World world; + private final BlockPosition block; + private final String key; + private final KList hits; + + public static void spawn(Block block) + { + World world = block.getWorld(); + + if(world.getGenerator() instanceof EngineCompositeGenerator) + { + ParallaxAccess a = ((EngineCompositeGenerator)world.getGenerator()).getComposite().getEngineForHeight(block.getY()).getParallax(); + + if(a.getObject(block.getX(), block.getY(), block.getZ()) != null) + { + J.a(() -> { + new DustRevealer(a, world, new BlockPosition(block.getX(), block.getY(), block.getZ()), a.getObject(block.getX(), block.getY(), block.getZ()), new KList<>()); + }); + } + } + } + + public DustRevealer(ParallaxAccess parallax, World world, BlockPosition block, String key, KList hits) { + this.parallax = parallax; + this.world = world; + this.block = block; + this.key = key; + this.hits = hits; + + J.s(() -> { + new BlockSignal(world.getBlockAt(block.getX(), block.getY(), block.getZ()), 100); + J.a(() -> { + is(new BlockPosition(block.getX() + 1, block.getY(), block.getZ())); + is(new BlockPosition(block.getX() - 1, block.getY(), block.getZ())); + is(new BlockPosition(block.getX(), block.getY() + 1, block.getZ())); + is(new BlockPosition(block.getX(), block.getY() - 1, block.getZ())); + is(new BlockPosition(block.getX(), block.getY(), block.getZ() + 1)); + is(new BlockPosition(block.getX(), block.getY(), block.getZ() - 1)); + is(new BlockPosition(block.getX() + 1, block.getY(), block.getZ() + 1)); + is(new BlockPosition(block.getX() + 1, block.getY(), block.getZ() - 1)); + is(new BlockPosition(block.getX() - 1, block.getY(), block.getZ() + 1)); + is(new BlockPosition(block.getX() - 1, block.getY(), block.getZ() - 1)); + is(new BlockPosition(block.getX() + 1, block.getY() + 1, block.getZ())); + is(new BlockPosition(block.getX() + 1, block.getY() - 1, block.getZ())); + is(new BlockPosition(block.getX() - 1, block.getY() + 1, block.getZ())); + is(new BlockPosition(block.getX() - 1, block.getY() - 1, block.getZ())); + is(new BlockPosition(block.getX(), block.getY() + 1, block.getZ() - 1)); + is(new BlockPosition(block.getX(), block.getY() + 1, block.getZ() + 1)); + is(new BlockPosition(block.getX(), block.getY() - 1, block.getZ() - 1)); + is(new BlockPosition(block.getX(), block.getY() - 1, block.getZ() + 1)); + is(new BlockPosition(block.getX()-1, block.getY() + 1, block.getZ() - 1)); + is(new BlockPosition(block.getX()-1, block.getY() + 1, block.getZ() + 1)); + is(new BlockPosition(block.getX()-1, block.getY() - 1, block.getZ() - 1)); + is(new BlockPosition(block.getX()-1, block.getY() - 1, block.getZ() + 1)); + is(new BlockPosition(block.getX()+1, block.getY() + 1, block.getZ() - 1)); + is(new BlockPosition(block.getX()+1, block.getY() + 1, block.getZ() + 1)); + is(new BlockPosition(block.getX()+1, block.getY() - 1, block.getZ() - 1)); + is(new BlockPosition(block.getX()+1, block.getY() - 1, block.getZ() + 1)); + }); + }, RNG.r.i(3,6)); + } + + private boolean is(BlockPosition a) { + if(isValidTry(a) && parallax.getObject(a.getX(), a.getY(), a.getZ()) != null && parallax.getObject(a.getX(), a.getY(), a.getZ()).equals(key)) + { + hits.add(a); + new DustRevealer(parallax, world, a, key, hits); + } + + return false; + } + + private boolean isValidTry(BlockPosition b) + { + return !hits.contains(b); + } +} diff --git a/src/main/java/com/volmit/iris/manager/WandManager.java b/src/main/java/com/volmit/iris/manager/WandManager.java index 118753ccd..413ad7e95 100644 --- a/src/main/java/com/volmit/iris/manager/WandManager.java +++ b/src/main/java/com/volmit/iris/manager/WandManager.java @@ -174,6 +174,16 @@ public class WandManager implements Listener e.getPlayer().updateInventory(); } } + + if(e.getHand().equals(EquipmentSlot.HAND) && isDust(e.getPlayer().getInventory().getItemInMainHand())) + { + if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) + { + e.setCancelled(true); + e.getPlayer().playSound(e.getClickedBlock().getLocation(), Sound.ENTITY_ENDER_EYE_DEATH, 2f, 1.97f); + DustRevealer.spawn(e.getClickedBlock()); + } + } } catch(Throwable ex) @@ -254,6 +264,35 @@ public class WandManager implements Listener return createWand(null, null); } + public static ItemStack createDust() + { + ItemStack is = new ItemStack(Material.GLOWSTONE_DUST); + is.addUnsafeEnchantment(Enchantment.ARROW_INFINITE, 1); + ItemMeta im = is.getItemMeta(); + im.setDisplayName(C.BOLD + "" + C.YELLOW + "Dust of Revealing"); + im.setUnbreakable(true); + im.addItemFlags(ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_PLACED_ON, ItemFlag.HIDE_POTION_EFFECTS, ItemFlag.HIDE_DESTROYS, ItemFlag.HIDE_ENCHANTS); + im.setLore(new KList().qadd("Right click on a block to reveal it's placement structure!")); + is.setItemMeta(im); + + return is; + } + + public boolean isDust(ItemStack is) + { + if(is == null || is.getType().equals(Material.AIR)) + { + return false; + } + + if(is.getType().equals(Material.GLOWSTONE_DUST)) + { + return true; + } + + return false; + } + public static ItemStack update(boolean left, Location a, ItemStack item) { if(!isWand(item))