package eu.univento.teamvento.utils; import com.mongodb.CursorType; import com.mongodb.client.FindIterable; import eu.univento.core.Core; import eu.univento.core.api.map.Cuboid; import eu.univento.core.api.player.CustomPlayer; import eu.univento.teamvento.TeamVento; import org.bson.Document; import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import java.util.*; import java.util.stream.Collectors; public class Plot { private Cuboid area; private UUID owner; private Location spawn; public Plot(Cuboid area, UUID owner, Location spawn) { this.area = area; this.owner = owner; this.spawn = spawn; } public boolean isInPlot(Location location) { return area.containsLocation(location); } public boolean isOwner(CustomPlayer p) { return p.getUniqueId().toString().equals(owner.toString()); } public Cuboid getArea() { return area; } public UUID getOwner() { return owner; } public Location getSpawn() { return spawn; } public void setBiome(Biome biome) { setInDatabase("biome", biome.name()); for(Block blocks : getArea()) blocks.setBiome(biome); for(Chunk chunk : Bukkit.getWorld("plots").getLoadedChunks()) Bukkit.getWorld("plots").refreshChunk(chunk.getX(), chunk.getZ()); for(LivingEntity entity : Bukkit.getWorld("plots").getLivingEntities()) entity.teleport(entity); } public Biome getBiome() { return Biome.valueOf(getStringFromDatabase("biome")); } public String getName() { return getStringFromDatabase("name"); } public void setName(String name) { setInDatabase("name", name); } public boolean hasName() { return !getName().equals(""); } public void setTime(Time time) { setInDatabase("time", time.name()); } public Time getTime() { return Time.valueOf(getStringFromDatabase("time")); } public void setWeather(Weather weather) { setInDatabase("weather", weather.name()); } public Weather getWeather() { return Weather.valueOf(getStringFromDatabase("weather")); } public void setContact(String contact) { setInDatabase("contact", contact); } public String getContact() { return getStringFromDatabase("contact"); } public boolean hasContact() { return !getContact().equals(""); } public void setResourcePack(ResourcePack pack) { setInDatabase("pack", pack.name()); } public ResourcePack getResourcePack() { return ResourcePack.valueOf(getStringFromDatabase("pack")); } public void addAnimal(Entity animal) { Map map = new HashMap<>(); map.put("type", animal.getType().name()); map.put("X", String.valueOf(animal.getLocation().getX())); map.put("Y", String.valueOf(animal.getLocation().getY())); map.put("Z", String.valueOf(animal.getLocation().getZ())); ArrayList> animals = (ArrayList>) getObjectFromDatbase("animals"); animals.add(map); setInDatabase("animals", animals); } public void removeAnimal(Entity animal) { Map animals = getAnimalsMap(); //ArrayList> animals = (ArrayList>) getObjectFromDatbase("animals"); if(animals.containsKey(animal.getLocation())) { Map map = new HashMap<>(); map.put("type", animal.getType().name()); map.put("X", String.valueOf(animal.getLocation().getX())); map.put("Y", String.valueOf(animal.getLocation().getY())); map.put("Z", String.valueOf(animal.getLocation().getZ())); ArrayList> list = (ArrayList>) getObjectFromDatbase("animals"); list.remove(map); setInDatabase("animals", list); } } public ArrayList getAnimals() { ArrayList animals = new ArrayList<>(); Map map = getAnimalsMap(); for(Map.Entry entry : map.entrySet()) animals.addAll(Bukkit.getWorld("plots").getLivingEntities().stream().filter(entity -> entity.getLocation().equals(entry.getKey())).collect(Collectors.toList())); return animals; } private Map getAnimalsMap() { Map map = new HashMap<>(); ArrayList> list = (ArrayList>) getObjectFromDatbase("animals"); assert list != null; for(Map stringlist : list) { double x = Double.parseDouble(stringlist.get("X")); double y = Double.parseDouble(stringlist.get("Y")); double z = Double.parseDouble(stringlist.get("Z")); Location loc = new Location(Bukkit.getWorld("plots"), x, y , z); map.put(loc, EntityType.valueOf(String.valueOf(stringlist.get("type")))); } return map; } public WeatherType getWeatherType() { if(getWeather() == Weather.THUNDER) return WeatherType.DOWNFALL; return WeatherType.valueOf(getWeather().name()); } private Map getMapFromDatabase(String name) { return (Map) getObjectFromDatbase(name); } private ArrayList getArrayListFromDatabase(String name) { return (ArrayList) getObjectFromDatbase(name); } private Object getObjectFromDatbase(String name) { FindIterable cursor = Core.getMongoDB().getDatabase().getCollection("plots").find(new Document("uuid", owner.toString())); cursor.cursorType(CursorType.NonTailable); Document doc = cursor.first(); if (doc == null) return null; return doc.get(name); } private String getStringFromDatabase(String name) { FindIterable cursor = Core.getMongoDB().getDatabase().getCollection("plots").find(new Document("uuid", owner.toString())); cursor.cursorType(CursorType.NonTailable); Document doc = cursor.first(); if (doc == null) return null; return doc.getString(name); } private void setInDatabase(String name, String obj) { Core.getMongoDB().getDatabase().getCollection("plots").updateOne(new Document("uuid", owner.toString()), new Document("$set", new Document(name, obj))); } private void setInDatabase(String name, ArrayList> obj) { Core.getMongoDB().getDatabase().getCollection("plots").updateOne(new Document("uuid", owner.toString()), new Document("$set", new Document(name, obj))); } }