Greenhouses/src/main/java/world/bentobox/greenhouses/managers/GreenhouseMap.java

162 lines
5.0 KiB
Java
Raw Normal View History

2019-01-22 00:44:01 +01:00
package world.bentobox.greenhouses.managers;
import java.util.ArrayList;
import java.util.Collections;
2019-01-22 00:44:01 +01:00
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.bukkit.Location;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.greenhouses.Greenhouses;
import world.bentobox.greenhouses.data.Greenhouse;
2019-01-22 02:53:34 +01:00
import world.bentobox.greenhouses.managers.GreenhouseManager.GreenhouseResult;
2019-01-22 00:44:01 +01:00
public class GreenhouseMap {
2019-01-26 17:38:13 +01:00
private final Greenhouses addon;
private final Map<Island, List<Greenhouse>> greenhouses = new HashMap<>();
2019-01-22 00:44:01 +01:00
/**
* @param addon - addon
*/
public GreenhouseMap(Greenhouses addon) {
this.addon = addon;
}
/**
* Try to add a greenhouse
* @param greenhouse - greenhouse object
2019-01-22 02:53:34 +01:00
* @return result {@link GreenhouseResult}
2019-01-22 00:44:01 +01:00
*/
2019-01-22 02:53:34 +01:00
public GreenhouseResult addGreenhouse(Greenhouse greenhouse) {
2020-11-16 00:02:13 +01:00
// Validation checks
2021-08-02 01:17:12 +02:00
if (greenhouse.getBiomeRecipe().getBiome() == null) {
2020-11-16 00:02:13 +01:00
return GreenhouseResult.FAIL_UNKNOWN_RECIPE;
}
if (greenhouse.getWorld() == null) {
return GreenhouseResult.FAIL_NO_WORLD;
}
2019-01-22 00:44:01 +01:00
if (greenhouse.getLocation() == null) {
2019-01-22 02:53:34 +01:00
return GreenhouseResult.NULL;
2019-01-22 00:44:01 +01:00
}
return addon.getIslands().getIslandAt(greenhouse.getLocation()).map(i -> {
greenhouses.putIfAbsent(i, new ArrayList<>());
// Check if overlapping
if (!isOverlapping(greenhouse)) {
greenhouses.get(i).add(greenhouse);
2019-01-22 02:53:34 +01:00
return GreenhouseResult.SUCCESS;
2019-01-22 00:44:01 +01:00
} else {
2019-01-22 02:53:34 +01:00
return GreenhouseResult.FAIL_OVERLAPPING;
2019-01-22 00:44:01 +01:00
}
2019-01-22 02:53:34 +01:00
}).orElse(GreenhouseResult.FAIL_NO_ISLAND);
2019-01-22 00:44:01 +01:00
}
2019-07-08 00:45:47 +02:00
/**
* Clear the greenhouse map
*/
public void clear() {
greenhouses.clear();
}
2019-01-22 00:44:01 +01:00
/**
* Try to get greenhouse at location
* @param location - location
* @return Optional greenhouse or empty
*/
public Optional<Greenhouse> getGreenhouse(Location location) {
return getXZGreenhouse(location).filter(g -> location.getBlockY() <= g.getCeilingHeight() && location.getBlockY() >= g.getFloorHeight());
}
private Optional<Greenhouse> getXZGreenhouse(Location location) {
2019-01-22 02:53:34 +01:00
return addon.getIslands().getIslandAt(location)
2019-01-26 17:38:13 +01:00
.filter(greenhouses::containsKey).flatMap(i -> greenhouses.get(i).stream().filter(g -> g.contains(location)).findFirst());
2019-01-22 00:44:01 +01:00
}
/**
* Check if location is inside a greenhouse
* @param location - location
* @return true if inside a greenhouse
*/
public boolean inGreenhouse(Location location) {
return getGreenhouse(location).isPresent();
}
/**
* Check if a location is in a specific greenhouse
* @param gh - greenhouse
* @param location - location to check
* @return true if inside
*/
public boolean inGreenhouse(Greenhouse gh, Location location) {
return getGreenhouse(location).map(gh::equals).orElse(false);
}
2019-01-22 00:44:01 +01:00
/**
* Check if location is above a greenhouse
* @param location - location
* @return true if above a known greenhouse
*/
public boolean isAboveGreenhouse(Location location) {
return getXZGreenhouse(location).map(g -> location.getBlockY() > g.getCeilingHeight()).orElse(false);
}
private boolean isOverlapping(Greenhouse greenhouse) {
2021-08-02 01:17:12 +02:00
return greenhouse.getLocation() != null && addon.getIslands().getIslandAt(greenhouse.getLocation()).map(i -> {
2019-01-22 00:44:01 +01:00
greenhouses.putIfAbsent(i, new ArrayList<>());
return greenhouses.get(i).stream().anyMatch(g ->
g.getLocation().getWorld().equals(greenhouse.getLocation().getWorld()) &&
g.getBoundingBox().overlaps(greenhouse.getBoundingBox()));
2019-01-22 00:44:01 +01:00
}).orElse(false);
}
/**
* Removes the greenhouse from the map
* @param greenhouse - greenhouse
*/
2019-07-08 00:45:47 +02:00
protected void removeGreenhouse(Greenhouse greenhouse) {
2021-08-02 01:17:12 +02:00
if (greenhouse.getLocation() != null) {
addon.getIslands().getIslandAt(greenhouse.getLocation()).ifPresent(i -> {
if (greenhouses.containsKey(i)) greenhouses.get(i).remove(greenhouse);
});
}
2019-01-22 00:44:01 +01:00
}
/**
2021-08-01 08:10:07 +02:00
* @param island island
*/
public void removeGreenhouses(Island island) {
greenhouses.remove(island);
}
2019-01-22 00:44:01 +01:00
/**
* @return a list of all the Greenhouses
*/
public List<Greenhouse> getGreenhouses() {
return greenhouses.values().stream().flatMap(List::stream).collect(Collectors.toList());
}
/**
* Get all greenhouses on island
* @param island - island
* @return list of islands or empty list
*/
public List<Greenhouse> getGreenhouses(Island island) {
return greenhouses.getOrDefault(island, Collections.emptyList());
}
/**
* @return number of greenhouses loaded
*/
public int getSize() {
return greenhouses.values().stream().mapToInt(List::size).sum();
}
2019-01-22 00:44:01 +01:00
}