mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-12-30 04:29:05 +00:00
Instant changes
This commit is contained in:
81
src/main/java/com/volmit/iris/manager/EditManager.java
Normal file
81
src/main/java/com/volmit/iris/manager/EditManager.java
Normal 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;
|
||||
}
|
||||
}
|
||||
137
src/main/java/com/volmit/iris/manager/IrisBoardManager.java
Normal file
137
src/main/java/com/volmit/iris/manager/IrisBoardManager.java
Normal 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();
|
||||
}
|
||||
}
|
||||
189
src/main/java/com/volmit/iris/manager/IrisDataManager.java
Normal file
189
src/main/java/com/volmit/iris/manager/IrisDataManager.java
Normal 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();
|
||||
}
|
||||
}
|
||||
175
src/main/java/com/volmit/iris/manager/IrisHotloadManager.java
Normal file
175
src/main/java/com/volmit/iris/manager/IrisHotloadManager.java
Normal 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;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
1901
src/main/java/com/volmit/iris/manager/ProjectManager.java
Normal file
1901
src/main/java/com/volmit/iris/manager/ProjectManager.java
Normal file
File diff suppressed because it is too large
Load Diff
55
src/main/java/com/volmit/iris/manager/StructureManager.java
Normal file
55
src/main/java/com/volmit/iris/manager/StructureManager.java
Normal 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;
|
||||
}
|
||||
}
|
||||
312
src/main/java/com/volmit/iris/manager/WandManager.java
Normal file
312
src/main/java/com/volmit/iris/manager/WandManager.java
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user