Signed-off-by: yoyosource <yoyosource@nidido.de>
Dieser Commit ist enthalten in:
Ursprung
e42e123aaa
Commit
02c68a8b0b
@ -28,6 +28,9 @@ import java.util.List;
|
||||
|
||||
public class AxisMovementLimiter {
|
||||
|
||||
private double x;
|
||||
private double y;
|
||||
private double z;
|
||||
private Axis axis;
|
||||
private double movement;
|
||||
|
||||
@ -39,6 +42,9 @@ public class AxisMovementLimiter {
|
||||
private double maxZ;
|
||||
|
||||
public AxisMovementLimiter(double x, double y, double z, Axis axis, double movement) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
this.axis = axis;
|
||||
this.movement = movement;
|
||||
|
||||
@ -75,6 +81,7 @@ public class AxisMovementLimiter {
|
||||
}
|
||||
break;
|
||||
}
|
||||
System.out.println(axis + " " + minX + " -> " + maxX + " " + minY + " -> " + maxY + " " + minZ + " -> " + maxZ);
|
||||
}
|
||||
|
||||
private List<Pos> possibleCollisions() {
|
||||
@ -98,6 +105,8 @@ public class AxisMovementLimiter {
|
||||
|
||||
// TODO: This can be optimized by optimizing the x,y,z loop layout
|
||||
public double run() {
|
||||
if (movement == 0.0) return 0.0;
|
||||
|
||||
BoundingBox movementBoundingBox = new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ);
|
||||
List<Pos> poss = possibleCollisions();
|
||||
|
||||
@ -151,13 +160,14 @@ public class AxisMovementLimiter {
|
||||
if (collision == null) {
|
||||
return movement;
|
||||
} else {
|
||||
System.out.println(axis + " " + movement + " " + collision);
|
||||
switch (axis) {
|
||||
case X:
|
||||
return movement + (collision - minX);
|
||||
return x - collision;
|
||||
case Y:
|
||||
return movement + (collision - minY);
|
||||
return y - collision;
|
||||
case Z:
|
||||
return movement + (collision - minZ);
|
||||
return z - collision;
|
||||
default:
|
||||
throw new IllegalStateException("Unexpected value: " + axis);
|
||||
}
|
||||
|
@ -65,14 +65,12 @@ public class Explosion {
|
||||
private final double y;
|
||||
private final double z;
|
||||
|
||||
private final List<TNT> entities;
|
||||
|
||||
public Explosion(TNT tnt, double x, double y, double z, List<TNT> entities) {
|
||||
public Explosion(TNT tnt, double x, double y, double z) {
|
||||
this.tnt = tnt;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
this.entities = entities;
|
||||
}
|
||||
|
||||
public void calculate() {
|
||||
@ -120,7 +118,7 @@ public class Explosion {
|
||||
int t = floor(z - q - 1.0D);
|
||||
int u = floor(z + q + 1.0D);
|
||||
|
||||
for (TNT currentTNT : entities) {
|
||||
for (TNT currentTNT : Simulator19.tntList) {
|
||||
if (currentTNT == tnt) continue;
|
||||
if (!(currentTNT.getX() >= k && currentTNT.getY() >= r && currentTNT.getZ() >= t && currentTNT.getX() <= l && currentTNT.getY() <= s && currentTNT.getZ() <= u)) {
|
||||
continue;
|
||||
|
@ -26,6 +26,7 @@ import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.util.BoundingBox;
|
||||
import org.bukkit.util.Vector;
|
||||
import org.bukkit.util.VoxelShape;
|
||||
|
||||
import java.util.*;
|
||||
@ -51,6 +52,7 @@ public class Simulator19 implements Simulator {
|
||||
private static long accessed = 0;
|
||||
private static long cacheMisses = 0;
|
||||
private static long aired = 0;
|
||||
static final List<TNT> tntList = new ArrayList<>();
|
||||
private static final Set<Pos> AIR_BLOCKS = new HashSet<>();
|
||||
private static final Map<Pos, Material> BLOCK_TYPES_MAP = new HashMap<>();
|
||||
private static final Map<Pos, BlockData> BLOCK_DATA_MAP = new HashMap<>();
|
||||
@ -59,7 +61,6 @@ public class Simulator19 implements Simulator {
|
||||
@Override
|
||||
public synchronized PreviewRecord run(Pair<Integer, Map<Integer, List<List<Pair<TNTData, Integer>>>>> toCalculate) {
|
||||
PreviewRecord previewRecord = new PreviewRecord();
|
||||
List<TNT> tntList = new ArrayList<>();
|
||||
int currentTick = 0;
|
||||
|
||||
long time = System.currentTimeMillis();
|
||||
@ -73,7 +74,7 @@ public class Simulator19 implements Simulator {
|
||||
pairs.forEach(pair -> {
|
||||
if (pair.getValue() > 0) {
|
||||
hasSomeLeft.set(true);
|
||||
TNT tnt = new TNT(pair.getKey().location.getX(), pair.getKey().location.getY(), pair.getKey().location.getZ());
|
||||
TNT tnt = new TNT(pair.getKey().location.getX() - 0.49, pair.getKey().location.getY(), pair.getKey().location.getZ() - 0.49);
|
||||
if (!pair.getKey().xVelocity) tnt.setVx(0.0);
|
||||
if (!pair.getKey().yVelocity) tnt.setVy(0.0);
|
||||
if (!pair.getKey().zVelocity) tnt.setVz(0.0);
|
||||
@ -96,6 +97,8 @@ public class Simulator19 implements Simulator {
|
||||
}
|
||||
tntList.removeAll(remove);
|
||||
}
|
||||
System.out.println(AIR_BLOCKS);
|
||||
AIR_BLOCKS.forEach(pos -> previewRecord.addAir(new Vector(pos.x, pos.y, pos.z)));
|
||||
System.out.println("Time: " + (System.currentTimeMillis() - time) + "ms " + cacheMisses + "/" + accessed + "/" + aired);
|
||||
|
||||
AIR_BLOCKS.clear();
|
||||
@ -142,10 +145,10 @@ public class Simulator19 implements Simulator {
|
||||
public static void clearBlock(Pos pos) {
|
||||
aired++;
|
||||
AIR_BLOCKS.add(pos);
|
||||
BLOCK_DATA_MAP.put(pos, AIR_BLOCK_DATA);
|
||||
BlockData blockData = BLOCK_DATA_MAP.put(pos, AIR_BLOCK_DATA);
|
||||
}
|
||||
|
||||
public static void clearBlocks(Set<Pos> pos) {
|
||||
|
||||
public static void clearBlocks(Set<Pos> poss) { // TODO: Optimize
|
||||
poss.forEach(Simulator19::clearBlock);
|
||||
}
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ public class TNT {
|
||||
|
||||
this.fuse--;
|
||||
if (this.fuse <= 0) {
|
||||
Explosion explosion = new Explosion(this, x, y + 0.98 * 0.0625, z, new ArrayList<>());
|
||||
Explosion explosion = new Explosion(this, x, y + 0.98 * 0.0625, z);
|
||||
explosion.calculate();
|
||||
return true;
|
||||
}
|
||||
@ -165,16 +165,16 @@ public class TNT {
|
||||
return movement;
|
||||
}
|
||||
|
||||
double mY = new OptimizedAxisMovementLimiter(x, y, z, Axis.Y, movement.getY()).run();
|
||||
double mY = new AxisMovementLimiter(x, y, z, Axis.Y, movement.getY()).run();
|
||||
|
||||
boolean bl = Math.abs(movement.getX()) < Math.abs(movement.getZ());
|
||||
if (bl) {
|
||||
double mZ = new OptimizedAxisMovementLimiter(x, y + mY, z, Axis.Z, movement.getZ()).run();
|
||||
double mX = new OptimizedAxisMovementLimiter(x, y + mY, z + mZ, Axis.X, movement.getX()).run();
|
||||
double mZ = new AxisMovementLimiter(x, y + mY, z, Axis.Z, movement.getZ()).run();
|
||||
double mX = new AxisMovementLimiter(x, y + mY, z + mZ, Axis.X, movement.getX()).run();
|
||||
return new Vector(mX, mY, mZ);
|
||||
} else {
|
||||
double mX = new OptimizedAxisMovementLimiter(x, y + mY, z, Axis.X, movement.getX()).run();
|
||||
double mZ = new OptimizedAxisMovementLimiter(x + mX, y + mY, z, Axis.Z, movement.getZ()).run();
|
||||
double mX = new AxisMovementLimiter(x, y + mY, z, Axis.X, movement.getX()).run();
|
||||
double mZ = new AxisMovementLimiter(x + mX, y + mY, z, Axis.Z, movement.getZ()).run();
|
||||
return new Vector(mX, mY, mZ);
|
||||
}
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ import org.bukkit.event.player.*;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
@ -98,10 +99,21 @@ public class TNTSimulatorListener implements Listener {
|
||||
SimulatorStorage.getSimulatorNames().forEach(s -> {
|
||||
SimulatorStorage.getSimulator(s)._hide(event.getPlayer());
|
||||
});
|
||||
PreviewRecord previewRecord = previewRecordMap.remove(event.getPlayer());
|
||||
if (previewRecord != null) {
|
||||
previewRecord.close(event.getPlayer());
|
||||
}
|
||||
}
|
||||
|
||||
private Map<Player, PreviewRecord> previewRecordMap = new HashMap<>();
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) {
|
||||
PreviewRecord current = previewRecordMap.remove(event.getPlayer());
|
||||
if (current != null) {
|
||||
current.close(event.getPlayer());
|
||||
}
|
||||
|
||||
if (!ItemUtils.isItem(event.getOffHandItem(), "simulator")) {
|
||||
return;
|
||||
}
|
||||
@ -111,7 +123,7 @@ public class TNTSimulatorListener implements Listener {
|
||||
if (!permissionCheck(event.getPlayer())) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
TNTSimulator simulator = SimulatorStorage.getSimulator(event.getOffHandItem());
|
||||
if (simulator == null) return;
|
||||
Pair<Integer, Map<Integer, List<List<Pair<TNTData, Integer>>>>> toCalculate = simulator.locations(event.getPlayer());
|
||||
@ -121,6 +133,7 @@ public class TNTSimulatorListener implements Listener {
|
||||
return;
|
||||
}
|
||||
previewRecord.add(event.getPlayer());
|
||||
previewRecordMap.put(event.getPlayer(), previewRecord);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
|
@ -21,22 +21,29 @@ package de.steamwar.bausystem.features.simulator.preview;
|
||||
|
||||
import de.steamwar.entity.REntityServer;
|
||||
import de.steamwar.entity.RFallingBlockEntity;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class PreviewRecord {
|
||||
|
||||
private static final BlockData AIR_BLOCK_DATA = Material.AIR.createBlockData();
|
||||
|
||||
private Set<Vector> vectorList = new HashSet<>();
|
||||
private Set<Vector> destroyedBlocks = new HashSet<>();
|
||||
private REntityServer rEntityServer;
|
||||
|
||||
public void add(double x, double y, double z) {
|
||||
vectorList.add(new Vector(x, y, z));
|
||||
vectorList.add(new Vector(x + 0.49, y, z + 0.49));
|
||||
}
|
||||
|
||||
public void addAir(Vector destroyed) {
|
||||
destroyedBlocks.add(destroyed);
|
||||
}
|
||||
|
||||
public void add(Player player) {
|
||||
@ -49,5 +56,19 @@ public class PreviewRecord {
|
||||
});
|
||||
}
|
||||
rEntityServer.addPlayer(player);
|
||||
|
||||
destroyedBlocks.forEach(vector -> {
|
||||
player.sendBlockChange(vector.toLocation(player.getWorld()), AIR_BLOCK_DATA);
|
||||
});
|
||||
}
|
||||
|
||||
public void close(Player player) {
|
||||
rEntityServer.close();
|
||||
rEntityServer = null;
|
||||
|
||||
destroyedBlocks.forEach(vector -> {
|
||||
Location location = vector.toLocation(player.getWorld());
|
||||
player.sendBlockChange(location, location.getBlock().getBlockData());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren