Plex-FAWE/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/ChunkListener9.java

90 lines
2.8 KiB
Java

package com.boydti.fawe.bukkit.listener;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.config.Settings;
import com.boydti.fawe.util.FaweTimer;
import com.boydti.fawe.util.MathMan;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockPhysicsEvent;
public class ChunkListener9 extends ChunkListener {
private Exception exception;
private StackTraceElement[] elements;
public ChunkListener9() {
super();
}
@EventHandler(priority = EventPriority.LOWEST)
@Override
public void onPhysics(BlockPhysicsEvent event) {
if (physicsFreeze) {
event.setCancelled(true);
return;
}
if (physCancel) {
Block block = event.getBlock();
long pair = MathMan.pairInt(block.getX() >> 4, block.getZ() >> 4);
if (physCancelPair == pair) {
event.setCancelled(true);
return;
}
if (badChunks.containsKey(pair)) {
physCancelPair = pair;
event.setCancelled(true);
return;
}
if (System.currentTimeMillis() - physStart > Settings.IMP.TICK_LIMITER.PHYSICS_MS) {
physCancelPair = pair;
event.setCancelled(true);
return;
}
}
FaweTimer timer = Fawe.get().getTimer();
if (timer.getTick() != physTick) {
physTick = timer.getTick();
physStart = System.currentTimeMillis();
physSkip = 0;
physCancel = false;
return;
}
if ((++physSkip & 1023) == 0) {
if (System.currentTimeMillis() - physStart > Settings.IMP.TICK_LIMITER.PHYSICS_MS) {
Block block = event.getBlock();
int cx = block.getX() >> 4;
int cz = block.getZ() >> 4;
physCancelPair = MathMan.pairInt(cx, cz);
if (rateLimit <= 0) {
rateLimit = 20;
lastCancelPos = block.getLocation();
}
cancelNearby(cx, cz);
event.setCancelled(true);
physCancel = true;
}
}
}
private StackTraceElement[] getElements(Exception ex) {
if (elements == null || ex != exception) {
exception = ex;
elements = ex.getStackTrace();
}
return elements;
}
@Override
protected int getDepth(Exception ex) {
return getElements(ex).length;
}
@Override
protected StackTraceElement getElement(Exception ex, int i) {
StackTraceElement[] elems = getElements(ex);
return elems.length > i ? elems[i] : null;
}
}