mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-11-04 03:03:43 +01:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			fix/chunk-
			...
			fix/add-mi
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					c90e681aab | 
@@ -26,7 +26,6 @@ import com.plotsquared.core.plot.Plot;
 | 
			
		||||
import com.plotsquared.core.plot.PlotArea;
 | 
			
		||||
import com.plotsquared.core.plot.world.PlotAreaManager;
 | 
			
		||||
import com.plotsquared.core.plot.world.SinglePlotArea;
 | 
			
		||||
import com.plotsquared.core.util.ReflectionUtils;
 | 
			
		||||
import com.plotsquared.core.util.ReflectionUtils.RefClass;
 | 
			
		||||
import com.plotsquared.core.util.ReflectionUtils.RefField;
 | 
			
		||||
import com.plotsquared.core.util.ReflectionUtils.RefMethod;
 | 
			
		||||
@@ -65,11 +64,9 @@ public class ChunkListener implements Listener {
 | 
			
		||||
    private final PlotAreaManager plotAreaManager;
 | 
			
		||||
    private final int version;
 | 
			
		||||
 | 
			
		||||
    private RefMethod methodSetUnsaved;
 | 
			
		||||
    private RefMethod methodGetHandleChunk;
 | 
			
		||||
    private RefMethod methodGetHandleWorld;
 | 
			
		||||
    private RefField mustNotSave;
 | 
			
		||||
    private Object objChunkStatusFull = null;
 | 
			
		||||
    private RefField mustSave;
 | 
			
		||||
    /*
 | 
			
		||||
    private RefMethod methodGetFullChunk;
 | 
			
		||||
    private RefMethod methodGetBukkitChunk;
 | 
			
		||||
@@ -82,6 +79,7 @@ public class ChunkListener implements Listener {
 | 
			
		||||
    */
 | 
			
		||||
    private Chunk lastChunk;
 | 
			
		||||
    private boolean ignoreUnload = false;
 | 
			
		||||
    private boolean isTrueForNotSave = true;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    public ChunkListener(final @NonNull PlotAreaManager plotAreaManager) {
 | 
			
		||||
@@ -92,27 +90,22 @@ public class ChunkListener implements Listener {
 | 
			
		||||
        }
 | 
			
		||||
        try {
 | 
			
		||||
            RefClass classCraftWorld = getRefClass("{cb}.CraftWorld");
 | 
			
		||||
            this.methodGetHandleWorld = classCraftWorld.getMethod("getHandle");
 | 
			
		||||
            RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
 | 
			
		||||
            ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
 | 
			
		||||
            this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class);
 | 
			
		||||
            try {
 | 
			
		||||
            this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle");
 | 
			
		||||
            } catch (NoSuchMethodException ignored) {
 | 
			
		||||
                try {
 | 
			
		||||
                    RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus");
 | 
			
		||||
                    this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null);
 | 
			
		||||
                    this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass());
 | 
			
		||||
                } catch (NoSuchMethodException ex) {
 | 
			
		||||
                    throw new RuntimeException(ex);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            try {
 | 
			
		||||
                if (version < 17) {
 | 
			
		||||
                    RefClass classChunk = getRefClass("{nms}.Chunk");
 | 
			
		||||
                    this.mustNotSave = classChunk.getField("mustNotSave");
 | 
			
		||||
                    if (version == 13) {
 | 
			
		||||
                        this.mustSave = classChunk.getField("mustSave");
 | 
			
		||||
                        this.isTrueForNotSave = false;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        this.mustSave = classChunk.getField("mustNotSave");
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
 | 
			
		||||
                    this.mustNotSave = classChunk.getField("mustNotSave");
 | 
			
		||||
                    this.mustSave = classChunk.getField("mustNotSave");
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            } catch (NoSuchFieldException e) {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
@@ -174,13 +167,10 @@ public class ChunkListener implements Listener {
 | 
			
		||||
        if (safe && shouldSave(world, chunk.getX(), chunk.getZ())) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        Object c = objChunkStatusFull != null
 | 
			
		||||
                ? this.methodGetHandleChunk.of(chunk).call(objChunkStatusFull)
 | 
			
		||||
                : this.methodGetHandleChunk.of(chunk).call();
 | 
			
		||||
        RefField.RefExecutor field = this.mustNotSave.of(c);
 | 
			
		||||
        methodSetUnsaved.of(c).call(false);
 | 
			
		||||
        if (!((Boolean) field.get())) {
 | 
			
		||||
            field.set(true);
 | 
			
		||||
        Object c = this.methodGetHandleChunk.of(chunk).call();
 | 
			
		||||
        RefField.RefExecutor field = this.mustSave.of(c);
 | 
			
		||||
        if ((Boolean) field.get() != isTrueForNotSave) {
 | 
			
		||||
            field.set(isTrueForNotSave);
 | 
			
		||||
            if (chunk.isLoaded()) {
 | 
			
		||||
                ignoreUnload = true;
 | 
			
		||||
                chunk.unload(false);
 | 
			
		||||
 
 | 
			
		||||
@@ -152,7 +152,8 @@ public class EntityEventListener implements Listener {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
 | 
			
		||||
                    "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
 | 
			
		||||
                    "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL", "DEFAULT",
 | 
			
		||||
                    "DUPLICATION", "FROZEN", "SPELL" -> {
 | 
			
		||||
                if (!area.isMobSpawning()) {
 | 
			
		||||
                    event.setCancelled(true);
 | 
			
		||||
                    return;
 | 
			
		||||
 
 | 
			
		||||
@@ -1167,7 +1167,7 @@ public class PlayerEventListener implements Listener {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (type.isEdible()) {
 | 
			
		||||
                    //Allow all players to eat while also allowing the block place event to be fired
 | 
			
		||||
                    //Allow all players to eat while also allowing the block place event ot be fired
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (type == Material.ARMOR_STAND) {
 | 
			
		||||
 
 | 
			
		||||
@@ -31,39 +31,45 @@ import org.bukkit.event.Listener;
 | 
			
		||||
import org.bukkit.event.world.ChunkEvent;
 | 
			
		||||
import org.bukkit.event.world.ChunkLoadEvent;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
 | 
			
		||||
import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
 | 
			
		||||
 | 
			
		||||
public class SingleWorldListener implements Listener {
 | 
			
		||||
 | 
			
		||||
    private final Method methodSetUnsaved;
 | 
			
		||||
    private Method methodGetHandleChunk;
 | 
			
		||||
    private Object objChunkStatusFull = null;
 | 
			
		||||
    private final Method methodGetHandleChunk;
 | 
			
		||||
    private Field shouldSave = null;
 | 
			
		||||
 | 
			
		||||
    public SingleWorldListener() throws Exception {
 | 
			
		||||
        ReflectionUtils.RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
 | 
			
		||||
        ReflectionUtils.RefClass classChunkAccess = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
 | 
			
		||||
        this.methodSetUnsaved = classChunkAccess.getMethod("a", boolean.class).getRealMethod();
 | 
			
		||||
        try {
 | 
			
		||||
        this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle").getRealMethod();
 | 
			
		||||
        } catch (NoSuchMethodException ignored) {
 | 
			
		||||
        try {
 | 
			
		||||
                ReflectionUtils.RefClass classChunkStatus = getRefClass("net.minecraft.world.level.chunk.ChunkStatus");
 | 
			
		||||
                this.objChunkStatusFull = classChunkStatus.getRealClass().getField("n").get(null);
 | 
			
		||||
                this.methodGetHandleChunk = classCraftChunk.getMethod("getHandle", classChunkStatus.getRealClass()).getRealMethod();
 | 
			
		||||
            } catch (NoSuchMethodException ex) {
 | 
			
		||||
                throw new RuntimeException(ex);
 | 
			
		||||
            if (PlotSquared.platform().serverVersion()[1] < 17) {
 | 
			
		||||
                ReflectionUtils.RefClass classChunk = getRefClass("{nms}.Chunk");
 | 
			
		||||
                if (PlotSquared.platform().serverVersion()[1] == 13) {
 | 
			
		||||
                    this.shouldSave = classChunk.getField("mustSave").getRealField();
 | 
			
		||||
                } else {
 | 
			
		||||
                    this.shouldSave = classChunk.getField("s").getRealField();
 | 
			
		||||
                }
 | 
			
		||||
            } else if (PlotSquared.platform().serverVersion()[1] == 17) {
 | 
			
		||||
                ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.Chunk");
 | 
			
		||||
                this.shouldSave = classChunk.getField("r").getRealField();
 | 
			
		||||
            } else if (PlotSquared.platform().serverVersion()[1] == 18) {
 | 
			
		||||
                ReflectionUtils.RefClass classChunk = getRefClass("net.minecraft.world.level.chunk.IChunkAccess");
 | 
			
		||||
                this.shouldSave = classChunk.getField("b").getRealField();
 | 
			
		||||
            }
 | 
			
		||||
        } catch (NoSuchFieldException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void markChunkAsClean(Chunk chunk) {
 | 
			
		||||
        try {
 | 
			
		||||
            Object nmsChunk = objChunkStatusFull != null
 | 
			
		||||
                    ? this.methodGetHandleChunk.invoke(chunk, objChunkStatusFull)
 | 
			
		||||
                    : this.methodGetHandleChunk.invoke(chunk);
 | 
			
		||||
            methodSetUnsaved.invoke(nmsChunk, false);
 | 
			
		||||
            Object nmsChunk = methodGetHandleChunk.invoke(chunk);
 | 
			
		||||
            if (shouldSave != null) {
 | 
			
		||||
                this.shouldSave.set(nmsChunk, false);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (Throwable e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
@@ -79,12 +85,7 @@ public class SingleWorldListener implements Listener {
 | 
			
		||||
        if (!SinglePlotArea.isSinglePlotWorld(name)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        int x = event.getChunk().getX();
 | 
			
		||||
        int z = event.getChunk().getZ();
 | 
			
		||||
        if (x < 16 && x > -16 && z < 16 && z > -16) {
 | 
			
		||||
            // Allow spawn to generate
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        markChunkAsClean(event.getChunk());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user