SteamWar/BauSystem2.0
Archiviert
12
0

Push current state
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful

Signed-off-by: yoyosource <yoyosource@nidido.de>
Dieser Commit ist enthalten in:
yoyosource 2023-08-31 21:30:34 +02:00
Ursprung e42e123aaa
Commit 02c68a8b0b
6 geänderte Dateien mit 67 neuen und 22 gelöschten Zeilen

Datei anzeigen

@ -28,6 +28,9 @@ import java.util.List;
public class AxisMovementLimiter { public class AxisMovementLimiter {
private double x;
private double y;
private double z;
private Axis axis; private Axis axis;
private double movement; private double movement;
@ -39,6 +42,9 @@ public class AxisMovementLimiter {
private double maxZ; private double maxZ;
public AxisMovementLimiter(double x, double y, double z, Axis axis, double movement) { 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.axis = axis;
this.movement = movement; this.movement = movement;
@ -75,6 +81,7 @@ public class AxisMovementLimiter {
} }
break; break;
} }
System.out.println(axis + " " + minX + " -> " + maxX + " " + minY + " -> " + maxY + " " + minZ + " -> " + maxZ);
} }
private List<Pos> possibleCollisions() { private List<Pos> possibleCollisions() {
@ -98,6 +105,8 @@ public class AxisMovementLimiter {
// TODO: This can be optimized by optimizing the x,y,z loop layout // TODO: This can be optimized by optimizing the x,y,z loop layout
public double run() { public double run() {
if (movement == 0.0) return 0.0;
BoundingBox movementBoundingBox = new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ); BoundingBox movementBoundingBox = new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ);
List<Pos> poss = possibleCollisions(); List<Pos> poss = possibleCollisions();
@ -151,13 +160,14 @@ public class AxisMovementLimiter {
if (collision == null) { if (collision == null) {
return movement; return movement;
} else { } else {
System.out.println(axis + " " + movement + " " + collision);
switch (axis) { switch (axis) {
case X: case X:
return movement + (collision - minX); return x - collision;
case Y: case Y:
return movement + (collision - minY); return y - collision;
case Z: case Z:
return movement + (collision - minZ); return z - collision;
default: default:
throw new IllegalStateException("Unexpected value: " + axis); throw new IllegalStateException("Unexpected value: " + axis);
} }

Datei anzeigen

@ -65,14 +65,12 @@ public class Explosion {
private final double y; private final double y;
private final double z; 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.tnt = tnt;
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
this.entities = entities;
} }
public void calculate() { public void calculate() {
@ -120,7 +118,7 @@ public class Explosion {
int t = floor(z - q - 1.0D); int t = floor(z - q - 1.0D);
int u = 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 == tnt) continue;
if (!(currentTNT.getX() >= k && currentTNT.getY() >= r && currentTNT.getZ() >= t && currentTNT.getX() <= l && currentTNT.getY() <= s && currentTNT.getZ() <= u)) { if (!(currentTNT.getX() >= k && currentTNT.getY() >= r && currentTNT.getZ() >= t && currentTNT.getX() <= l && currentTNT.getY() <= s && currentTNT.getZ() <= u)) {
continue; continue;

Datei anzeigen

@ -26,6 +26,7 @@ import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.util.BoundingBox; import org.bukkit.util.BoundingBox;
import org.bukkit.util.Vector;
import org.bukkit.util.VoxelShape; import org.bukkit.util.VoxelShape;
import java.util.*; import java.util.*;
@ -51,6 +52,7 @@ public class Simulator19 implements Simulator {
private static long accessed = 0; private static long accessed = 0;
private static long cacheMisses = 0; private static long cacheMisses = 0;
private static long aired = 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 Set<Pos> AIR_BLOCKS = new HashSet<>();
private static final Map<Pos, Material> BLOCK_TYPES_MAP = new HashMap<>(); private static final Map<Pos, Material> BLOCK_TYPES_MAP = new HashMap<>();
private static final Map<Pos, BlockData> BLOCK_DATA_MAP = new HashMap<>(); private static final Map<Pos, BlockData> BLOCK_DATA_MAP = new HashMap<>();
@ -59,7 +61,6 @@ public class Simulator19 implements Simulator {
@Override @Override
public synchronized PreviewRecord run(Pair<Integer, Map<Integer, List<List<Pair<TNTData, Integer>>>>> toCalculate) { public synchronized PreviewRecord run(Pair<Integer, Map<Integer, List<List<Pair<TNTData, Integer>>>>> toCalculate) {
PreviewRecord previewRecord = new PreviewRecord(); PreviewRecord previewRecord = new PreviewRecord();
List<TNT> tntList = new ArrayList<>();
int currentTick = 0; int currentTick = 0;
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
@ -73,7 +74,7 @@ public class Simulator19 implements Simulator {
pairs.forEach(pair -> { pairs.forEach(pair -> {
if (pair.getValue() > 0) { if (pair.getValue() > 0) {
hasSomeLeft.set(true); 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().xVelocity) tnt.setVx(0.0);
if (!pair.getKey().yVelocity) tnt.setVy(0.0); if (!pair.getKey().yVelocity) tnt.setVy(0.0);
if (!pair.getKey().zVelocity) tnt.setVz(0.0); if (!pair.getKey().zVelocity) tnt.setVz(0.0);
@ -96,6 +97,8 @@ public class Simulator19 implements Simulator {
} }
tntList.removeAll(remove); 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); System.out.println("Time: " + (System.currentTimeMillis() - time) + "ms " + cacheMisses + "/" + accessed + "/" + aired);
AIR_BLOCKS.clear(); AIR_BLOCKS.clear();
@ -142,10 +145,10 @@ public class Simulator19 implements Simulator {
public static void clearBlock(Pos pos) { public static void clearBlock(Pos pos) {
aired++; aired++;
AIR_BLOCKS.add(pos); 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);
} }
} }

Datei anzeigen

@ -82,7 +82,7 @@ public class TNT {
this.fuse--; this.fuse--;
if (this.fuse <= 0) { 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(); explosion.calculate();
return true; return true;
} }
@ -165,16 +165,16 @@ public class TNT {
return movement; 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()); boolean bl = Math.abs(movement.getX()) < Math.abs(movement.getZ());
if (bl) { if (bl) {
double mZ = new OptimizedAxisMovementLimiter(x, y + mY, z, Axis.Z, movement.getZ()).run(); double mZ = new AxisMovementLimiter(x, y + mY, z, Axis.Z, movement.getZ()).run();
double mX = new OptimizedAxisMovementLimiter(x, y + mY, z + mZ, Axis.X, movement.getX()).run(); double mX = new AxisMovementLimiter(x, y + mY, z + mZ, Axis.X, movement.getX()).run();
return new Vector(mX, mY, mZ); return new Vector(mX, mY, mZ);
} else { } else {
double mX = new OptimizedAxisMovementLimiter(x, y + mY, z, Axis.X, movement.getX()).run(); double mX = new AxisMovementLimiter(x, y + mY, z, Axis.X, movement.getX()).run();
double mZ = new OptimizedAxisMovementLimiter(x + mX, y + mY, z, Axis.Z, movement.getZ()).run(); double mZ = new AxisMovementLimiter(x + mX, y + mY, z, Axis.Z, movement.getZ()).run();
return new Vector(mX, mY, mZ); return new Vector(mX, mY, mZ);
} }
} }

Datei anzeigen

@ -36,6 +36,7 @@ import org.bukkit.event.player.*;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.PlayerInventory;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
@ -98,10 +99,21 @@ public class TNTSimulatorListener implements Listener {
SimulatorStorage.getSimulatorNames().forEach(s -> { SimulatorStorage.getSimulatorNames().forEach(s -> {
SimulatorStorage.getSimulator(s)._hide(event.getPlayer()); 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 @EventHandler
public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) {
PreviewRecord current = previewRecordMap.remove(event.getPlayer());
if (current != null) {
current.close(event.getPlayer());
}
if (!ItemUtils.isItem(event.getOffHandItem(), "simulator")) { if (!ItemUtils.isItem(event.getOffHandItem(), "simulator")) {
return; return;
} }
@ -121,6 +133,7 @@ public class TNTSimulatorListener implements Listener {
return; return;
} }
previewRecord.add(event.getPlayer()); previewRecord.add(event.getPlayer());
previewRecordMap.put(event.getPlayer(), previewRecord);
} }
@EventHandler @EventHandler

Datei anzeigen

@ -21,22 +21,29 @@ package de.steamwar.bausystem.features.simulator.preview;
import de.steamwar.entity.REntityServer; import de.steamwar.entity.REntityServer;
import de.steamwar.entity.RFallingBlockEntity; import de.steamwar.entity.RFallingBlockEntity;
import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
public class PreviewRecord { public class PreviewRecord {
private static final BlockData AIR_BLOCK_DATA = Material.AIR.createBlockData();
private Set<Vector> vectorList = new HashSet<>(); private Set<Vector> vectorList = new HashSet<>();
private Set<Vector> destroyedBlocks = new HashSet<>();
private REntityServer rEntityServer; private REntityServer rEntityServer;
public void add(double x, double y, double z) { 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) { public void add(Player player) {
@ -49,5 +56,19 @@ public class PreviewRecord {
}); });
} }
rEntityServer.addPlayer(player); 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());
});
} }
} }