diff --git a/Plugins/Mineplex.Core.Common/src/com/java/sk89q/jnbt/NBTUtils.java b/Plugins/Mineplex.Core.Common/src/com/java/sk89q/jnbt/NBTUtils.java index e515a7141..8e0b2d589 100755 --- a/Plugins/Mineplex.Core.Common/src/com/java/sk89q/jnbt/NBTUtils.java +++ b/Plugins/Mineplex.Core.Common/src/com/java/sk89q/jnbt/NBTUtils.java @@ -19,6 +19,8 @@ package com.java.sk89q.jnbt; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -26,6 +28,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +import org.bukkit.util.Vector; import net.minecraft.server.v1_8_R3.NBTBase; import net.minecraft.server.v1_8_R3.NBTTagByte; @@ -188,6 +194,33 @@ public final class NBTUtils { } + public static byte[] toBytesCompressed(String name, CompoundTag tag) + { + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + try (NBTOutputStream nbtStream = new NBTOutputStream(new GZIPOutputStream(byteStream))) + { + nbtStream.writeNamedTag(name, tag); + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + return byteStream.toByteArray(); + } + + public static NamedTag getFromBytesCompressed(byte[] bytes) + { + try (NBTInputStream stream = new NBTInputStream(new GZIPInputStream(new ByteArrayInputStream(bytes)));) + { + return stream.readNamedTag(); + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + } public static NBTBase toNative(Tag tag) { @@ -399,5 +432,10 @@ public final class NBTUtils { } return nbttaglist; } + + public static Vector getVector(CompoundTag tag) + { + return new Vector(tag.asDouble("x"), tag.asDouble("y"), tag.asDouble("z")); + } } diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java index 8f3d3b27f..492c58bfc 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java @@ -280,7 +280,7 @@ public class Schematic public boolean hasIndex(int index) { - return index < _blocks.length; + return index < _blocks.length && index >= 0; } public short getBlock(int x, int y, int z) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/UtilSchematic.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/UtilSchematic.java index 6a3ec9031..4b4ba78cf 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/UtilSchematic.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/UtilSchematic.java @@ -14,7 +14,6 @@ import java.util.Map; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/F.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/F.java index 668220aa2..bb9301dfc 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/F.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/F.java @@ -1,11 +1,9 @@ package mineplex.core.common.util; -import mineplex.core.common.Rank; - -import java.util.LinkedList; - import org.bukkit.ChatColor; +import mineplex.core.common.Rank; + public class F { public static String main(String module, String body) @@ -29,6 +27,11 @@ public class F return C.mGame + elem + C.mBody; } + public static String color(String msg, String color) + { + return color + msg + C.mBody; + } + public static String ta(String message) { return C.cGreen + message + C.cWhite; diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java index 48e1d3b18..075e777df 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java @@ -606,10 +606,10 @@ public class UtilBlock } public static ArrayList getInBoundingBox(Location a, Location b, boolean ignoreAir) { - return getInBoundingBox(a, b, ignoreAir, false, true, true); + return getInBoundingBox(a, b, ignoreAir, false, false, false); } - public static ArrayList getInBoundingBox(Location a, Location b, boolean ignoreAir, boolean hollow, boolean walls, boolean ceilfloor) + public static ArrayList getInBoundingBox(Location a, Location b, boolean ignoreAir, boolean hollow, boolean wallsOnly, boolean ceilfloorOnly) { ArrayList blocks = new ArrayList(); @@ -626,26 +626,25 @@ public class UtilBlock for (int y = ymin; y <= ymax; y++) for (int z = zmin; z <= zmax; z++) { - if(hollow) { if(!(x == xmin || x == xmax || y == ymin || y == ymax || z == zmin || z == zmax)) continue; } - if(!walls) + if(wallsOnly) { if( - (x == xmin || x == xmax) || - (z == zmin || z == zmax) + (x != xmin && x != xmax) && + (z != zmin && z != zmax) ) { continue; } } - if(!ceilfloor) + if(ceilfloorOnly) { - if(y == ymin || y == ymax) + if(y != ymin && y != ymax) { continue; } diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilServer.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilServer.java index 1f05befb8..840f78586 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilServer.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilServer.java @@ -11,6 +11,7 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; import java.lang.reflect.Field; @@ -112,7 +113,7 @@ public class UtilServer public static Plugin getPlugin() { - return getPluginManager().getPlugins()[0]; + return JavaPlugin.getProvidingPlugin(UtilServer.class); } public static PluginManager getPluginManager() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java index 8e7efe0f0..858b3de2b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java @@ -9,7 +9,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.UUID; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Effect; import org.bukkit.GameMode; @@ -734,7 +733,7 @@ public class Build extends SoloGame if (data == null) return; - if (event.getTo().getY() > Math.max(data.CornerA.getBlockY(), data.CornerB.getBlockY()) + 3 && + if (event.getTo().getY() > data.getMaxHeight() + 3 && UtilMath.offset(data.Spawn, event.getFrom()) < UtilMath.offset(data.Spawn, event.getTo())) { //Inform diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/BuildData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/BuildData.java index d70324663..34077097e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/BuildData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/BuildData.java @@ -1,24 +1,13 @@ package nautilus.game.arcade.game.games.build; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; -import mineplex.core.common.block.schematic.Schematic; -import mineplex.core.common.block.schematic.UtilSchematic; -import mineplex.core.common.util.F; -import mineplex.core.common.util.MapUtil; -import mineplex.core.common.util.NautHashMap; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.recharge.Recharge; - +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; @@ -32,6 +21,26 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.util.Vector; +import com.java.sk89q.jnbt.CompoundTag; +import com.java.sk89q.jnbt.DoubleTag; +import com.java.sk89q.jnbt.NBTUtils; +import com.java.sk89q.jnbt.StringTag; +import com.java.sk89q.jnbt.Tag; + +import mineplex.core.common.block.schematic.Schematic; +import mineplex.core.common.block.schematic.UtilSchematic; +import mineplex.core.common.util.F; +import mineplex.core.common.util.MapUtil; +import mineplex.core.common.util.NautHashMap; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.recharge.Recharge; import net.minecraft.server.v1_8_R3.EntityLightning; import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntityWeather; @@ -64,12 +73,17 @@ public class BuildData public WeatherType Weather = WeatherType.SUNNY; - private double _totalPoints = 0; + private double _totalPoints = 0; - public BuildData(Player player, Location spawn, ArrayList buildBorders) + protected BuildData(Player player, Location spawn) { Player = player; Spawn = spawn; + } + + public BuildData(Player player, Location spawn, ArrayList buildBorders) + { + this(player, spawn); CornerA = UtilAlg.findClosest(spawn, buildBorders); buildBorders.remove(CornerA); @@ -359,12 +373,84 @@ public class BuildData IsAbusive = true; } + protected Location getMin() + { + return Vector.getMinimum(CornerA.toVector(), CornerB.toVector()).toLocation(CornerA.getWorld()).subtract(0, 1, 0); + } + + protected Location getMax() + { + return Vector.getMaximum(CornerA.toVector(), CornerB.toVector()).toLocation(CornerA.getWorld()); + } + + public double getMaxHeight() + { + return Math.max(CornerA.getY(), CornerB.getY()); + } + /** * Converts all the blocks inside the build to a schematic * @return */ public Schematic convertToSchematic() { - return UtilSchematic.createSchematic(CornerA, CornerB); + Location min = getMin(); + Location max = getMax(); + + return UtilSchematic.createSchematic(min, max); + } + + public Map getParticles() + { + Bukkit.broadcastMessage("Getting particles [" + Player.getName() + "]"); + Vector min = getMin().toVector(); + + Map map = new HashMap<>(); + for(Entry e : Particles.entrySet()) + { + Vector v = e.getKey().toVector().subtract(min); + map.put(v, e.getValue()); + } + + Bukkit.broadcastMessage("Returning map [" + map.size() + "]:\n" + map); + + return map; + } + + public byte[] getParticlesBytes() + { + Map map = new HashMap(); + int i = 0; + + for(Entry e : getParticles().entrySet()) + { + Map entryMap = new HashMap<>(); + entryMap.put("x", new DoubleTag(e.getKey().getX())); + entryMap.put("y", new DoubleTag(e.getKey().getY())); + entryMap.put("z", new DoubleTag(e.getKey().getZ())); + entryMap.put("particle", new StringTag(e.getValue().name())); + + + + CompoundTag entry = new CompoundTag(entryMap); + map.put("particle" + i++, entry); + + Bukkit.broadcastMessage("Adding entry: 'particle" + i + "'\n" + entry); + } + + CompoundTag parent = new CompoundTag(map); + + Bukkit.broadcastMessage("Compressing main: " + parent); + + byte[] bytes = NBTUtils.toBytesCompressed("particles", parent); + if(bytes == null) + { + Bukkit.broadcastMessage("Returning bytes = null!"); + } + else + { + Bukkit.broadcastMessage("Returning bytes: " + bytes.length + "\n" + new String(bytes)); + } + return bytes; } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/BuildDataCylinder.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/BuildDataCylinder.java new file mode 100644 index 000000000..5c6a7acda --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/BuildDataCylinder.java @@ -0,0 +1,95 @@ +package nautilus.game.arcade.game.games.buildmavericks; + +import java.util.Set; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilItem; +import mineplex.core.recharge.Recharge; +import nautilus.game.arcade.game.games.build.BuildData; +import nautilus.game.arcade.game.games.build.GroundData; + +public class BuildDataCylinder extends BuildData +{ + + private final double RADIUS = 11; + private final double HEIGHT = 25; + private final Location _blockSpawn; + + public BuildDataCylinder(Player player, Location spawn) + { + super(player, spawn); + _blockSpawn = spawn.getWorld().getHighestBlockAt(spawn).getLocation().add(0.5, 0, 0.5); + } + + @Override + public boolean inBuildArea(Block block) + { + if(!block.getWorld().equals(_blockSpawn.getWorld())) return false; + + Location loc = block.getLocation().add(0.5, 0, 0.5); + loc.setY(_blockSpawn.getY()); + + double yDiff = block.getY()-_blockSpawn.getY(); + + if(yDiff < 0 || yDiff > HEIGHT) return false; + + return loc.distanceSquared(_blockSpawn) < RADIUS*RADIUS; + } + + @Override + public void setGround(GroundData ground) + { + if (!Recharge.Instance.use(Player, "Change Ground", 2000, true, false)) + { + Player.playSound(Player.getLocation(), Sound.NOTE_BASS_GUITAR, 1f, 0.1f); + return; + } + + Material mat = ground.getMaterial(); + byte data = ground.getData(); + + if (mat == Material.LAVA_BUCKET) mat = Material.LAVA; + else if (mat == Material.WATER_BUCKET) mat = Material.WATER; + + //Set everything to air first to prevent the forming of obby. + Set blocks = UtilBlock.getInRadius(_blockSpawn, RADIUS, 0).keySet(); + UtilBlock.startQuickRecording(); + for(Block b : blocks) + { + if(!UtilItem.isLiquid(b.getType())) continue; + + UtilBlock.setQuick(_blockSpawn.getWorld(), b.getX(), b.getY()-1, b.getZ(), 0, (byte) 0); + } + for(Block b : blocks) + { + UtilBlock.setQuick(_blockSpawn.getWorld(), b.getX(), b.getY()-1, b.getZ(), mat.getId(), data); + } + UtilBlock.stopQuickRecording(); + + } + + @Override + protected Location getMin() + { + return _blockSpawn.clone().subtract(RADIUS, 1, RADIUS); + } + + @Override + protected Location getMax() + { + return _blockSpawn.clone().add(RADIUS, HEIGHT, RADIUS); + } + + @Override + public double getMaxHeight() + { + return _blockSpawn.getY() + HEIGHT; + } + +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/BuildMavericks.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/BuildMavericks.java index 1c1fdae86..4aff95c4f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/BuildMavericks.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/BuildMavericks.java @@ -23,7 +23,11 @@ import org.bukkit.util.Vector; import mineplex.core.common.block.schematic.Schematic; import mineplex.core.common.block.schematic.UtilSchematic; import mineplex.core.common.util.BukkitFuture; -import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilTextMiddle; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.games.build.Build; @@ -69,10 +73,12 @@ public class BuildMavericks extends Build _reposetory = new MavericksRepository(); //TODO: REMOVE AFTER DEBUG! - _buildTime = 10000; + /* + _buildTime = 20000; _voteTime = 4000; _viewTime = 7000; Bukkit.broadcastMessage("Time updated!"); + */ // Bukkit.getPluginManager().registerEvents(new SchematicTester(), UtilServer.getPlugin()); @@ -111,6 +117,7 @@ public class BuildMavericks extends Build UUID uuid = e.getKey().getUniqueId(); + String name = e.getKey().getName(); Schematic schematic = data.convertToSchematic(); @@ -119,15 +126,15 @@ public class BuildMavericks extends Build Bukkit.broadcastMessage("--> Place: " + place); if(place == -1) continue; - MavericksBuildWrapper wrapper = new MavericksBuildWrapper(uuid, _word, data.getPoints(), place, - System.currentTimeMillis(), UtilSchematic.getBytes(schematic)); + MavericksBuildWrapper wrapper = new MavericksBuildWrapper(-1, uuid, name, _word, data.getPoints(), place, + System.currentTimeMillis(), UtilSchematic.getBytes(schematic), data.getParticlesBytes(), false); Bukkit.broadcastMessage("--> Uploading..."); _reposetory.add(wrapper).thenCompose(BukkitFuture.accept(sucess -> { Bukkit.broadcastMessage("Success: " + sucess); if(!sucess) - new RuntimeException("Unable to save build data and schematic for player '" + e.getKey().getName() + "': " + wrapper).printStackTrace();; + new RuntimeException("Unable to save build data and schematic for player '" + e.getKey().getName() + "': " + wrapper).printStackTrace(); })); } } @@ -249,5 +256,62 @@ public class BuildMavericks extends Build } + @EventHandler + public void prepare(GameStateChangeEvent event) + { + if (event.GetState() == GameState.Prepare) + { + if (GetPlayers(true).size() > GetTeamList().get(0).GetSpawns().size()) + { + SetState(GameState.End); + Announce(C.Bold + "Too Many Players..."); + return; + } + } + + else if (event.GetState() == GameState.Live) + { + for (Player player : GetPlayers(true)) + { + Location spawn = UtilAlg.findClosest(player.getLocation(), this.GetTeamList().get(0).GetSpawns()); + + _data.put(player, new BuildDataCylinder(player, spawn)); + + player.setFlySpeed(0.1f); + } + + if (!_useHolidayWords || Math.random() >= 0.5) + _word = _words[UtilMath.r(_words.length)]; + else + _word = _holidayWords[UtilMath.r(_holidayWords.length)]; + + UtilTextMiddle.display(null, C.cYellow + "Build " + C.cWhite + _word, 0, 80, 5); + + this.WorldTimeSet = -1; + } + } + + @EventHandler + public void onCommand(PlayerCommandPreprocessEvent event) + { + if(event.getMessage().equals("/endbuildtime")) + { + event.setCancelled(true); + + if(GetState() != GameState.Live) + { + event.getPlayer().sendMessage(F.main(GetName(), "The game is not currently running.")); + return; + } + if(_buildTime < 0) + { + event.getPlayer().sendMessage(F.main(GetName(), "Build time is over!")); + return; + } + Announce(event.getPlayer().getName() + " has ended the build time", true); + _buildTime = 0; + } + } + } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksBuildWrapper.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksBuildWrapper.java index 87ac372ec..16dd8de06 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksBuildWrapper.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksBuildWrapper.java @@ -1,32 +1,62 @@ package nautilus.game.arcade.game.games.buildmavericks.repository; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; import java.util.UUID; +import org.bukkit.util.Vector; + +import com.java.sk89q.jnbt.CompoundTag; +import com.java.sk89q.jnbt.NBTUtils; +import com.java.sk89q.jnbt.Tag; + import mineplex.core.common.block.schematic.Schematic; import mineplex.core.common.block.schematic.UtilSchematic; +import mineplex.core.common.util.UtilParticle.ParticleType; /** * A simple wrapper class for Mavericks-MasterBuilders SQL data */ public class MavericksBuildWrapper { - + private final long _buildId; private final UUID _uuid; private final String _theme; private final double _points; private final int _place; private final long _dateStamp; private final byte[] _schematic; + private final byte[] _particles; + private boolean _reviewed; + + private final String _name; - public MavericksBuildWrapper(UUID uuid, String theme, double points, int place, long dateStamp, byte[] schematic) + public MavericksBuildWrapper(long buildId, UUID uuid, String name, String theme, double points, int place, long dateStamp, + byte[] schematic, byte[] particles, boolean reviewed) { + this._buildId = buildId; this._uuid = uuid; + this._name = name; this._theme = theme; this._points = points; this._place = place; this._dateStamp = dateStamp; this._schematic = schematic; + this._particles = particles; + this._reviewed = reviewed; + } + + public MavericksBuildWrapper(long buildId, UUID uuid, String theme, double points, int place, long dateStamp, + byte[] schematic, byte[] particles, boolean reviewed) + { + this(buildId, uuid, null, theme, points, place, dateStamp, schematic, particles, reviewed); + } + + public long getBuildId() + { + return _buildId; } public UUID getUUID() @@ -34,6 +64,16 @@ public class MavericksBuildWrapper return _uuid; } + public String getName() + { + return _name; + } + + public boolean hasNameSet() + { + return _name != null; + } + public String getTheme() { return _theme; @@ -59,6 +99,16 @@ public class MavericksBuildWrapper return _schematic; } + public boolean isReviewed() + { + return _reviewed; + } + + public void setReviewed(boolean reviewed) + { + _reviewed = reviewed; + } + public Schematic getSchematic() { try @@ -67,16 +117,54 @@ public class MavericksBuildWrapper } catch (Exception e) { + e.printStackTrace(); return null; } } + public boolean hasParticles() + { + return _particles != null && _particles.length > 0; + } + + public byte[] getParticlesRaw() + { + return _particles; + } + + public Map getParticles() + { + Map map = new HashMap<>(); + if(!hasParticles()) return map; + + try + { + CompoundTag tag = (CompoundTag) NBTUtils.getFromBytesCompressed(_particles).getTag(); + for(Entry e : tag.getValue().entrySet()) + { + CompoundTag parent = (CompoundTag) e.getValue(); + + Vector v = NBTUtils.getVector(parent); + ParticleType particle = ParticleType.valueOf(parent.getString("particle")); + + while(map.containsKey(v)) v.add(new Vector(0.00000001, 0, 0)); + map.put(v, particle); + + } + } + catch (Exception e) + { + e.printStackTrace(); + } + + return map; + } + @Override public String toString() { return "MavericksBuildWrapper[uuid='" + _uuid + "',theme='" + _theme + "',points=" + _points + ",place=" + _place + ",date=" + _dateStamp + ",Schematic=ByteArray[" + _schematic.length + "]]"; } - } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksRepository.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksRepository.java index 5d36366e7..a5a3db34f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksRepository.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksRepository.java @@ -2,11 +2,7 @@ package nautilus.game.arcade.game.games.buildmavericks.repository; import java.sql.Connection; import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; import java.util.concurrent.CompletableFuture; import mineplex.serverdata.database.DBPool; @@ -40,97 +36,20 @@ public class MavericksRepository try (Connection conn = DBPool.getAccount().getConnection()) { - PreparedStatement stmt = conn.prepareStatement("REPLACE INTO " + TABLE + " (accountId, BuildTheme, Points, Place, Date, Schematic) SELECT accounts.id, ?, ?, ?, ?, ? FROM accounts WHERE uuid=?"); + PreparedStatement stmt = conn.prepareStatement("REPLACE INTO " + TABLE + " (accountId, BuildTheme, Points, Place, Date, Schematic, Particles) SELECT accounts.id, ?, ?, ?, ?, ?, ? FROM accounts WHERE uuid=?"); stmt.setString(1, data.getTheme()); stmt.setDouble(2, data.getPoints()); stmt.setInt(3, data.getPlace()); stmt.setLong(4, data.getDateStamp()); stmt.setBytes(5, data.getSchematicBytes()); - stmt.setString(6, data.getUUID().toString()); - - return stmt.executeUpdate() > 0; - } - catch(SQLException e) - { - throw new RuntimeException(e); - } - }); - } - - public CompletableFuture> getAll(UUID uuid) - { - return CompletableFuture.supplyAsync(() -> - { - try (Connection conn = DBPool.getAccount().getConnection()) - { - PreparedStatement stmt = conn.prepareStatement("SELECT BuildTheme, Votes, Place, Date, Schematic FROM " + TABLE + " WHERE accountId = (SELECT id FROM accounts WHERE uuid=?)"); - stmt.setString(1, uuid.toString()); - - ResultSet set = stmt.executeQuery(); - List list = new ArrayList<>(); - while (set.next()) - { - String theme = set.getString(1); - int votes = set.getInt(2); - int place = set.getInt(3); - long dateStamp = set.getLong(4); - byte[] schematic = set.getBytes(5); - list.add(new MavericksBuildWrapper(uuid, theme, votes, place, dateStamp, schematic)); - } - return list; - } - catch (SQLException e) - { - throw new RuntimeException(e); - } - }); - } - - public CompletableFuture> getToReview(boolean onlyUnreviewed, int limit, int offset) - { - return CompletableFuture.supplyAsync(() -> - { - try (Connection conn = DBPool.getAccount().getConnection()) - { - String filter = onlyUnreviewed ? "WHERE Reviewed=0 " : ""; - PreparedStatement stmt = conn.prepareStatement("SELECT (SELECT uuid FROM accounts WHERE accounts.id=" + TABLE + ".accountId),BuildTheme,Points,Place,Date,Schematic FROM " + TABLE + " " + filter + " ORDER BY Points LIMIT " + limit + " OFFSET " + offset); - - ResultSet set = stmt.executeQuery(); - List list = new ArrayList<>(); - while (set.next()) - { - UUID uuid = UUID.fromString(set.getString(1)); - String theme = set.getString(2); - int votes = set.getInt(3); - int place = set.getInt(4); - long dateStamp = set.getLong(5); - byte[] schematic = set.getBytes(6); - list.add(new MavericksBuildWrapper(uuid, theme, votes, place, dateStamp, schematic)); - } - return list; - } - catch (SQLException e) - { - throw new RuntimeException(e); - } - }); - } - - public CompletableFuture setReviewed(long dateStamp, boolean reviewed) - { - return CompletableFuture.supplyAsync(() -> - { - try (Connection conn = DBPool.getAccount().getConnection()) - { - - PreparedStatement stmt = conn.prepareStatement("UPDATE " + TABLE + " SET Reviewed=? WHERE Date=?"); - stmt.setInt(1, reviewed? 1 : 0); - stmt.setLong(2, dateStamp); + stmt.setBytes(6, data.getParticlesRaw()); + stmt.setString(7, data.getUUID().toString()); return stmt.executeUpdate() > 0; } catch(SQLException e) { + e.printStackTrace(); throw new RuntimeException(e); } }); diff --git a/Plugins/mavericks-review-hub/plugin.yml b/Plugins/mavericks-review-hub/plugin.yml new file mode 100644 index 000000000..ce83dbc12 --- /dev/null +++ b/Plugins/mavericks-review-hub/plugin.yml @@ -0,0 +1,3 @@ +name: Mavericks-Review-Hub +main: mineplex.mavericks.review.Hub +version: 0.1 \ No newline at end of file diff --git a/Plugins/mavericks-review-hub/pom.xml b/Plugins/mavericks-review-hub/pom.xml new file mode 100644 index 000000000..65404db99 --- /dev/null +++ b/Plugins/mavericks-review-hub/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + + + com.mineplex + mineplex-plugin + dev-SNAPSHOT + ../plugin.xml + + + mavericks-review-hub + mavericks-review-hub + + + + ${project.groupId} + mineplex-minecraft-game-classcombat + ${project.version} + + + diff --git a/Plugins/mavericks-review-hub/src/mineplex/mavericks/review/Hub.java b/Plugins/mavericks-review-hub/src/mineplex/mavericks/review/Hub.java new file mode 100644 index 000000000..21ef3de75 --- /dev/null +++ b/Plugins/mavericks-review-hub/src/mineplex/mavericks/review/Hub.java @@ -0,0 +1,145 @@ +package mineplex.mavericks.review; + +import org.bukkit.Bukkit; +import org.bukkit.plugin.java.JavaPlugin; + +import mineplex.core.CustomTagFix; +import mineplex.core.FoodDupeFix; +import mineplex.core.PacketsInteractionFix; +import mineplex.core.account.CoreClientManager; +import mineplex.core.achievement.AchievementManager; +import mineplex.core.antihack.AntiHack; +import mineplex.core.blockrestore.BlockRestore; +import mineplex.core.chat.Chat; +import mineplex.core.command.CommandCenter; +import mineplex.core.cosmetic.CosmeticManager; +import mineplex.core.creature.Creature; +import mineplex.core.disguise.DisguiseManager; +import mineplex.core.donation.DonationManager; +import mineplex.core.elo.EloManager; +import mineplex.core.friend.FriendManager; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.give.Give; +import mineplex.core.hologram.HologramManager; +import mineplex.core.ignore.IgnoreManager; +import mineplex.core.incognito.IncognitoManager; +import mineplex.core.inventory.InventoryManager; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.memory.MemoryFix; +import mineplex.core.message.MessageManager; +import mineplex.core.monitor.LagMeter; +import mineplex.core.mount.MountManager; +import mineplex.core.packethandler.PacketHandler; +import mineplex.core.pet.PetManager; +import mineplex.core.portal.Portal; +import mineplex.core.preferences.PreferencesManager; +import mineplex.core.profileCache.ProfileCacheManager; +import mineplex.core.projectile.ProjectileManager; +import mineplex.core.punish.Punish; +import mineplex.core.recharge.Recharge; +import mineplex.core.stats.StatsManager; +import mineplex.core.status.ServerStatusManager; +import mineplex.core.updater.FileUpdater; +import mineplex.core.updater.Updater; +import mineplex.core.velocity.VelocityFix; +import mineplex.core.visibility.VisibilityManager; +import nautilus.game.arcade.game.games.buildmavericks.repository.MavericksApprovedRepository; +import nautilus.game.arcade.game.games.buildmavericks.repository.MavericksBuildRepository; +import net.minecraft.server.v1_8_R3.MinecraftServer; + +public class Hub extends JavaPlugin +{ + + private String WEB_CONFIG = "webServer"; + + // Modules + private CoreClientManager _clientManager; + private DonationManager _donationManager; + + @Override + public void onEnable() + { + Bukkit.setSpawnRadius(0); + // Delete Old Games Folders + + // Configs + getConfig().addDefault(WEB_CONFIG, "http://accounts.mineplex.com/"); + getConfig().set(WEB_CONFIG, getConfig().getString(WEB_CONFIG)); + saveConfig(); + + String webServerAddress = getConfig().getString(WEB_CONFIG); + + // Static Modules + CommandCenter.Initialize(this); + _clientManager = new CoreClientManager(this, webServerAddress); + CommandCenter.Instance.setClientManager(_clientManager); + + ItemStackFactory.Initialize(this, false); + Recharge.Initialize(this); + VisibilityManager.Initialize(this); + Give.Initialize(this); + + // Velocity Fix + new VelocityFix(this); + + _donationManager = new DonationManager(this, _clientManager, webServerAddress); + + PacketHandler packetHandler = new PacketHandler(this); + + IncognitoManager incognito = new IncognitoManager(this, _clientManager, packetHandler); + PreferencesManager preferenceManager = new PreferencesManager(this, incognito, _clientManager, _donationManager); + + incognito.setPreferencesManager(preferenceManager); + + Creature creature = new Creature(this); + ServerStatusManager serverStatusManager = new ServerStatusManager(this, _clientManager, new LagMeter(this, _clientManager)); + Portal portal = new Portal(this, _clientManager, serverStatusManager.getCurrentServerName()); + new FileUpdater(this, portal, serverStatusManager.getCurrentServerName(), serverStatusManager.getRegion()); + + DisguiseManager disguiseManager = new DisguiseManager(this, packetHandler); + + Punish punish = new Punish(this, webServerAddress, _clientManager); + AntiHack.Initialize(this, punish, portal, preferenceManager, _clientManager); + AntiHack.Instance.setKick(false); + + IgnoreManager ignoreManager = new IgnoreManager(this, _clientManager, preferenceManager, portal); + StatsManager statsManager = new StatsManager(this, _clientManager); + EloManager eloManager = new EloManager(this, _clientManager); + AchievementManager achievementManager = new AchievementManager(statsManager, _clientManager, _donationManager, incognito, eloManager); + FriendManager friendManager = new FriendManager(this, _clientManager, preferenceManager, portal); + Chat chat = new Chat(this, incognito, _clientManager, preferenceManager, achievementManager, serverStatusManager.getCurrentServerName()); + new MessageManager(this, incognito, _clientManager, preferenceManager, ignoreManager, punish, friendManager, chat); + + BlockRestore blockRestore = new BlockRestore(this); + + ProjectileManager projectileManager = new ProjectileManager(this); + HologramManager hologramManager = new HologramManager(this, packetHandler); + + // Inventory + InventoryManager inventoryManager = new InventoryManager(this, _clientManager); + PetManager petManager = new PetManager(this, _clientManager, _donationManager, inventoryManager, disguiseManager, creature, blockRestore, + webServerAddress); + MountManager mountManager = new MountManager(this, _clientManager, _donationManager, blockRestore, disguiseManager); + GadgetManager gadgetManager = new GadgetManager(this, _clientManager, _donationManager, inventoryManager, mountManager, petManager, + preferenceManager, disguiseManager, blockRestore, projectileManager, achievementManager, packetHandler, hologramManager); + CosmeticManager cosmeticManager = new CosmeticManager(this, _clientManager, _donationManager, inventoryManager, gadgetManager, + mountManager, petManager, null); + cosmeticManager.setInterfaceSlot(7); + cosmeticManager.disableTeamArmor(); + + new MemoryFix(this); + new CustomTagFix(this, packetHandler); + new PacketsInteractionFix(this, packetHandler); + new FoodDupeFix(this); + + new MavericksReviewManager(this, new MavericksBuildRepository(), new MavericksApprovedRepository()); + + new ProfileCacheManager(this); + + // Updates + getServer().getScheduler().scheduleSyncRepeatingTask(this, new Updater(this), 1, 1); + + MinecraftServer.getServer().getPropertyManager().setProperty("debug", true); + } + +} diff --git a/Plugins/mavericks-review-hub/src/mineplex/mavericks/review/MavericksReviewManager.java b/Plugins/mavericks-review-hub/src/mineplex/mavericks/review/MavericksReviewManager.java new file mode 100644 index 000000000..421493559 --- /dev/null +++ b/Plugins/mavericks-review-hub/src/mineplex/mavericks/review/MavericksReviewManager.java @@ -0,0 +1,665 @@ +package mineplex.mavericks.review; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Consumer; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; +import org.bukkit.entity.Entity; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockPhysicsEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.FoodLevelChangeEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCreativeEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerGameModeChangeEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.weather.WeatherChangeEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import mineplex.core.MiniPlugin; +import mineplex.core.common.block.schematic.Schematic; +import mineplex.core.common.block.schematic.SchematicData; +import mineplex.core.common.util.BukkitFuture; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.common.util.worldgen.WorldGenCleanRoom; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import nautilus.game.arcade.ArcadeFormat; +import nautilus.game.arcade.game.games.buildmavericks.repository.MavericksApprovedRepository; +import nautilus.game.arcade.game.games.buildmavericks.repository.MavericksBuildRepository; +import nautilus.game.arcade.game.games.buildmavericks.repository.MavericksBuildWrapper; + +public class MavericksReviewManager extends MiniPlugin +{ + private MavericksBuildRepository _repoBuilds; + private MavericksApprovedRepository _repoApprove; + + private Map _reviewers = new HashMap<>(); + + private Location _spawn; + private World _world; + + private List _reviewQueue = new ArrayList<>(); + + private ItemStack _itemEnterReviewMode; + private ItemStack _itemExitReviewMode; + private ItemStack _itemNext; + private ItemStack _itemPrevious; + private ItemStack _itemApprove; + private ItemStack _itemDeny; + private ItemStack _itemFilter; + + public MavericksReviewManager(JavaPlugin plugin, MavericksBuildRepository repoBuilds, MavericksApprovedRepository repoApprove) + { + super("MavericksReviewManager", plugin); + + _repoBuilds = repoBuilds; + _repoApprove = repoApprove; + + _world = Bukkit.getWorlds().get(0); + _spawn = _world.getSpawnLocation().getBlock().getLocation(); + + //Apply Clean Room Generator to default world + ((CraftWorld)_world).getPopulators().addAll(new WorldGenCleanRoom().getDefaultPopulators(_world)); + _world.setGameRuleValue("keepInventory", "true"); + + + _itemEnterReviewMode = ItemStackFactory.Instance.CreateStack(Material.PAPER, (byte) 0, 1, C.cGreen + C.Bold + "Enter Review Mode"); + _itemExitReviewMode = ItemStackFactory.Instance.CreateStack(Material.COMPASS, (byte) 0, 1, C.cRed + C.Bold + "Exit Review Mode"); + _itemNext = ItemStackFactory.Instance.CreateStack(Material.ARROW, (byte) 0, 1, C.cGold + C.Bold + "Next Build"); + _itemPrevious = ItemStackFactory.Instance.CreateStack(Material.ARROW, (byte) 0, 1, C.cGold + C.Bold + "Previous Build"); + _itemApprove = ItemStackFactory.Instance.CreateStack(Material.STAINED_GLASS_PANE, (byte) 5, 1, C.cGreen + C.Bold + "Approve"); + _itemDeny = ItemStackFactory.Instance.CreateStack(Material.STAINED_GLASS_PANE, (byte) 14, 1, C.cRed + C.Bold + "Deny"); + _itemFilter = ItemStackFactory.Instance.CreateStack(Material.HOPPER, (byte) 0, 1, C.cGold + C.Bold + "Filter Settings"); + } + + + private boolean isActionItem(ItemStack item) + { + if(_itemApprove.equals(item)) return true; + if(_itemDeny.equals(item)) return true; + if(_itemEnterReviewMode.equals(item)) return true; + if(_itemExitReviewMode.equals(item)) return true; + if(_itemFilter.equals(item)) return true; + if(_itemNext.equals(item)) return true; + if(_itemPrevious.equals(item)) return true; + + return false; + } + + @EventHandler + public void onGameMode(PlayerGameModeChangeEvent event) + { + boolean flying = event.getPlayer().isFlying(); + new BukkitRunnable() + { + public void run() + { + event.getPlayer().setAllowFlight(true); + event.getPlayer().setFlying(flying); + } + }.runTask(UtilServer.getPlugin()); + } + + @EventHandler + public void onPhysics(BlockPhysicsEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void onPickup(PlayerPickupItemEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void onDamage(EntityDamageEvent event) + { + if(event.getCause() == DamageCause.VOID) return; + if(event.getCause() == DamageCause.CUSTOM) return; + if(event.getCause() == DamageCause.SUICIDE) return; + + event.setCancelled(true); + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) + { + event.getPlayer().getInventory().removeItem(_itemApprove, _itemDeny, _itemExitReviewMode, _itemFilter, _itemNext, _itemPrevious); + + event.getPlayer().getInventory().setItem(0, _itemEnterReviewMode); + event.getPlayer().setGameMode(GameMode.ADVENTURE); + } + + @EventHandler + public void onHunger(FoodLevelChangeEvent event) + { + event.setFoodLevel(20); + } + + @EventHandler + public void onWeather(WeatherChangeEvent event) + { + if(event.getWorld().getName().equals(_spawn.getWorld().getName())) + { + if(event.toWeatherState()) event.setCancelled(true); + } + } + + @EventHandler + public void onInventoryClick(InventoryClickEvent event) + { + if(isActionItem(event.getCurrentItem()) || isActionItem(event.getCursor())) event.setCancelled(true); + } + + @EventHandler + public void onCreativeInventoryClick(InventoryCreativeEvent event) + { + if(isActionItem(event.getCurrentItem()) || isActionItem(event.getCursor())) event.setCancelled(true); + } + + @EventHandler + public void onDrop(PlayerDropItemEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void onInteract(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + + if(isActionItem(event.getItem())) + { + event.setCancelled(true); + } + else + { + return; + } + + if(event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) return; + + String name = event.getItem().getItemMeta().getDisplayName(); + + if(!Recharge.Instance.use(player, "MavericksReviewManager Action - " + name, 500, false, false)) return; + + if(event.getItem().equals(_itemEnterReviewMode)) + { + if(isInReviewMode(player)) + { + player.sendMessage(F.main(getName(), "You are already in " + F.item("review mode"))); + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0); + return; + } + + ReviewData data = new ReviewData(player, getAvalibleLocation()); + + for(int i = 0; i < 9; i++) + { + player.getInventory().setItem(i, null); + } + + player.getInventory().setItem(0, _itemPrevious); + player.getInventory().setItem(1, _itemNext); + player.getInventory().setItem(3, _itemApprove); + player.getInventory().setItem(4, _itemDeny); + player.getInventory().setItem(6, _itemFilter); + player.getInventory().setItem(8, _itemExitReviewMode); + + _reviewers.put(player, data); + pasteBuild(player, true); + } + else if(event.getItem().equals(_itemExitReviewMode)) + { + if(!isInReviewMode(player)) + { + player.sendMessage(F.main(getName(), "You are not currently in " + F.item("review mode"))); + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0); + return; + } + + for(int i = 0; i < 9; i++) + { + player.getInventory().setItem(i, null); + } + player.getInventory().setItem(0, _itemEnterReviewMode); + + _reviewers.remove(player); + player.teleport(_spawn); + } + + else if(!isInReviewMode(player)) + { + player.sendMessage(F.main(getName(), "Invalid action!")); + player.sendMessage(F.main(getName(), "You are not currently in " + F.item("review mode"))); + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0); + return; + } + else if(event.getItem().equals(_itemApprove)) + { + ReviewData reviewData = _reviewers.get(player); + MavericksBuildWrapper data = reviewData.getData(); + if(data == null) + { + player.sendMessage(F.main(getName(), "Invalid action!")); + player.sendMessage(F.main(getName(), "You are currently not reviewing a build.")); + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0); + return; + } + + if(data.isReviewed()) + { + player.sendMessage(F.main(getName(), "This build has already been reviewed!")); + player.sendMessage(F.main(getName(), "Contact the tech wizards if you want to change the")); + player.sendMessage(F.main(getName(), "state of the already reviewed build.")); + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0); + return; + } + + _repoApprove.add(data, player.getUniqueId()).thenCompose(BukkitFuture.accept((success) -> + { + if(success) + { + player.sendMessage(F.main(getName(), "Marked build as " + F.color("approved", C.cGreen) + ".")); + player.playSound(player.getLocation(), Sound.NOTE_PLING, 1, 0); + + + _repoBuilds.setReviewed(_reviewers.get(player).getData().getBuildId(), true).thenCompose(BukkitFuture.accept((success2) -> + { + if(success2) + { + data.setReviewed(true); + player.sendMessage(F.main(getName(), "Marked build as " + F.item("processed") + ".")); + player.playSound(player.getLocation(), Sound.NOTE_PLING, 1, 0); + player.sendMessage(F.main(getName(), "Loading next build...")); + pasteBuild(player, true); + } + else + { + player.sendMessage(F.main(getName(), "Unable to mark the build as " + F.color("denied", C.cRed) + "!")); + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0); + } + })); + + } + else + { + player.sendMessage(F.main(getName(), "Unable to mark the build as " + F.color("denied", C.cRed) + "!")); + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0); + } + })); + } + else if(event.getItem().equals(_itemDeny)) + { + MavericksBuildWrapper data = _reviewers.get(player).getData(); + if(data == null) + { + player.sendMessage(F.main(getName(), "Invalid action!")); + player.sendMessage(F.main(getName(), "You are currently not reviewing a build.")); + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0); + return; + } + + if(data.isReviewed()) + { + player.sendMessage(F.main(getName(), "This build has already been reviewed!")); + player.sendMessage(F.main(getName(), "Contact the tech wizards if you want to change the")); + player.sendMessage(F.main(getName(), "state of the already reviewed build.")); + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0); + return; + } + + _repoBuilds.setReviewed(_reviewers.get(player).getData().getBuildId(), true).thenCompose(BukkitFuture.accept((success) -> + { + if(success) + { + player.sendMessage(F.main(getName(), "Marked build as " + F.color("denied", C.cRed) + ".")); + player.playSound(player.getLocation(), Sound.NOTE_PLING, 1, 0); + player.sendMessage(F.main(getName(), "Loading next build...")); + pasteBuild(player, true); + } + else + { + player.sendMessage(F.main(getName(), "Unable to mark the build as " + F.color("denied", C.cRed) + "!")); + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0); + } + })); + } + else if(event.getItem().equals(_itemFilter)) + { + player.sendMessage(F.main(getName(), "Not yet implemented.")); + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0); + } + else if(event.getItem().equals(_itemNext)) + { + pasteBuild(player, true); + } + else if(event.getItem().equals(_itemPrevious)) + { + pasteBuild(player, false); + } + } + + public void pasteBuild(Player player, boolean next) + { + ReviewData review = _reviewers.get(player); + if(review == null) + { + player.sendMessage(F.main(getName(), "Invalid action!")); + player.sendMessage(F.main(getName(), "You are not currently in " + F.item("review mode"))); + return; + } + + MavericksBuildWrapper data = null; + if(next) + { + data = review.getNext(); + } + else + { + data = review.getPrevious(); + } + if(!next && data == null) + { + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0.5f); + player.sendMessage(F.main(getName(), "No more previous build")); + return; + } + if(next && data == null) + { + player.sendMessage(F.main(getName(), "Pulling new data, please wait...")); + getNext((pulledData) -> + { + if(pulledData == null) + { + player.sendMessage(F.main(getName(), "No new data was found.")); + player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0); + } + else + { + Bukkit.broadcastMessage("Displaying from DB -2"); + try { + display(player, review, pulledData); + } catch(Exception e) + { + e.printStackTrace(); + } + } + }); + } + if(data != null) + { + Bukkit.broadcastMessage("Displaying fast"); + display(player, review, data); + } + } + + private void display(Player player, ReviewData review, MavericksBuildWrapper data) + { + Location loc = review.getLoc(); + Location paste = loc.clone().add(8, -8, 0); + loc.setDirection(paste.clone().subtract(loc).toVector()); + + Bukkit.broadcastMessage("Trying to parse from " + data.getDateStamp()); + Bukkit.broadcastMessage("SBytes: " + data.getSchematicBytes().length + ", Schematic: " + data.getSchematic()); + Schematic schematic = data.getSchematic(); + paste.subtract(0, 0, schematic.getLength()/2); + + //Clear old blocks for stuff like lava and so on. + for(Block b : UtilBlock.getInBoundingBox(paste, paste.clone().add(32, 26, 32))) + { + UtilBlock.setQuick(_world, b.getX(), b.getY(), b.getZ(), 0, (byte) 0); + } + + List list = review.getEntitiesInArea(); + for(Entity e : list) + { + e.remove(); + } + Bukkit.broadcastMessage("Cleared " + list.size() + " entities in area"); + + SchematicData pasteData = schematic.paste(paste, false, false); + + for(Entity e : pasteData.getEntities()) + { + if(e instanceof Item) + { + //Don't despawn + e.setTicksLived(32768); + } + else + { + UtilEnt.Vegetate(e, true); + UtilEnt.ghost(e, true, false); + } + } + + Location a = paste.clone().add(-1, -1, -1); + Location b = paste.clone().add(schematic.getWidth(), -1, schematic.getLength()+1); + + //Display mode, floor and edge + for(Block block : UtilBlock.getInBoundingBox(a, b, false)) + { + UtilBlock.setQuick(_world, block.getX(), block.getY(), block.getZ(), 95, (byte) 1); + } + for(Block block : UtilBlock.getInBoundingBox(a, b, false, true, true, false)) + { + UtilBlock.setQuick(_world, block.getX(), block.getY()+1, block.getZ(), 95, (byte) 0); + } + + /* + * Alternative display mode, everything inside a box + b.add(0, schematic.getHeight()+2, 0); + for(Block block : UtilBlock.getInBoundingBox(a, b, false, true, false, false)) + { + UtilBlock.setQuick(_world, block.getX(), block.getY(), block.getZ(), 95, (byte) 0); + } + */ + + player.sendMessage(ArcadeFormat.Line); + + String key = C.cGreen + C.Bold; + String value = C.cYellow + C.Bold; + SimpleDateFormat dformat = new SimpleDateFormat("LL-MM-DD kk:mm:ss z"); + + player.sendMessage(key + "BuildId: " + value + data.getBuildId()); + player.sendMessage(key + "Creator: " + value + data.getUUID()); + player.sendMessage(key + "Last C Name: " + value + (data.hasNameSet() ? data.getName() : C.Italics + "Not Avalible")); + player.sendMessage(key + "Word: " + value + data.getTheme()); + player.sendMessage(key + "Place: " + value + data.getPlace()); + player.sendMessage(key + "Points: " + value + data.getPoints()); + player.sendMessage(key + "Date: " + value + dformat.format(new Date(data.getDateStamp()))); + player.sendMessage(key + "Reviewed: " + value + data.isReviewed()); + + player.sendMessage(ArcadeFormat.Line); + + player.setVelocity(new Vector(0,0,0)); + player.setAllowFlight(true); + player.setFlying(true); + player.teleport(loc); + + review.setData(data); + } + + + @EventHandler + public void onUpdateParticles(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) return; + + for(ReviewData data : _reviewers.values()) + { + if(data.getData() == null) continue; + + if(!data.getData().hasParticles()) continue; + + for(Entry e : data.getData().getParticles().entrySet()) + { + Location loc = data.getAreaMin().add(2, 0, 2).add(e.getKey()); + + ParticleType type = e.getValue(); + + int amount = 8; + + if (type == ParticleType.HUGE_EXPLOSION || + type == ParticleType.LARGE_EXPLODE || + type == ParticleType.NOTE) + amount = 1; + + UtilParticle.PlayParticleToAll(type, loc, 0.4f, 0.4f, 0.4f, 0, amount, ViewDist.LONG); + } + } + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) + { + ReviewData data = _reviewers.get(event.getPlayer()); + if(data != null) + { + for(Entity e : data.getEntitiesInArea()) e.remove(); + + for(Block b : UtilBlock.getInBoundingBox(data.getAreaMin(), data.getAreaMax())) + { + UtilBlock.setQuick(_world, b.getX(), b.getY(), b.getZ(), 0, (byte) 0); + } + } + exitReviewMode(event.getPlayer()); + } + + public boolean isInReviewMode(Player player) + { + return _reviewers.containsKey(player); + } + + public void enterReviewMode(Player player) + { + if(isInReviewMode(player)) return; + } + + public void exitReviewMode(Player player) + { + if(!isInReviewMode(player)) return; + + _reviewers.remove(player); + } + + public Location getAvalibleLocation() + { + for(int i = 0; i < 500; i++) + { + Location loc = _spawn.clone().add(100*i, 0, 0); + loc.setY(200); + if(isTaken(loc)) continue; + return loc; + } + return null; + } + + private boolean isTaken(Location loc) + { + for(ReviewData data : _reviewers.values()) + { + if(data.getData() == null) continue; + if(data.getLoc().equals(loc)) return true; + } + return false; + } + + private boolean isTaken(MavericksBuildWrapper wrapper) + { + if(wrapper.isReviewed()) return true; + for(ReviewData data : _reviewers.values()) + { + if(data.containsData(wrapper)) return true; +// if(data.getData() == null) continue; +// if(data.getData().equals(wrapper)) return true; + } + return false; + } + + public void getNext(Consumer consumer) + { + pullQueue(getNextIndex(), consumer); + } + + public int getNextIndex() + { + for(int i = 0; i < _reviewQueue.size(); i++) + { + MavericksBuildWrapper wrapper = _reviewQueue.get(i); + if(isTaken(wrapper)) continue; + if(wrapper.isReviewed()) continue; + if(wrapper.getSchematic() == null) continue; + Bukkit.broadcastMessage("Found avalible index: " + i); + return i; + } + Bukkit.broadcastMessage("Found no avalible indexes, returning next one: " + _reviewQueue.size()); + return _reviewQueue.size(); + } + + public void pullQueue(int index, Consumer consumer) + { + if(_reviewQueue.size() > index) + { + consumer.accept(_reviewQueue.get(index)); + Bukkit.broadcastMessage("Local queue is bigger then index"); + return; + } + + Bukkit.broadcastMessage("Pulling from DB, limit: " + (index-_reviewQueue.size()+1) + ", offset " + _reviewQueue.size()); + _repoBuilds.getToReview(true, index-_reviewQueue.size()+1, _reviewQueue.size()).thenCompose(BukkitFuture.accept((list) -> + { + Bukkit.broadcastMessage("Retrived " + list.size() + " entries from DB"); + _reviewQueue.addAll(list); + if(_reviewQueue.size() > index) + { + Bukkit.broadcastMessage("Found new entry to process!"); + consumer.accept(_reviewQueue.get(index)); + } + else + { + Bukkit.broadcastMessage("Still not enough though"); + consumer.accept(null); + } + })); + } + + +} diff --git a/Plugins/mavericks-review-hub/src/mineplex/mavericks/review/ReviewData.java b/Plugins/mavericks-review-hub/src/mineplex/mavericks/review/ReviewData.java new file mode 100644 index 000000000..196af8443 --- /dev/null +++ b/Plugins/mavericks-review-hub/src/mineplex/mavericks/review/ReviewData.java @@ -0,0 +1,103 @@ +package mineplex.mavericks.review; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +import nautilus.game.arcade.game.games.buildmavericks.repository.MavericksBuildWrapper; + +public class ReviewData +{ + private Player _player; + private MavericksBuildWrapper _data; + private List _logg = new ArrayList<>(); + private Location _loc; + + public ReviewData(Player player, Location loc) + { + _player = player; + _loc = loc.getBlock().getLocation().add(0.5, 0, 0.5); + } + + public Player getPlayer() + { + return _player; + } + + public Location getLoc() + { + return _loc.clone(); + } + + public MavericksBuildWrapper getData() + { + return _data; + } + + public void setData(MavericksBuildWrapper data) + { + if(!_logg.contains(_data)) + { + _logg.add(_data); + } + if(!_logg.contains(data)) + { + _logg.add(data); + } + _data = data; + } + + public MavericksBuildWrapper getPrevious() + { + int index = _logg.indexOf(_data); + + if(index <= 0) return null; + + return _logg.get(index-1); + } + + public MavericksBuildWrapper getNext() + { + int index = _logg.indexOf(_data); + + if(index == -1) return null; + if(index+1 >= _logg.size()) return null; + + return _logg.get(index+1); + } + + public boolean containsData(MavericksBuildWrapper data) + { + return _logg.contains(data); + } + + public Location getAreaMin() + { + return _loc.clone().add(8-2, -8, 0-16-2); + } + + public Location getAreaMax() + { + return _loc.clone().add(8+32+2, -8+25+1, 0-16+32+2); + } + + public List getEntitiesInArea() + { + List list = new ArrayList<>(); + for(Entity e : _loc.getWorld().getEntities()) + { + if(e instanceof Player) continue; + if(isInsideArea(e.getLocation())) list.add(e); + } + return list; + } + + public boolean isInsideArea(Location loc) + { + return loc.toVector().isInAABB(getAreaMin().toVector(), getAreaMax().toVector()); + } + +} diff --git a/Plugins/mavericks-review-hub/src/nautilus/game/arcade/ArcadeFormat.java b/Plugins/mavericks-review-hub/src/nautilus/game/arcade/ArcadeFormat.java new file mode 100644 index 000000000..3d817a2fa --- /dev/null +++ b/Plugins/mavericks-review-hub/src/nautilus/game/arcade/ArcadeFormat.java @@ -0,0 +1,8 @@ +package nautilus.game.arcade; + +import mineplex.core.common.util.C; + +public class ArcadeFormat +{ + public static String Line = C.cDGreen + C.Strike + "============================================="; +} diff --git a/Plugins/mavericks-review-hub/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksApprovedRepository.java b/Plugins/mavericks-review-hub/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksApprovedRepository.java new file mode 100644 index 000000000..b3816f1ba --- /dev/null +++ b/Plugins/mavericks-review-hub/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksApprovedRepository.java @@ -0,0 +1,119 @@ +package nautilus.game.arcade.game.games.buildmavericks.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +import mineplex.serverdata.database.DBPool; + +/** + * Repository for Mavericks-MasterBuilders SQL game data + * - + * Table to back this repository may be created with + * CREATE TABLE mavericksMasterBuildersApproved ( + buildId INT NOT NULL AUTO_INCREMENT, + ApproveDate INT NOT NULL, + ApprovedBy VARCHAR(36) NOT NULL DEFAULT '', + Display TINYINT(1) NOT NULL DEFAULT '1', + PRIMARY KEY (buildId), + CONSTRAINT account_id FOREIGN KEY (ApprovedBy) REFERENCES accounts (id) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT build_id FOREIGN KEY (BuildId) REFERENCES mavericksMasterBuildersBuilds (BuildId) ON DELETE NO ACTION ON UPDATE NO ACTION +) + */ +public class MavericksApprovedRepository +{ + + private static final String TABLE = "mavericksMasterBuildersApproved"; + + public CompletableFuture add(MavericksBuildWrapper data, UUID approvedBy) + { + return add(data, approvedBy, true); + } + + public CompletableFuture add(MavericksBuildWrapper data, UUID approvedBy, boolean display) + { + return CompletableFuture.supplyAsync(() -> + { + try (Connection conn = DBPool.getAccount().getConnection()) + { + PreparedStatement stmt = conn.prepareStatement("REPLACE INTO " + TABLE + " (BuildId, ApprovedBy, Display) SELECT ?, accounts.id, ? FROM accounts WHERE uuid=?"); + stmt.setLong(1, data.getBuildId()); + stmt.setBoolean(2, display); + stmt.setString(3, approvedBy.toString()); + + return stmt.executeUpdate() > 0; + } + catch(SQLException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + }); + } + + public CompletableFuture> getToDisplay(boolean onlyDisplay, int limit, int offset) + { + return CompletableFuture.supplyAsync(() -> + { + try (Connection conn = DBPool.getAccount().getConnection()) + { + String filter = onlyDisplay ? "WHERE Display=1 " : ""; + PreparedStatement stmt = conn.prepareStatement("SELECT BuildId," + + "(SELECT uuid from accounts WHERE accounts.id=" + TABLE + ".accountId)," + + "(SELECT name from accounts WHERE accounts.id=" + TABLE + ".accountId)," + + ",BuildTheme,Points,Place,Date,Schematic,Reviewed FROM " + TABLE + " " + filter + + " LIMIT " + limit + " OFFSET " + offset); + + ResultSet set = stmt.executeQuery(); + List list = new ArrayList<>(); + while (set.next()) + { + long buildId = set.getLong(1); + UUID uuid = UUID.fromString(set.getString(2)); + String lastName = set.getString(3); + String theme = set.getString(4); + int votes = set.getInt(5); + int place = set.getInt(6); + long dateStamp = set.getLong(7); + byte[] schematic = set.getBytes(8); + byte[] particles = set.getBytes(9); + boolean reviewed = set.getBoolean(10); + list.add(new MavericksBuildWrapper(buildId, uuid, lastName, theme, votes, place, dateStamp, schematic, particles, reviewed)); + } + return list; + } + catch (SQLException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + }); + } + + public CompletableFuture setDisplay(long buildid, boolean display) + { + return CompletableFuture.supplyAsync(() -> + { + try (Connection conn = DBPool.getAccount().getConnection()) + { + + PreparedStatement stmt = conn.prepareStatement("UPDATE " + TABLE + " SET Display=? WHERE BuildId=?"); + stmt.setBoolean(1, display); + stmt.setLong(2, buildid); + + return stmt.executeUpdate() > 0; + } + catch(SQLException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + }); + } + +} diff --git a/Plugins/mavericks-review-hub/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksBuildRepository.java b/Plugins/mavericks-review-hub/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksBuildRepository.java new file mode 100644 index 000000000..b0b07b356 --- /dev/null +++ b/Plugins/mavericks-review-hub/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksBuildRepository.java @@ -0,0 +1,95 @@ +package nautilus.game.arcade.game.games.buildmavericks.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +import mineplex.serverdata.database.DBPool; + +/** + * Repository for Mavericks-MasterBuilders SQL game data + * - + * Table to back this repository may be created with + * CREATE TABLE IF NOT EXISTS mavericksMasterBuildersBuilds ( + accountId INT NOT NULL, + BuildTheme VARCHAR(255) NOT NULL, + Points DOUBLE NOT NULL, + Place INT NOT NULL, + Date BIGINT NOT NULL, + Schematic BLOB, + Reviewed TINYINT, + PRIMARY KEY (accountId,Date), + FOREIGN KEY (accountId) REFERENCES accounts(id) ON DELETE NO ACTION ON UPDATE NO ACTION + ); + */ +public class MavericksBuildRepository +{ + + private static final String TABLE = "mavericksMasterBuildersBuilds"; + + public CompletableFuture> getToReview(boolean onlyUnreviewed, int limit, int offset) + { + return CompletableFuture.supplyAsync(() -> + { + try (Connection conn = DBPool.getAccount().getConnection()) + { + String filter = onlyUnreviewed ? "WHERE Reviewed=0 " : ""; + PreparedStatement stmt = conn.prepareStatement("SELECT BuildId," + + "(SELECT uuid from accounts WHERE accounts.id=" + TABLE + ".accountId)," + + "(SELECT name from accounts WHERE accounts.id=" + TABLE + ".accountId)," + + "BuildTheme,Points,Place,Date,Schematic,Particles,Reviewed FROM " + TABLE + " " + filter + + " ORDER BY Points DESC LIMIT " + limit + " OFFSET " + offset); + + ResultSet set = stmt.executeQuery(); + List list = new ArrayList<>(); + while (set.next()) + { + long buildId = set.getLong(1); + UUID uuid = UUID.fromString(set.getString(2)); + String lastName = set.getString(3); + String theme = set.getString(4); + int votes = set.getInt(5); + int place = set.getInt(6); + long dateStamp = set.getLong(7); + byte[] schematic = set.getBytes(8); + byte[] particles = set.getBytes(9); + boolean reviewed = set.getBoolean(10); + list.add(new MavericksBuildWrapper(buildId, uuid, lastName, theme, votes, place, dateStamp, schematic, particles, reviewed)); + } + return list; + } + catch (SQLException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + }); + } + + public CompletableFuture setReviewed(long buildId, boolean reviewed) + { + return CompletableFuture.supplyAsync(() -> + { + try (Connection conn = DBPool.getAccount().getConnection()) + { + + PreparedStatement stmt = conn.prepareStatement("UPDATE " + TABLE + " SET Reviewed=? WHERE BuildId=?"); + stmt.setBoolean(1, reviewed); + stmt.setLong(2, buildId); + + return stmt.executeUpdate() > 0; + } + catch(SQLException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + }); + } + +} diff --git a/Plugins/mavericks-review-hub/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksBuildWrapper.java b/Plugins/mavericks-review-hub/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksBuildWrapper.java new file mode 100644 index 000000000..16dd8de06 --- /dev/null +++ b/Plugins/mavericks-review-hub/src/nautilus/game/arcade/game/games/buildmavericks/repository/MavericksBuildWrapper.java @@ -0,0 +1,170 @@ +package nautilus.game.arcade.game.games.buildmavericks.repository; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; + +import org.bukkit.util.Vector; + +import com.java.sk89q.jnbt.CompoundTag; +import com.java.sk89q.jnbt.NBTUtils; +import com.java.sk89q.jnbt.Tag; + +import mineplex.core.common.block.schematic.Schematic; +import mineplex.core.common.block.schematic.UtilSchematic; +import mineplex.core.common.util.UtilParticle.ParticleType; + +/** + * A simple wrapper class for Mavericks-MasterBuilders SQL data + */ +public class MavericksBuildWrapper +{ + private final long _buildId; + private final UUID _uuid; + private final String _theme; + private final double _points; + private final int _place; + private final long _dateStamp; + private final byte[] _schematic; + private final byte[] _particles; + private boolean _reviewed; + + private final String _name; + + + public MavericksBuildWrapper(long buildId, UUID uuid, String name, String theme, double points, int place, long dateStamp, + byte[] schematic, byte[] particles, boolean reviewed) + { + this._buildId = buildId; + this._uuid = uuid; + this._name = name; + this._theme = theme; + this._points = points; + this._place = place; + this._dateStamp = dateStamp; + this._schematic = schematic; + this._particles = particles; + this._reviewed = reviewed; + } + + public MavericksBuildWrapper(long buildId, UUID uuid, String theme, double points, int place, long dateStamp, + byte[] schematic, byte[] particles, boolean reviewed) + { + this(buildId, uuid, null, theme, points, place, dateStamp, schematic, particles, reviewed); + } + + public long getBuildId() + { + return _buildId; + } + + public UUID getUUID() + { + return _uuid; + } + + public String getName() + { + return _name; + } + + public boolean hasNameSet() + { + return _name != null; + } + + public String getTheme() + { + return _theme; + } + + public double getPoints() + { + return _points; + } + + public int getPlace() + { + return _place; + } + + public long getDateStamp() + { + return _dateStamp; + } + + public byte[] getSchematicBytes() + { + return _schematic; + } + + public boolean isReviewed() + { + return _reviewed; + } + + public void setReviewed(boolean reviewed) + { + _reviewed = reviewed; + } + + public Schematic getSchematic() + { + try + { + return UtilSchematic.loadSchematic(_schematic); + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + } + + public boolean hasParticles() + { + return _particles != null && _particles.length > 0; + } + + public byte[] getParticlesRaw() + { + return _particles; + } + + public Map getParticles() + { + Map map = new HashMap<>(); + if(!hasParticles()) return map; + + try + { + CompoundTag tag = (CompoundTag) NBTUtils.getFromBytesCompressed(_particles).getTag(); + for(Entry e : tag.getValue().entrySet()) + { + CompoundTag parent = (CompoundTag) e.getValue(); + + Vector v = NBTUtils.getVector(parent); + ParticleType particle = ParticleType.valueOf(parent.getString("particle")); + + while(map.containsKey(v)) v.add(new Vector(0.00000001, 0, 0)); + map.put(v, particle); + + } + } + catch (Exception e) + { + e.printStackTrace(); + } + + return map; + } + + @Override + public String toString() + { + return "MavericksBuildWrapper[uuid='" + _uuid + "',theme='" + _theme + "',points=" + _points + ",place=" + _place + + ",date=" + _dateStamp + ",Schematic=ByteArray[" + _schematic.length + "]]"; + } + +} diff --git a/Plugins/pom.xml b/Plugins/pom.xml index 0493d4300..18569d882 100644 --- a/Plugins/pom.xml +++ b/Plugins/pom.xml @@ -36,6 +36,8 @@ Mineplex.StaffServer Mineplex.Votifier Nautilus.Game.Arcade + + mavericks-review-hub