Null checks.
This commit is contained in:
parent
0b9019fbfa
commit
818f6fc925
|
@ -1,5 +1,6 @@
|
||||||
package world.bentobox.greenhouses.data;
|
package world.bentobox.greenhouses.data;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
@ -158,7 +159,11 @@ public class Greenhouse implements DataObject {
|
||||||
* @param v the roofHopperLocation to set
|
* @param v the roofHopperLocation to set
|
||||||
*/
|
*/
|
||||||
public void setRoofHopperLocation(@Nullable Vector v) {
|
public void setRoofHopperLocation(@Nullable Vector v) {
|
||||||
this.roofHopperLocation = v == null ? null : v.toLocation(getWorld());
|
if (v == null || getWorld() == null) {
|
||||||
|
this.roofHopperLocation = null;
|
||||||
|
} else {
|
||||||
|
this.roofHopperLocation = v.toLocation(getWorld());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -206,7 +211,7 @@ public class Greenhouse implements DataObject {
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public World getWorld() {
|
public World getWorld() {
|
||||||
return this.getLocation().getWorld();
|
return this.getLocation() == null ? null : this.getLocation().getWorld();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -246,9 +251,9 @@ public class Greenhouse implements DataObject {
|
||||||
/**
|
/**
|
||||||
* @return the missingBlocks
|
* @return the missingBlocks
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@NonNull
|
||||||
public Map<Material, Integer> getMissingBlocks() {
|
public Map<Material, Integer> getMissingBlocks() {
|
||||||
return missingBlocks;
|
return Objects.requireNonNullElseGet(missingBlocks, () -> new HashMap<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -108,7 +108,15 @@ public class GreenhouseEvents implements Listener {
|
||||||
handleTransition(User.getInstance(e.getPlayer()), e.getTo(), e.getFrom());
|
handleTransition(User.getInstance(e.getPlayer()), e.getTo(), e.getFrom());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param user user
|
||||||
|
* @param toLoc to location
|
||||||
|
* @param fromLoc from location
|
||||||
|
*/
|
||||||
private void handleTransition(User user, Location toLoc, Location fromLoc) {
|
private void handleTransition(User user, Location toLoc, Location fromLoc) {
|
||||||
|
if (user == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
Optional<Greenhouse> to = addon.getManager().getMap().getGreenhouse(toLoc);
|
Optional<Greenhouse> to = addon.getManager().getMap().getGreenhouse(toLoc);
|
||||||
Optional<Greenhouse> from = addon.getManager().getMap().getGreenhouse(fromLoc);
|
Optional<Greenhouse> from = addon.getManager().getMap().getGreenhouse(fromLoc);
|
||||||
if (to.isEmpty() && from.isEmpty()) {
|
if (to.isEmpty() && from.isEmpty()) {
|
||||||
|
|
|
@ -41,7 +41,15 @@ public class SnowTracker implements Listener {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param gh - greenhouse
|
||||||
|
* @return true if snow was create, false if not.
|
||||||
|
*/
|
||||||
private boolean getAirBlocks(Greenhouse gh) {
|
private boolean getAirBlocks(Greenhouse gh) {
|
||||||
|
if (gh.getLocation() == null) {
|
||||||
|
// Greenhouse does not have a location for some reason.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
boolean createdSnow = false;
|
boolean createdSnow = false;
|
||||||
List<Block> waterBlocks = new ArrayList<>();
|
List<Block> waterBlocks = new ArrayList<>();
|
||||||
for (int x = (int)gh.getBoundingBox().getMinX() + 1; x < (int)gh.getBoundingBox().getMaxX() -1; x++) {
|
for (int x = (int)gh.getBoundingBox().getMinX() + 1; x < (int)gh.getBoundingBox().getMaxX() -1; x++) {
|
||||||
|
@ -108,7 +116,7 @@ public class SnowTracker implements Listener {
|
||||||
|
|
||||||
private void removeWaterBucketAndShake(Greenhouse g) {
|
private void removeWaterBucketAndShake(Greenhouse g) {
|
||||||
// Scatter snow
|
// Scatter snow
|
||||||
if (getAirBlocks(g)) {
|
if (getAirBlocks(g) && g.getRoofHopperLocation() != null) {
|
||||||
Hopper h = ((Hopper)g.getRoofHopperLocation().getBlock().getState());
|
Hopper h = ((Hopper)g.getRoofHopperLocation().getBlock().getState());
|
||||||
h.getInventory().removeItem(new ItemStack(Material.WATER_BUCKET));
|
h.getInventory().removeItem(new ItemStack(Material.WATER_BUCKET));
|
||||||
h.getInventory().addItem(new ItemStack(Material.BUCKET));
|
h.getInventory().addItem(new ItemStack(Material.BUCKET));
|
||||||
|
|
|
@ -85,7 +85,10 @@ public class EcoSystemManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void convertBlocks(Greenhouse gh) {
|
private void convertBlocks(Greenhouse gh) {
|
||||||
if(!gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMaxX()) >> 4, ((int) gh.getBoundingBox().getMaxZ()) >> 4) || !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMinX()) >> 4, ((int) gh.getBoundingBox().getMinZ()) >> 4)){
|
World world = gh.getWorld();
|
||||||
|
if(world == null || gh.getLocation() == null || gh.getLocation().getWorld() == null
|
||||||
|
|| !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMaxX()) >> 4, ((int) gh.getBoundingBox().getMaxZ()) >> 4)
|
||||||
|
|| !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMinX()) >> 4, ((int) gh.getBoundingBox().getMinZ()) >> 4)){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +98,6 @@ public class EcoSystemManager {
|
||||||
int gh_max_y = NumberConversions.floor(gh.getInternalBoundingBox().getMaxY());
|
int gh_max_y = NumberConversions.floor(gh.getInternalBoundingBox().getMaxY());
|
||||||
int gh_min_z = NumberConversions.floor(gh.getInternalBoundingBox().getMinZ());
|
int gh_min_z = NumberConversions.floor(gh.getInternalBoundingBox().getMinZ());
|
||||||
int gh_max_z = NumberConversions.floor(gh.getInternalBoundingBox().getMaxZ());
|
int gh_max_z = NumberConversions.floor(gh.getInternalBoundingBox().getMaxZ());
|
||||||
World world = gh.getWorld();
|
|
||||||
BiomeRecipe biomeRecipe = gh.getBiomeRecipe();
|
BiomeRecipe biomeRecipe = gh.getBiomeRecipe();
|
||||||
|
|
||||||
for (int x = gh_min_x; x < gh_max_x; x++) {
|
for (int x = gh_min_x; x < gh_max_x; x++) {
|
||||||
|
@ -112,8 +114,10 @@ public class EcoSystemManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void verify(Greenhouse gh) {
|
private void verify(Greenhouse gh) {
|
||||||
if(!gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMaxX()) >> 4, ((int) gh.getBoundingBox().getMaxZ()) >> 4) || !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMinX()) >> 4, ((int) gh.getBoundingBox().getMinZ()) >> 4)){
|
if(gh.getLocation() == null || gh.getLocation().getWorld() == null
|
||||||
//addon.log("Skipping verify for unloaded greenhouse at " + gh.getLocation());
|
|| !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMaxX()) >> 4, ((int) gh.getBoundingBox().getMaxZ()) >> 4)
|
||||||
|
|| !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMinX()) >> 4, ((int) gh.getBoundingBox().getMinZ()) >> 4)){
|
||||||
|
// Skipping verify for unloaded greenhouse
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
gh.getBiomeRecipe().checkRecipe(gh).thenAccept(rs -> {
|
gh.getBiomeRecipe().checkRecipe(gh).thenAccept(rs -> {
|
||||||
|
@ -126,8 +130,9 @@ public class EcoSystemManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addMobs(Greenhouse gh) {
|
private void addMobs(Greenhouse gh) {
|
||||||
if(!gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMaxX()) >> 4, ((int) gh.getBoundingBox().getMaxZ()) >> 4) || !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMinX()) >> 4, ((int) gh.getBoundingBox().getMinZ()) >> 4)){
|
if(gh.getLocation() == null || gh.getLocation().getWorld() == null || gh.getWorld() == null
|
||||||
//addon.log("Skipping addmobs for unloaded greenhouse at " + gh.getLocation());
|
|| !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMaxX()) >> 4, ((int) gh.getBoundingBox().getMaxZ()) >> 4) || !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMinX()) >> 4, ((int) gh.getBoundingBox().getMinZ()) >> 4)){
|
||||||
|
// Skipping addmobs for unloaded greenhouse
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (gh.getBiomeRecipe().noMobs()) {
|
if (gh.getBiomeRecipe().noMobs()) {
|
||||||
|
@ -166,8 +171,9 @@ public class EcoSystemManager {
|
||||||
* @param gh - greenhouse
|
* @param gh - greenhouse
|
||||||
*/
|
*/
|
||||||
private void growPlants(Greenhouse gh) {
|
private void growPlants(Greenhouse gh) {
|
||||||
if(!gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMaxX()) >> 4, ((int) gh.getBoundingBox().getMaxZ()) >> 4) || !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMinX()) >> 4, ((int) gh.getBoundingBox().getMinZ()) >> 4)){
|
if (gh.getLocation() == null || gh.getLocation().getWorld() == null
|
||||||
//addon.log("Skipping growplants for unloaded greenhouse at " + gh.getLocation());
|
|| !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMaxX()) >> 4, ((int) gh.getBoundingBox().getMaxZ()) >> 4) || !gh.getLocation().getWorld().isChunkLoaded(((int) gh.getBoundingBox().getMinX()) >> 4, ((int) gh.getBoundingBox().getMinZ()) >> 4)){
|
||||||
|
//Skipping growplants for unloaded greenhouse
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int bonemeal = getBoneMeal(gh);
|
int bonemeal = getBoneMeal(gh);
|
||||||
|
@ -207,6 +213,7 @@ public class EcoSystemManager {
|
||||||
*/
|
*/
|
||||||
public List<Block> getAvailableBlocks(Greenhouse gh, boolean ignoreLiquid) {
|
public List<Block> getAvailableBlocks(Greenhouse gh, boolean ignoreLiquid) {
|
||||||
List<Block> result = new ArrayList<>();
|
List<Block> result = new ArrayList<>();
|
||||||
|
if (gh.getWorld() == null) return result;
|
||||||
for (double x = gh.getInternalBoundingBox().getMinX(); x < gh.getInternalBoundingBox().getMaxX(); x++) {
|
for (double x = gh.getInternalBoundingBox().getMinX(); x < gh.getInternalBoundingBox().getMaxX(); x++) {
|
||||||
for (double z = gh.getInternalBoundingBox().getMinZ(); z < gh.getInternalBoundingBox().getMaxZ(); z++) {
|
for (double z = gh.getInternalBoundingBox().getMinZ(); z < gh.getInternalBoundingBox().getMaxZ(); z++) {
|
||||||
for (double y = gh.getInternalBoundingBox().getMaxY() - 1; y >= gh.getBoundingBox().getMinY(); y--) {
|
for (double y = gh.getInternalBoundingBox().getMaxY() - 1; y >= gh.getBoundingBox().getMinY(); y--) {
|
||||||
|
@ -234,12 +241,14 @@ public class EcoSystemManager {
|
||||||
.mapToInt(ItemStack::getAmount).sum();
|
.mapToInt(ItemStack::getAmount).sum();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the hopper
|
||||||
|
* @param gh greenhouse
|
||||||
|
* @return hopper block or null if it does not exist
|
||||||
|
*/
|
||||||
private Hopper getHopper(Greenhouse gh) {
|
private Hopper getHopper(Greenhouse gh) {
|
||||||
if (gh.getRoofHopperLocation() == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
// Check if the hopper block is still a hopper
|
// Check if the hopper block is still a hopper
|
||||||
if (gh.getRoofHopperLocation().getBlock().getType() != Material.HOPPER) {
|
if (gh.getRoofHopperLocation() == null || !gh.getRoofHopperLocation().getBlock().getType().equals(Material.HOPPER)) {
|
||||||
gh.setRoofHopperLocation(null);
|
gh.setRoofHopperLocation(null);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,6 +139,14 @@ public class GreenhouseManager implements Listener {
|
||||||
public void removeGreenhouse(Greenhouse g) {
|
public void removeGreenhouse(Greenhouse g) {
|
||||||
handler.deleteObject(g);
|
handler.deleteObject(g);
|
||||||
map.removeGreenhouse(g);
|
map.removeGreenhouse(g);
|
||||||
|
if (g.getOriginalBiome() == null) {
|
||||||
|
addon.logError("Greenhouse had no original biome: " + g.getLocation());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (g.getLocation() == null || g.getLocation().getWorld() == null) {
|
||||||
|
// Greenhouse is messed up. It's being deleted anyway.
|
||||||
|
return;
|
||||||
|
}
|
||||||
addon.log("Returning biome to original state: " + g.getOriginalBiome().toString());
|
addon.log("Returning biome to original state: " + g.getOriginalBiome().toString());
|
||||||
for (int x = (int)g.getBoundingBox().getMinX(); x<= (int)g.getBoundingBox().getMaxX(); x+=4) {
|
for (int x = (int)g.getBoundingBox().getMinX(); x<= (int)g.getBoundingBox().getMaxX(); x+=4) {
|
||||||
for (int z = (int)g.getBoundingBox().getMinZ(); z<= (int)g.getBoundingBox().getMaxZ(); z+=4) {
|
for (int z = (int)g.getBoundingBox().getMinZ(); z<= (int)g.getBoundingBox().getMaxZ(); z+=4) {
|
||||||
|
|
|
@ -34,7 +34,7 @@ public class GreenhouseMap {
|
||||||
*/
|
*/
|
||||||
public GreenhouseResult addGreenhouse(Greenhouse greenhouse) {
|
public GreenhouseResult addGreenhouse(Greenhouse greenhouse) {
|
||||||
// Validation checks
|
// Validation checks
|
||||||
if (greenhouse.getBiomeRecipe() == null) {
|
if (greenhouse.getBiomeRecipe().getBiome() == null) {
|
||||||
return GreenhouseResult.FAIL_UNKNOWN_RECIPE;
|
return GreenhouseResult.FAIL_UNKNOWN_RECIPE;
|
||||||
}
|
}
|
||||||
if (greenhouse.getWorld() == null) {
|
if (greenhouse.getWorld() == null) {
|
||||||
|
@ -105,7 +105,7 @@ public class GreenhouseMap {
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isOverlapping(Greenhouse greenhouse) {
|
private boolean isOverlapping(Greenhouse greenhouse) {
|
||||||
return addon.getIslands().getIslandAt(greenhouse.getLocation()).map(i -> {
|
return greenhouse.getLocation() != null && addon.getIslands().getIslandAt(greenhouse.getLocation()).map(i -> {
|
||||||
greenhouses.putIfAbsent(i, new ArrayList<>());
|
greenhouses.putIfAbsent(i, new ArrayList<>());
|
||||||
return greenhouses.get(i).stream().anyMatch(g -> g.getBoundingBox().overlaps(greenhouse.getBoundingBox()));
|
return greenhouses.get(i).stream().anyMatch(g -> g.getBoundingBox().overlaps(greenhouse.getBoundingBox()));
|
||||||
}).orElse(false);
|
}).orElse(false);
|
||||||
|
@ -117,9 +117,11 @@ public class GreenhouseMap {
|
||||||
* @param greenhouse - greenhouse
|
* @param greenhouse - greenhouse
|
||||||
*/
|
*/
|
||||||
protected void removeGreenhouse(Greenhouse greenhouse) {
|
protected void removeGreenhouse(Greenhouse greenhouse) {
|
||||||
addon.getIslands().getIslandAt(greenhouse.getLocation()).ifPresent(i -> {
|
if (greenhouse.getLocation() != null) {
|
||||||
if (greenhouses.containsKey(i)) greenhouses.get(i).remove(greenhouse);
|
addon.getIslands().getIslandAt(greenhouse.getLocation()).ifPresent(i -> {
|
||||||
});
|
if (greenhouses.containsKey(i)) greenhouses.get(i).remove(greenhouse);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -43,6 +43,10 @@ public class PanelClick implements ClickHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean makeGreenhouse(User user, BiomeRecipe br) {
|
private boolean makeGreenhouse(User user, BiomeRecipe br) {
|
||||||
|
if (user.getLocation() == null) {
|
||||||
|
addon.logError("User has no location : " + user.getName());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
// Check flag
|
// Check flag
|
||||||
if (!addon.getIslands().getIslandAt(user.getLocation()).map(i -> i.isAllowed(user, Greenhouses.GREENHOUSES)).orElse(false)) {
|
if (!addon.getIslands().getIslandAt(user.getLocation()).map(i -> i.isAllowed(user, Greenhouses.GREENHOUSES)).orElse(false)) {
|
||||||
user.sendMessage("greenhouses.errors.no-rank");
|
user.sendMessage("greenhouses.errors.no-rank");
|
||||||
|
|
|
@ -92,6 +92,10 @@ class MakeCommand extends CompositeCommand {
|
||||||
* @return true if successful
|
* @return true if successful
|
||||||
*/
|
*/
|
||||||
private boolean makeGreenhouse(User user, BiomeRecipe br) {
|
private boolean makeGreenhouse(User user, BiomeRecipe br) {
|
||||||
|
if (user.getLocation() == null) {
|
||||||
|
getAddon().logError("User had no location");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
// Check flag
|
// Check flag
|
||||||
if (!getIslands().getIslandAt(user.getLocation()).map(i -> i.isAllowed(user, Greenhouses.GREENHOUSES)).orElse(false)) {
|
if (!getIslands().getIslandAt(user.getLocation()).map(i -> i.isAllowed(user, Greenhouses.GREENHOUSES)).orElse(false)) {
|
||||||
user.sendMessage("greenhouses.errors.no-rank");
|
user.sendMessage("greenhouses.errors.no-rank");
|
||||||
|
|
|
@ -35,6 +35,10 @@ class RemoveCommand extends CompositeCommand {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean execute(User user, String label, List<String> args) {
|
public boolean execute(User user, String label, List<String> args) {
|
||||||
|
if (user.getLocation() == null) {
|
||||||
|
getAddon().logError("User had no location");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
// Check flag
|
// Check flag
|
||||||
if (!getIslands().getIslandAt(user.getLocation()).map(i -> i.isAllowed(user, Greenhouses.GREENHOUSES)).orElse(false)) {
|
if (!getIslands().getIslandAt(user.getLocation()).map(i -> i.isAllowed(user, Greenhouses.GREENHOUSES)).orElse(false)) {
|
||||||
user.sendMessage("greenhouses.errors.no-rank");
|
user.sendMessage("greenhouses.errors.no-rank");
|
||||||
|
|
|
@ -2,6 +2,7 @@ package world.bentobox.greenhouses.world;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
|
@ -101,7 +102,7 @@ public class AsyncWorldCache {
|
||||||
int xx = x >= 0 ? x % 16 : (16 + (x % 16)) % 16;
|
int xx = x >= 0 ? x % 16 : (16 + (x % 16)) % 16;
|
||||||
int zz = z >= 0 ? z % 16 : (16 + (z % 16)) % 16;
|
int zz = z >= 0 ? z % 16 : (16 + (z % 16)) % 16;
|
||||||
try {
|
try {
|
||||||
return getSnap(x,z).getBlockType(xx, y, zz);
|
return Objects.requireNonNull(getSnap(x, z)).getBlockType(xx, y, zz);
|
||||||
} catch (InterruptedException | ExecutionException e) {
|
} catch (InterruptedException | ExecutionException e) {
|
||||||
Greenhouses.getInstance().logError("Chunk could not be obtained async! " + e);
|
Greenhouses.getInstance().logError("Chunk could not be obtained async! " + e);
|
||||||
// Restore interrupted state...
|
// Restore interrupted state...
|
||||||
|
|
|
@ -293,7 +293,7 @@ public class GreenhouseTest {
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testGetMissingBlocks() {
|
public void testGetMissingBlocks() {
|
||||||
assertNull(gh.getMissingBlocks());
|
assertNotNull(gh.getMissingBlocks());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue