mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-11-04 11:13:45 +01:00 
			
		
		
		
	Fix single plot area NPEs & generator stackoverflow
This commit is contained in:
		@@ -22,7 +22,7 @@ import static com.github.intellectualsites.plotsquared.plot.util.ReflectionUtils
 | 
				
			|||||||
@SuppressWarnings("unused") public class SingleWorldListener implements Listener {
 | 
					@SuppressWarnings("unused") public class SingleWorldListener implements Listener {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private Method methodGetHandleChunk;
 | 
					    private Method methodGetHandleChunk;
 | 
				
			||||||
    private Field mustSave, done, lit, s;
 | 
					    private Field mustSave;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public SingleWorldListener(Plugin plugin) throws Exception {
 | 
					    public SingleWorldListener(Plugin plugin) throws Exception {
 | 
				
			||||||
        ReflectionUtils.RefClass classChunk = getRefClass("{nms}.Chunk");
 | 
					        ReflectionUtils.RefClass classChunk = getRefClass("{nms}.Chunk");
 | 
				
			||||||
@@ -30,9 +30,6 @@ import static com.github.intellectualsites.plotsquared.plot.util.ReflectionUtils
 | 
				
			|||||||
        this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
 | 
					        this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
 | 
				
			||||||
        this.mustSave = classChunk.getField("mustSave").getRealField();
 | 
					        this.mustSave = classChunk.getField("mustSave").getRealField();
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            this.done = classChunk.getField("done").getRealField();
 | 
					 | 
				
			||||||
            this.lit = classChunk.getField("lit").getRealField();
 | 
					 | 
				
			||||||
            this.s = classChunk.getField("s").getRealField();
 | 
					 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
            e.printStackTrace();
 | 
					            e.printStackTrace();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -42,18 +39,9 @@ import static com.github.intellectualsites.plotsquared.plot.util.ReflectionUtils
 | 
				
			|||||||
    public void markChunkAsClean(Chunk chunk) {
 | 
					    public void markChunkAsClean(Chunk chunk) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            Object nmsChunk = methodGetHandleChunk.invoke(chunk);
 | 
					            Object nmsChunk = methodGetHandleChunk.invoke(chunk);
 | 
				
			||||||
            if (done != null) {
 | 
					 | 
				
			||||||
                this.done.set(nmsChunk, true);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            if (mustSave != null) {
 | 
					            if (mustSave != null) {
 | 
				
			||||||
                this.mustSave.set(nmsChunk, false);
 | 
					                this.mustSave.set(nmsChunk, false);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (lit != null) {
 | 
					 | 
				
			||||||
                this.lit.set(nmsChunk, false);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            if (s != null) {
 | 
					 | 
				
			||||||
                this.s.set(nmsChunk, false);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } catch (Throwable e) {
 | 
					        } catch (Throwable e) {
 | 
				
			||||||
            e.printStackTrace();
 | 
					            e.printStackTrace();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,12 +33,24 @@ public class PlotId {
 | 
				
			|||||||
     * @throws IllegalArgumentException if the string does not contain a valid PlotId
 | 
					     * @throws IllegalArgumentException if the string does not contain a valid PlotId
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @Nonnull public static PlotId fromString(@Nonnull String string) {
 | 
					    @Nonnull public static PlotId fromString(@Nonnull String string) {
 | 
				
			||||||
 | 
					        PlotId plot = fromStringOrNull(string);
 | 
				
			||||||
 | 
					        if (plot == null) throw new IllegalArgumentException("Cannot create PlotID. String invalid.");
 | 
				
			||||||
 | 
					        return plot;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Nullable public static PlotId fromStringOrNull(@Nonnull String string) {
 | 
				
			||||||
        String[] parts = string.split("[;|,]");
 | 
					        String[] parts = string.split("[;|,]");
 | 
				
			||||||
        if (parts.length < 2) {
 | 
					        if (parts.length < 2) {
 | 
				
			||||||
            throw new IllegalArgumentException("Cannot create PlotID. String invalid.");
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        int x;
 | 
				
			||||||
 | 
					        int y;
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            x = Integer.parseInt(parts[0]);
 | 
				
			||||||
 | 
					            y = Integer.parseInt(parts[1]);
 | 
				
			||||||
 | 
					        } catch (NumberFormatException ignored) {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        int x = Integer.parseInt(parts[0]);
 | 
					 | 
				
			||||||
        int y = Integer.parseInt(parts[1]);
 | 
					 | 
				
			||||||
        return new PlotId(x, y);
 | 
					        return new PlotId(x, y);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					package com.github.intellectualsites.plotsquared.plot.object.worlds;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.github.intellectualsites.plotsquared.plot.object.Location;
 | 
				
			||||||
 | 
					import com.github.intellectualsites.plotsquared.plot.object.PlotArea;
 | 
				
			||||||
 | 
					import com.github.intellectualsites.plotsquared.plot.object.RegionWrapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class DelegatePlotAreaManager implements PlotAreaManager {
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public PlotArea getApplicablePlotArea(Location location) {
 | 
				
			||||||
 | 
					        return parent.getApplicablePlotArea(location);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public PlotArea getPlotArea(Location location) {
 | 
				
			||||||
 | 
					        return parent.getPlotArea(location);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public PlotArea getPlotArea(String world, String id) {
 | 
				
			||||||
 | 
					        return parent.getPlotArea(world, id);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public PlotArea[] getPlotAreas(String world, RegionWrapper region) {
 | 
				
			||||||
 | 
					        return parent.getPlotAreas(world, region);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public PlotArea[] getAllPlotAreas() {
 | 
				
			||||||
 | 
					        return parent.getAllPlotAreas();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public String[] getAllWorlds() {
 | 
				
			||||||
 | 
					        return parent.getAllWorlds();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void addPlotArea(PlotArea area) {
 | 
				
			||||||
 | 
					        parent.addPlotArea(area);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void removePlotArea(PlotArea area) {
 | 
				
			||||||
 | 
					        parent.removePlotArea(area);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void addWorld(String worldName) {
 | 
				
			||||||
 | 
					        parent.addWorld(worldName);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void removeWorld(String worldName) {
 | 
				
			||||||
 | 
					        parent.removeWorld(worldName);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final PlotAreaManager parent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public DelegatePlotAreaManager(PlotAreaManager parent) {
 | 
				
			||||||
 | 
					        this.parent = parent;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -63,24 +63,24 @@ public class SinglePlotArea extends GridPlotWorld {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Nullable @Override public Plot getOwnedPlot(@Nonnull final Location location) {
 | 
					    @Nullable @Override public Plot getOwnedPlot(@Nonnull final Location location) {
 | 
				
			||||||
        PlotId pid = PlotId.fromString(location.getWorld());
 | 
					        PlotId pid = PlotId.fromStringOrNull(location.getWorld());
 | 
				
			||||||
        Plot plot = this.plots.get(pid);
 | 
					        Plot plot = pid == null ? null : this.plots.get(pid);
 | 
				
			||||||
        return plot == null ? null : plot.getBasePlot(false);
 | 
					        return plot == null ? null : plot.getBasePlot(false);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Nullable @Override public Plot getOwnedPlotAbs(@Nonnull Location location) {
 | 
					    @Nullable @Override public Plot getOwnedPlotAbs(@Nonnull Location location) {
 | 
				
			||||||
        PlotId pid = PlotId.fromString(location.getWorld());
 | 
					        PlotId pid = PlotId.fromStringOrNull(location.getWorld());
 | 
				
			||||||
        return plots.get(pid);
 | 
					        return pid == null ? null : plots.get(pid);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Nullable @Override public Plot getPlot(@Nonnull final Location location) {
 | 
					    @Nullable @Override public Plot getPlot(@Nonnull final Location location) {
 | 
				
			||||||
        PlotId pid = PlotId.fromString(location.getWorld());
 | 
					        PlotId pid = PlotId.fromStringOrNull(location.getWorld());
 | 
				
			||||||
        return getPlot(pid);
 | 
					        return pid == null ? null : getPlot(pid);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Nullable @Override public Plot getPlotAbs(@Nonnull final Location location) {
 | 
					    @Nullable @Override public Plot getPlotAbs(@Nonnull final Location location) {
 | 
				
			||||||
        final PlotId pid = PlotId.fromString(location.getWorld());
 | 
					        final PlotId pid = PlotId.fromStringOrNull(location.getWorld());
 | 
				
			||||||
        return getPlotAbs(pid);
 | 
					        return pid == null ? null : getPlotAbs(pid);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public boolean addPlot(@Nonnull Plot plot) {
 | 
					    public boolean addPlot(@Nonnull Plot plot) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,11 +30,11 @@ public class SinglePlotAreaManager extends DefaultPlotAreaManager {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public boolean isWorld(String id) {
 | 
					    public boolean isWorld(String id) {
 | 
				
			||||||
        int mode = 0;
 | 
					 | 
				
			||||||
        char[] chars = id.toCharArray();
 | 
					        char[] chars = id.toCharArray();
 | 
				
			||||||
        if (chars.length == 1 && chars[0] == '*') {
 | 
					        if (chars.length == 1 && chars[0] == '*') {
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        int mode = 0;
 | 
				
			||||||
        for (int i = 0; i < chars.length; i++) {
 | 
					        for (int i = 0; i < chars.length; i++) {
 | 
				
			||||||
            char c = chars[i];
 | 
					            char c = chars[i];
 | 
				
			||||||
            switch (mode) {
 | 
					            switch (mode) {
 | 
				
			||||||
@@ -65,7 +65,7 @@ public class SinglePlotAreaManager extends DefaultPlotAreaManager {
 | 
				
			|||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return true;
 | 
					        return mode == 3;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override public PlotArea getApplicablePlotArea(Location location) {
 | 
					    @Override public PlotArea getApplicablePlotArea(Location location) {
 | 
				
			||||||
@@ -74,9 +74,9 @@ public class SinglePlotAreaManager extends DefaultPlotAreaManager {
 | 
				
			|||||||
            return found;
 | 
					            return found;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        String world = location.getWorld();
 | 
					        String world = location.getWorld();
 | 
				
			||||||
        return isWorld(world) || world.equals("*") || super.getAllPlotAreas().length == 0 ?
 | 
					        return isWorld(world) || world.equals("*") ?
 | 
				
			||||||
            area :
 | 
					            area :
 | 
				
			||||||
            null;
 | 
					            super.getApplicablePlotArea(location);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override public PlotArea getPlotArea(String world, String id) {
 | 
					    @Override public PlotArea getPlotArea(String world, String id) {
 | 
				
			||||||
@@ -84,7 +84,7 @@ public class SinglePlotAreaManager extends DefaultPlotAreaManager {
 | 
				
			|||||||
        if (found != null) {
 | 
					        if (found != null) {
 | 
				
			||||||
            return found;
 | 
					            return found;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return isWorld(world) || world.equals("*") ? area : null;
 | 
					        return isWorld(world) || world.equals("*") ? area : super.getPlotArea(world, id);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override public PlotArea getPlotArea(Location location) {
 | 
					    @Override public PlotArea getPlotArea(Location location) {
 | 
				
			||||||
@@ -100,7 +100,7 @@ public class SinglePlotAreaManager extends DefaultPlotAreaManager {
 | 
				
			|||||||
        if (found != null && found.length != 0) {
 | 
					        if (found != null && found.length != 0) {
 | 
				
			||||||
            return found;
 | 
					            return found;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return isWorld(world) || world.equals("*") ? array : noPlotAreas;
 | 
					        return isWorld(world) || world.equals("*") ? array : all.length == 0 ? noPlotAreas : super.getPlotAreas(world, region);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override public PlotArea[] getAllPlotAreas() {
 | 
					    @Override public PlotArea[] getAllPlotAreas() {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user