9
0
mirror of https://github.com/VolmitSoftware/Iris.git synced 2025-12-30 04:29:05 +00:00

Instant changes

This commit is contained in:
Daniel Mills
2020-09-09 00:29:22 -04:00
parent 1d11585fcd
commit 8ffe6fa8fb
36 changed files with 298 additions and 65 deletions

View File

@@ -0,0 +1,81 @@
package com.volmit.iris.manager;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.world.WorldUnloadEvent;
import com.volmit.iris.Iris;
import com.volmit.iris.edit.BlockEditor;
import com.volmit.iris.edit.BukkitBlockEditor;
import com.volmit.iris.edit.WEBlockEditor;
import com.volmit.iris.util.KMap;
import com.volmit.iris.util.M;
public class EditManager implements Listener
{
private KMap<World, BlockEditor> editors;
public EditManager()
{
this.editors = new KMap<>();
Iris.instance.registerListener(this);
Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::update, 0, 20);
}
public BlockData get(World world, int x, int y, int z)
{
return open(world).get(x, y, z);
}
public void set(World world, int x, int y, int z, BlockData d)
{
open(world).set(x, y, z, d);
}
@EventHandler
public void on(WorldUnloadEvent e)
{
if(editors.containsKey(e.getWorld()))
{
editors.remove(e.getWorld()).close();
}
}
public void update()
{
for(World i : editors.k())
{
if(M.ms() - editors.get(i).last() > 1000)
{
editors.remove(i).close();
}
}
}
public BlockEditor open(World world)
{
if(editors.containsKey(world))
{
return editors.get(world);
}
BlockEditor e = null;
if(Bukkit.getPluginManager().isPluginEnabled("WorldEdit"))
{
e = new WEBlockEditor(world);
}
else
{
e = new BukkitBlockEditor(world);
}
editors.put(world, e);
return e;
}
}

View File

@@ -0,0 +1,137 @@
package com.volmit.iris.manager;
import java.util.List;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.IrisTerrainProvider;
import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.util.BoardManager;
import com.volmit.iris.util.BoardProvider;
import com.volmit.iris.util.BoardSettings;
import com.volmit.iris.util.C;
import com.volmit.iris.util.ChronoLatch;
import com.volmit.iris.util.DontObfuscate;
import com.volmit.iris.util.Form;
import com.volmit.iris.util.IrisStructureResult;
import com.volmit.iris.util.J;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.RollingSequence;
import com.volmit.iris.util.ScoreDirection;
public class IrisBoardManager implements BoardProvider, Listener
{
@DontObfuscate
private BoardManager manager;
private String mem = "...";
public RollingSequence hits = new RollingSequence(20);
public RollingSequence tp = new RollingSequence(100);
private ChronoLatch cl = new ChronoLatch(1000);
@DontObfuscate
public IrisBoardManager()
{
Iris.instance.registerListener(this);
//@builder
manager = new BoardManager(Iris.instance, BoardSettings.builder()
.boardProvider(this)
.scoreDirection(ScoreDirection.DOWN)
.build());
//@done
}
@EventHandler
public void on(PlayerChangedWorldEvent e)
{
J.s(() -> updatePlayer(e.getPlayer()));
}
@DontObfuscate
private boolean isIrisWorld(World w)
{
return (w.getGenerator() instanceof ProvisionBukkit) && ((IrisTerrainProvider) ((ProvisionBukkit) w.getGenerator()).getProvider()).isDev();
}
public void updatePlayer(Player p)
{
if(isIrisWorld(p.getWorld()))
{
manager.remove(p);
manager.setup(p);
}
else
{
manager.remove(p);
}
}
@Override
public String getTitle(Player player)
{
return C.GREEN + "Iris";
}
@DontObfuscate
@Override
public List<String> getLines(Player player)
{
KList<String> v = new KList<>();
if(!isIrisWorld(player.getWorld()))
{
return v;
}
IrisTerrainProvider g = (IrisTerrainProvider) ((ProvisionBukkit) player.getWorld().getGenerator()).getProvider();
if(cl.flip())
{
mem = Form.memSize(g.guessMemoryUsage(), 2);
}
int x = player.getLocation().getBlockX();
int y = player.getLocation().getBlockY();
int z = player.getLocation().getBlockZ();
IrisBiome b = g.sampleTrueBiome(x, y, z);
IrisStructureResult st = g.getStructure(x, y, z);
tp.put(g.getMetrics().getSpeed());
v.add("&7&m------------------");
v.add(C.GREEN + "Speed" + C.GRAY + ": " + C.BOLD + "" + C.GRAY + Form.f(g.getMetrics().getPerSecond().getAverage(), 0) + "/s " + Form.duration(g.getMetrics().getTotal().getAverage(), 1) + "");
v.add(C.GREEN + "Generators" + C.GRAY + ": " + Form.f(CNG.creates));
v.add(C.GREEN + "Noise" + C.GRAY + ": " + Form.f((int) hits.getAverage()));
v.add(C.GREEN + "Parallax" + C.GRAY + ": " + Form.f((int) g.getParallaxMap().getLoadedChunks().size()));
v.add(C.GREEN + "Objects" + C.GRAY + ": " + Form.f(g.getData().getObjectLoader().count()));
v.add(C.GREEN + "Memory" + C.GRAY + ": " + mem);
v.add("&7&m------------------");
v.add(C.GREEN + "Heightmap" + C.GRAY + ": " + (int) g.getTerrainHeight(x, z));
if(b != null)
{
v.add(C.GREEN + "Biome" + C.GRAY + ": " + b.getName());
}
if(st != null)
{
v.add(C.GREEN + "Structure" + C.GRAY + ": " + st.getStructure().getName());
v.add(C.GREEN + "Tile" + C.GRAY + ": " + st.getTile().toString());
}
v.add("&7&m------------------");
return v;
}
@DontObfuscate
public void disable()
{
manager.onDisable();
}
}

View File

@@ -0,0 +1,189 @@
package com.volmit.iris.manager;
import java.io.File;
import org.bukkit.World.Environment;
import org.bukkit.block.Biome;
import com.google.gson.Gson;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisBiomeDecorator;
import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.object.IrisEntity;
import com.volmit.iris.object.IrisGenerator;
import com.volmit.iris.object.IrisLootTable;
import com.volmit.iris.object.IrisNoiseGenerator;
import com.volmit.iris.object.IrisObjectPlacement;
import com.volmit.iris.object.IrisRegion;
import com.volmit.iris.object.IrisStructure;
import com.volmit.iris.util.IO;
import com.volmit.iris.util.JSONObject;
import com.volmit.iris.util.ObjectResourceLoader;
import com.volmit.iris.util.ResourceLoader;
import lombok.Data;
@Data
public class IrisDataManager
{
private File dataFolder;
private File packs;
private boolean prod;
private ResourceLoader<IrisBiome> biomeLoader;
private ResourceLoader<IrisLootTable> lootLoader;
private ResourceLoader<IrisRegion> regionLoader;
private ResourceLoader<IrisDimension> dimensionLoader;
private ResourceLoader<IrisGenerator> generatorLoader;
private ResourceLoader<IrisStructure> structureLoader;
private ResourceLoader<IrisEntity> entityLoader;
private ObjectResourceLoader objectLoader;
public void hotloaded()
{
if(prod)
{
return;
}
File packs = this.packs.getName().equals("packs") ? this.packs : dataFolder;
packs.mkdirs();
this.lootLoader = new ResourceLoader<>(packs, "loot", "Loot", IrisLootTable.class);
this.entityLoader = new ResourceLoader<>(packs, "entities", "Entity", IrisEntity.class);
this.regionLoader = new ResourceLoader<>(packs, "regions", "Region", IrisRegion.class);
this.biomeLoader = new ResourceLoader<>(packs, "biomes", "Biome", IrisBiome.class);
this.dimensionLoader = new ResourceLoader<>(packs, "dimensions", "Dimension", IrisDimension.class);
this.structureLoader = new ResourceLoader<>(packs, "structures", "Structure", IrisStructure.class);
this.generatorLoader = new ResourceLoader<>(packs, "generators", "Generator", IrisGenerator.class);
this.objectLoader = new ObjectResourceLoader(packs, "objects", "Object");
if(packs.getName().equals("packs"))
{
writeExamples();
}
}
public IrisDataManager(File dataFolder)
{
this.dataFolder = dataFolder;
this.packs = new File(dataFolder, "packs");
boolean pr = false;
if(!packs.exists())
{
if(new File(dataFolder, "iris").exists())
{
pr = true;
packs = new File(dataFolder, "iris");
}
}
hotloaded();
prod = pr;
}
public void dump()
{
biomeLoader.clearCache();
lootLoader.clearCache();
regionLoader.clearCache();
dimensionLoader.clearCache();
entityLoader.clearCache();
generatorLoader.clearCache();
structureLoader.clearCache();
}
private void writeExamples()
{
File examples = new File(dataFolder, "example");
examples.mkdirs();
String biomes = "";
String envs = "";
for(Biome i : Biome.values())
{
biomes += i.name() + "\n";
}
for(Environment i : Environment.values())
{
envs += i.name() + "\n";
}
try
{
new File(examples, "example-pack/regions").mkdirs();
new File(examples, "example-pack/biomes").mkdirs();
new File(examples, "example-pack/dimensions").mkdirs();
new File(examples, "example-pack/generators").mkdirs();
IO.writeAll(new File(examples, "biome-list.txt"), biomes);
IO.writeAll(new File(examples, "environment-list.txt"), envs);
IrisGenerator gen = new IrisGenerator();
IrisNoiseGenerator n = new IrisNoiseGenerator();
n.setSeed(1000);
IrisNoiseGenerator nf = new IrisNoiseGenerator();
nf.setOctaves(3);
nf.setOpacity(16);
nf.setZoom(24);
nf.setSeed(44);
n.getFracture().add(nf);
IrisNoiseGenerator nf2 = new IrisNoiseGenerator();
nf2.setOctaves(8);
nf2.setOpacity(24);
nf2.setZoom(64);
nf2.setSeed(55);
n.getFracture().add(nf2);
gen.getComposite().add(n);
IrisDimension dim = new IrisDimension();
IrisRegion region = new IrisRegion();
region.getLandBiomes().add("plains");
region.getLandBiomes().add("desert");
region.getLandBiomes().add("forest");
region.getLandBiomes().add("mountains");
region.getSeaBiomes().add("ocean");
region.getShoreBiomes().add("beach");
IrisObjectPlacement o = new IrisObjectPlacement();
o.getPlace().add("schematic1");
o.getPlace().add("schematic2");
IrisBiome biome = new IrisBiome();
biome.getChildren().add("another_biome");
biome.getDecorators().add(new IrisBiomeDecorator());
biome.getObjects().add(o);
IO.writeAll(new File(examples, "example-pack/biomes/example-biome.json"), new JSONObject(new Gson().toJson(biome)).toString(4));
IO.writeAll(new File(examples, "example-pack/regions/example-region.json"), new JSONObject(new Gson().toJson(region)).toString(4));
IO.writeAll(new File(examples, "example-pack/dimensions/example-dimension.json"), new JSONObject(new Gson().toJson(dim)).toString(4));
IO.writeAll(new File(examples, "example-pack/generators/example-generator.json"), new JSONObject(new Gson().toJson(gen)).toString(4));
}
catch(Throwable e)
{
}
}
public void preferFolder(String name)
{
biomeLoader.preferFolder(name);
lootLoader.preferFolder(name);
regionLoader.preferFolder(name);
entityLoader.preferFolder(name);
dimensionLoader.preferFolder(name);
generatorLoader.preferFolder(name);
structureLoader.preferFolder(name);
}
public void clearLists()
{
lootLoader.clearList();
entityLoader.clearList();
biomeLoader.clearList();
regionLoader.clearList();
dimensionLoader.clearList();
generatorLoader.clearList();
structureLoader.clearList();
}
}

View File

@@ -0,0 +1,175 @@
package com.volmit.iris.manager;
import java.io.File;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.scaffold.IrisContext;
import com.volmit.iris.util.ChronoLatch;
import com.volmit.iris.util.FolderWatcher;
import com.volmit.iris.util.J;
public class IrisHotloadManager
{
private ChronoLatch latch;
private volatile boolean busy = false;
private FolderWatcher w;
public IrisHotloadManager()
{
if(!IrisSettings.get().studio)
{
w = null;
}
else
{
w = new FolderWatcher(Iris.instance.getDataFolder("packs"));
}
latch = new ChronoLatch(3000);
}
public void check(IrisContext ch)
{
if(!IrisSettings.get().isStudio())
{
return;
}
if(!latch.flip())
{
return;
}
if(busy)
{
return;
}
busy = true;
J.attemptAsync(() ->
{
boolean modified = false;
int c = 0;
try
{
if(w.checkModified())
{
for(File i : w.getCreated())
{
if(i.isDirectory())
{
continue;
}
if(i.getPath().contains(".git"))
{
continue;
}
if(i.getPath().contains("_docs"))
{
continue;
}
if(i.getName().endsWith(".code-workspace"))
{
continue;
}
modified = true;
c++;
Iris.verbose("File Created: " + i.getPath());
}
for(File i : w.getDeleted())
{
if(i.isDirectory())
{
continue;
}
if(i.getPath().contains("_docs"))
{
continue;
}
if(i.getPath().contains(".git"))
{
continue;
}
if(i.getName().endsWith(".code-workspace"))
{
continue;
}
modified = true;
c++;
Iris.verbose("File Deleted: " + i.getPath());
}
for(File i : w.getChanged())
{
if(i.isDirectory())
{
continue;
}
if(i.getPath().contains(".git"))
{
continue;
}
if(i.getPath().contains("_docs"))
{
continue;
}
if(i.getName().endsWith(".code-workspace"))
{
continue;
}
modified = true;
c++;
Iris.verbose("File Modified: " + i.getPath());
}
}
}
catch(Throwable e)
{
}
int cc = c;
if(modified)
{
J.s(() ->
{
String m = "Hotloaded " + cc + " File" + (cc == 1 ? "" : "s");
for(Player i : Bukkit.getOnlinePlayers())
{
i.sendMessage(Iris.instance.getTag("Studio") + m);
}
Bukkit.getConsoleSender().sendMessage(Iris.instance.getTag("Studio") + m);
Iris.globaldata.hotloaded();
ch.onHotloaded();
busy = false;
});
}
else
{
busy = false;
}
});
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,55 @@
package com.volmit.iris.manager;
import org.bukkit.entity.Player;
import com.volmit.iris.structure.StructureTemplate;
import com.volmit.iris.util.KList;
public class StructureManager
{
private KList<StructureTemplate> openEditors;
public StructureManager()
{
this.openEditors = new KList<>();
}
public void closeall()
{
for(StructureTemplate i : openEditors.copy())
{
i.close();
}
}
public void open(StructureTemplate t)
{
for(StructureTemplate i : openEditors.copy())
{
if(t.getWorker().equals(i.getWorker()))
{
i.close();
}
}
openEditors.add(t);
}
public void remove(StructureTemplate s)
{
openEditors.remove(s);
}
public StructureTemplate get(Player p)
{
for(StructureTemplate i : openEditors)
{
if(i.getWorker().equals(p))
{
return i;
}
}
return null;
}
}

View File

@@ -0,0 +1,312 @@
package com.volmit.iris.manager;
import java.awt.Color;
import java.util.Iterator;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.BlockVector;
import org.bukkit.util.Vector;
import com.volmit.iris.Iris;
import com.volmit.iris.object.IrisObject;
import com.volmit.iris.util.C;
import com.volmit.iris.util.Cuboid;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.M;
public class WandManager implements Listener
{
public WandManager()
{
Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, () ->
{
for(Player i : Bukkit.getOnlinePlayers())
{
tick(i);
}
}, 0, 5);
Bukkit.getPluginManager().registerEvents(this, Iris.instance);
}
public void tick(Player p)
{
try
{
if(isWand(p.getInventory().getItemInMainHand()))
{
Location[] d = getCuboid(p.getInventory().getItemInMainHand());
draw(d, p);
}
}
catch(Throwable e)
{
}
}
public void draw(Cuboid d, Player p)
{
draw(new Location[] {d.getLowerNE(), d.getUpperSW()}, p);
}
public void draw(Location[] d, Player p)
{
Vector gx = Vector.getRandom().subtract(Vector.getRandom()).normalize().clone().multiply(0.65);
d[0].getWorld().spawnParticle(Particle.CRIT_MAGIC, d[0], 1, 0.5 + gx.getX(), 0.5 + gx.getY(), 0.5 + gx.getZ(), 0, null, false);
Vector gxx = Vector.getRandom().subtract(Vector.getRandom()).normalize().clone().multiply(0.65);
d[1].getWorld().spawnParticle(Particle.CRIT, d[1], 1, 0.5 + gxx.getX(), 0.5 + gxx.getY(), 0.5 + gxx.getZ(), 0, null, false);
if(!d[0].getWorld().equals(d[1].getWorld()))
{
return;
}
if(d[0].distanceSquared(d[1]) > 64 * 64)
{
return;
}
int minx = Math.min(d[0].getBlockX(), d[1].getBlockX());
int miny = Math.min(d[0].getBlockY(), d[1].getBlockY());
int minz = Math.min(d[0].getBlockZ(), d[1].getBlockZ());
int maxx = Math.max(d[0].getBlockX(), d[1].getBlockX());
int maxy = Math.max(d[0].getBlockY(), d[1].getBlockY());
int maxz = Math.max(d[0].getBlockZ(), d[1].getBlockZ());
for(double j = minx - 1; j < maxx + 1; j += 0.25)
{
for(double k = miny - 1; k < maxy + 1; k += 0.25)
{
for(double l = minz - 1; l < maxz + 1; l += 0.25)
{
if(M.r(0.2))
{
boolean jj = j == minx || j == maxx;
boolean kk = k == miny || k == maxy;
boolean ll = l == minz || l == maxz;
double aa = j;
double bb = k;
double cc = l;
if((jj && kk) || (jj && ll) || (ll && kk))
{
Vector push = new Vector(0, 0, 0);
if(j == minx)
{
push.add(new Vector(-0.55, 0, 0));
}
if(k == miny)
{
push.add(new Vector(0, -0.55, 0));
}
if(l == minz)
{
push.add(new Vector(0, 0, -0.55));
}
if(j == maxx)
{
push.add(new Vector(0.55, 0, 0));
}
if(k == maxy)
{
push.add(new Vector(0, 0.55, 0));
}
if(l == maxz)
{
push.add(new Vector(0, 0, 0.55));
}
Location lv = new Location(d[0].getWorld(), aa, bb, cc).clone().add(0.5, 0.5, 0.5).clone().add(push);
Color color = Color.getHSBColor((float) (0.5f + (Math.sin((aa + bb + cc + (p.getTicksLived() / 2)) / 20f) / 2)), 1, 1);
int r = color.getRed();
int g = color.getGreen();
int b = color.getBlue();
p.spawnParticle(Particle.REDSTONE, lv.getX(), lv.getY(), lv.getZ(), 1, 0, 0, 0, 0, new Particle.DustOptions(org.bukkit.Color.fromRGB(r, g, b), 0.75f));
}
}
}
}
}
}
@EventHandler
public void on(PlayerInteractEvent e)
{
if(e.getHand().equals(EquipmentSlot.HAND) && isWand(e.getPlayer().getInventory().getItemInMainHand()))
{
if(e.getAction().equals(Action.LEFT_CLICK_BLOCK))
{
e.setCancelled(true);
e.getPlayer().getInventory().setItemInMainHand(update(true, e.getClickedBlock().getLocation(), e.getPlayer().getInventory().getItemInMainHand()));
e.getPlayer().playSound(e.getClickedBlock().getLocation(), Sound.BLOCK_END_PORTAL_FRAME_FILL, 1f, 0.67f);
e.getPlayer().updateInventory();
}
else if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK))
{
e.setCancelled(true);
e.getPlayer().getInventory().setItemInMainHand(update(false, e.getClickedBlock().getLocation(), e.getPlayer().getInventory().getItemInMainHand()));
e.getPlayer().playSound(e.getClickedBlock().getLocation(), Sound.BLOCK_END_PORTAL_FRAME_FILL, 1f, 1.17f);
e.getPlayer().updateInventory();
}
}
}
public static void pasteSchematic(IrisObject s, Location at)
{
s.place(at);
}
public static IrisObject createSchematic(ItemStack wand)
{
if(!isWand(wand))
{
return null;
}
try
{
Location[] f = getCuboid(wand);
Cuboid c = new Cuboid(f[0], f[1]);
IrisObject s = new IrisObject(c.getSizeX(), c.getSizeY(), c.getSizeZ());
Iterator<Block> bb = c.iterator();
while(bb.hasNext())
{
Block b = bb.next();
if(b.getType().equals(Material.AIR))
{
continue;
}
BlockVector bv = b.getLocation().subtract(c.getLowerNE().toVector()).toVector().toBlockVector();
s.setUnsigned(bv.getBlockX(), bv.getBlockY(), bv.getBlockZ(), b.getBlockData());
}
return s;
}
catch(Throwable e)
{
e.printStackTrace();
}
return null;
}
public static Location stringToLocation(String s)
{
try
{
String[] f = s.split("\\Q in \\E");
String[] g = f[0].split("\\Q,\\E");
return new Location(Bukkit.getWorld(f[1]), Integer.valueOf(g[0]), Integer.valueOf(g[1]), Integer.valueOf(g[2]));
}
catch(Throwable e)
{
return null;
}
}
public static String locationToString(Location s)
{
if(s == null)
{
return "<#>";
}
return s.getBlockX() + "," + s.getBlockY() + "," + s.getBlockZ() + " in " + s.getWorld().getName();
}
public static ItemStack createWand()
{
return createWand(null, null);
}
public static ItemStack update(boolean left, Location a, ItemStack item)
{
if(!isWand(item))
{
return item;
}
Location[] f = getCuboid(item);
Location other = left ? f[1] : f[0];
if(other != null && !other.getWorld().getName().equals(a.getWorld().getName()))
{
other = null;
}
return createWand(left ? a : other, left ? other : a);
}
public static ItemStack createWand(Location a, Location b)
{
ItemStack is = new ItemStack(Material.BLAZE_ROD);
is.addUnsafeEnchantment(Enchantment.ARROW_INFINITE, 1);
ItemMeta im = is.getItemMeta();
im.setDisplayName(C.BOLD + "" + C.GOLD + "Wand of Iris");
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>().add(locationToString(a), locationToString(b)));
is.setItemMeta(im);
return is;
}
public static boolean isWand(Player p)
{
ItemStack is = p.getInventory().getItemInMainHand();
return !(is == null || !isWand(is));
}
public static Location[] getCuboid(ItemStack is)
{
ItemMeta im = is.getItemMeta();
return new Location[] {stringToLocation(im.getLore().get(0)), stringToLocation(im.getLore().get(1))};
}
public static boolean isWand(ItemStack item)
{
if(!item.getType().equals(createWand().getType()))
{
return false;
}
if(!item.getItemMeta().getEnchants().equals(createWand().getItemMeta().getEnchants()))
{
return false;
}
if(!item.getItemMeta().getDisplayName().equals(createWand().getItemMeta().getDisplayName()))
{
return false;
}
return true;
}
}