Dust mech

This commit is contained in:
Daniel Mills 2020-10-31 14:45:50 -04:00
parent d71297a114
commit b74a00de22
3 changed files with 175 additions and 0 deletions

View File

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

View File

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

View File

@ -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<String>().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))