SteamWar/BauSystem2.0
Archiviert
12
0

Add TraceCommand.showAtCommand, TraceCommand.showFromCommand and TraceCommand.showFromToCommand
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful

Signed-off-by: yoyosource <yoyosource@nidido.de>
Dieser Commit ist enthalten in:
yoyosource 2023-09-27 11:44:01 +02:00
Ursprung 925ba19ff3
Commit 8217e9645b
8 geänderte Dateien mit 113 neuen und 43 gelöschten Zeilen

Datei anzeigen

@ -31,16 +31,21 @@ public class TNTPosition extends Position {
private final Record.TNTRecord record; private final Record.TNTRecord record;
private final int fuseTicks; private final int fuseTicks;
private final long timeTicks;
private final Vector previousLocation; private final Vector previousLocation;
private final Vector velocity; private final Vector velocity;
private final Vector updateVelocity; private final Vector updateVelocity;
private final boolean source; private final boolean source;
private final boolean exploded; private final boolean exploded;
public TNTPosition(Record.TNTRecord record, TNTPrimed entity, Vector previousLocation, Vector velocity, Vector updateVelocity, boolean source, boolean exploded) { @Setter
private boolean microMotion;
public TNTPosition(Record.TNTRecord record, TNTPrimed entity, long timeTicks, Vector previousLocation, Vector velocity, Vector updateVelocity, boolean source, boolean exploded) {
super(entity.getLocation().toVector()); super(entity.getLocation().toVector());
this.record = record; this.record = record;
this.fuseTicks = entity.getFuseTicks(); this.fuseTicks = entity.getFuseTicks();
this.timeTicks = timeTicks;
this.previousLocation = previousLocation; this.previousLocation = previousLocation;
this.velocity = velocity; this.velocity = velocity;
this.updateVelocity = updateVelocity; this.updateVelocity = updateVelocity;

Datei anzeigen

@ -124,6 +124,36 @@ public class TraceCommand extends SWCommand {
BauSystem.MESSAGE.send("TRACE_MESSAGE_AUTO_DELETE_" + autoTraceRecorder.getTraceRecordAutoDeletion().name(), p); BauSystem.MESSAGE.send("TRACE_MESSAGE_AUTO_DELETE_" + autoTraceRecorder.getTraceRecordAutoDeletion().name(), p);
} }
@Register(value = {"show"})
public void showAtCommand(@Validator Player p, @OptionalValue("time") @StaticValue({"time", "fuse"}) String type, @StaticValue("at") String __, @Min(intValue = 0) int at) {
showFromToCommand(p, type, __, at, __, at);
}
@Register(value = {"show"})
public void showFromCommand(@Validator Player p, @OptionalValue("time") @StaticValue({"time", "fuse"}) String type, @StaticValue("from") String __, @Min(intValue = 0) int from) {
if (from == 0) {
TraceShowManager.setShowFilter(p, null);
return;
}
showFromToCommand(p, type, __, from, __, Integer.MAX_VALUE);
}
@Register(value = {"show"})
public void showFromToCommand(@Validator Player p, @OptionalValue("time") @StaticValue({"time", "fuse"}) String type, @StaticValue("from") String __, @Min(intValue = 0) int from, @StaticValue("to") String ___, @Min(intValue = 0) int to) {
TraceShowManager.setShowFilter(p, tntPosition -> {
switch (type) {
case "time":
return tntPosition.getTimeTicks() >= from && tntPosition.getTimeTicks() <= to;
case "fuse":
return tntPosition.getFuseTicks() >= from && tntPosition.getFuseTicks() <= to;
default:
return true;
}
});
}
// /trace show at 0
// /trace show raw -auto at 0
@Register(value = {"show"}, description = "TRACE_COMMAND_HELP_SHOW") @Register(value = {"show"}, description = "TRACE_COMMAND_HELP_SHOW")
public void showCommand(@Validator Player p, @OptionalValue("entity") ShowModeType showModeType, ShowModeParameterType... showModeParameterTypes) { public void showCommand(@Validator Player p, @OptionalValue("entity") ShowModeType showModeType, ShowModeParameterType... showModeParameterTypes) {
ShowModeParameter showModeParameter = new ShowModeParameter(); ShowModeParameter showModeParameter = new ShowModeParameter();

Datei anzeigen

@ -99,7 +99,7 @@ public class EntityShowMode implements ShowMode<TNTPosition> {
if (position.isExploded()) { if (position.isExploded()) {
generatePositions(position, false, false); generatePositions(position, false, false);
} }
if (!showModeParameter.isSourceOnly() && !hideWater) { if (!showModeParameter.isSourceOnly() && !showModeParameter.isMicroMotionLocation() && !hideWater) {
return; return;
} }
} }
@ -108,6 +108,15 @@ public class EntityShowMode implements ShowMode<TNTPosition> {
if (position.isSource()) { if (position.isSource()) {
generatePositions(position, false, false); generatePositions(position, false, false);
} }
if (!showModeParameter.isMicroMotionLocation() && !hideWater) {
return;
}
}
if (showModeParameter.isMicroMotionLocation()) {
if (position.isMicroMotion()) {
generatePositions(position, false, false);
}
if (!hideWater) { if (!hideWater) {
return; return;
} }

Datei anzeigen

@ -19,6 +19,7 @@
package de.steamwar.bausystem.features.tracer.show; package de.steamwar.bausystem.features.tracer.show;
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
import de.steamwar.bausystem.features.tracer.TNTPosition; import de.steamwar.bausystem.features.tracer.TNTPosition;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.shared.ShowMode; import de.steamwar.bausystem.shared.ShowMode;
@ -38,6 +39,7 @@ public class Record {
@Getter @Getter
private final List<TNTRecord> tnt = new ArrayList<>(); private final List<TNTRecord> tnt = new ArrayList<>();
private final Region region; private final Region region;
private final long startTicks = TPSUtils.currentTick.get();
public int size() { public int size() {
return tnt.size(); return tnt.size();
@ -57,18 +59,21 @@ public class Record {
tnt.clear(); tnt.clear();
} }
private void checkMicroMotion() { private void checkMicroMotion(Vector explosionPosition) {
for (TNTRecord tntRecord : tnt) { for (TNTRecord tntRecord : tnt) {
List<TNTPosition> positions = tntRecord.positions; List<TNTPosition> positions = tntRecord.positions;
if (positions.isEmpty()) continue; if (positions.isEmpty()) continue;
TNTPosition position = positions.get(positions.size() - 1); TNTPosition position = positions.get(positions.size() - 1);
if (position.isExploded()) continue;
if (position.getLocation().distanceSquared(explosionPosition) > 64) continue;
Vector velocity = position.getVelocity(); Vector velocity = position.getVelocity();
if (velocity.getY() == 0 && (velocity.getX() != 0 || velocity.getZ() != 0) && (Math.abs(velocity.getX()) < 0.001 || Math.abs(velocity.getZ()) < 0.001)) { if (velocity.getY() == 0 && ((velocity.getX() != 0 && Math.abs(velocity.getX()) < 0.001) || (velocity.getZ() != 0 && Math.abs(velocity.getZ()) < 0.001))) {
if (!tntRecord.hasMicroMotion) { if (!tntRecord.hasMicroMotion) {
positions.forEach(tntPosition -> TraceShowManager.show(region, tntPosition)); positions.forEach(tntPosition -> TraceShowManager.show(region, tntPosition));
} }
tntRecord.hasMicroMotion = true; tntRecord.hasMicroMotion = true;
position.setMicroMotion(true);
} }
} }
} }
@ -112,17 +117,17 @@ public class Record {
public void explode(TNTPrimed tntPrimed) { public void explode(TNTPrimed tntPrimed) {
add(tntPrimed, false, true); add(tntPrimed, false, true);
record.checkMicroMotion(); record.checkMicroMotion(tntPrimed.getLocation().toVector());
} }
private void add(TNTPrimed tntPrimed, boolean source, boolean exploded) { private void add(TNTPrimed tntPrimed, boolean source, boolean exploded) {
TNTPosition position; TNTPosition position;
if (positions.isEmpty()) { if (positions.isEmpty()) {
position = new TNTPosition(this, tntPrimed, null, tntPrimed.getVelocity(), null, source, exploded); position = new TNTPosition(this, tntPrimed, TPSUtils.currentTick.get() - record.startTicks, null, tntPrimed.getVelocity(), null, source, exploded);
} else { } else {
TNTPosition tntPosition = positions.get(positions.size() - 1); TNTPosition tntPosition = positions.get(positions.size() - 1);
Vector lastVelocity = tntPrimed.getLocation().toVector().clone().subtract(tntPosition.getLocation()); Vector lastVelocity = tntPrimed.getLocation().toVector().clone().subtract(tntPosition.getLocation());
position = new TNTPosition(this, tntPrimed, positions.get(positions.size() - 1).getLocation(), tntPrimed.getVelocity(), lastVelocity, source, exploded); position = new TNTPosition(this, tntPrimed, TPSUtils.currentTick.get() - record.startTicks, positions.get(positions.size() - 1).getLocation(), tntPrimed.getVelocity(), lastVelocity, source, exploded);
} }
positions.add(position); positions.add(position);
TraceShowManager.show(region, position); TraceShowManager.show(region, position);

Datei anzeigen

@ -33,6 +33,7 @@ public class ShowModeParameter {
private boolean buildDestroyOnly = false; private boolean buildDestroyOnly = false;
private boolean testblockDestroyOnly = false; private boolean testblockDestroyOnly = false;
private boolean microMotion = false; private boolean microMotion = false;
private boolean microMotionLocation = false;
public void enableWater() { public void enableWater() {
this.water = true; this.water = true;
@ -73,4 +74,8 @@ public class ShowModeParameter {
public void enableMicroMotion() { public void enableMicroMotion() {
this.microMotion = true; this.microMotion = true;
} }
public void enableMicroMotionLocation() {
this.microMotionLocation = true;
}
} }

Datei anzeigen

@ -43,6 +43,7 @@ public enum ShowModeParameterType {
BUILD_DESTROY_ONLY(ShowModeParameter::enableBuildDestroyOnly, Arrays.asList("-builddestroy", "-builddestoryonly"), "WATER", "TESTBLOCK_DESTROY_ONLY"), BUILD_DESTROY_ONLY(ShowModeParameter::enableBuildDestroyOnly, Arrays.asList("-builddestroy", "-builddestoryonly"), "WATER", "TESTBLOCK_DESTROY_ONLY"),
TESTBLOCK_DESTROY_ONLY(ShowModeParameter::enableTestblockDestroyOnly, Arrays.asList("-testblockdestroy", "-testblockdestroyonly"), "WATER", "BUILD_DESTROY_ONLY"), TESTBLOCK_DESTROY_ONLY(ShowModeParameter::enableTestblockDestroyOnly, Arrays.asList("-testblockdestroy", "-testblockdestroyonly"), "WATER", "BUILD_DESTROY_ONLY"),
MICROMOTION(ShowModeParameter::enableMicroMotion, Arrays.asList("-micromotion", "-micro", "-m")), MICROMOTION(ShowModeParameter::enableMicroMotion, Arrays.asList("-micromotion", "-micro", "-m")),
MICROMOTION_LOCATION(ShowModeParameter::enableMicroMotionLocation, Arrays.asList("-micromotionloc", "-microloc", "-mloc", "-micromotionlocation", "-microlocation", "-mlocation")),
; ;
@Getter @Getter

Datei anzeigen

@ -26,6 +26,7 @@ import de.steamwar.bausystem.shared.ShowMode;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import java.util.*; import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@UtilityClass @UtilityClass
@ -57,20 +58,11 @@ public class StoredRecords {
return records.getOrDefault(region, Collections.emptyList()); return records.getOrDefault(region, Collections.emptyList());
} }
public Record.TNTRecord getRecord(UUID id) { static void show(Region region, Predicate<TNTPosition> traceShowFilter, ShowMode<TNTPosition> traceShowMode) {
return records.values().stream()
.flatMap(Collection::stream)
.map(Record::getTnt)
.flatMap(Collection::stream)
.filter(tntRecord -> tntRecord.getId().equals(id))
.findFirst()
.orElse(null);
}
static void show(Region region, ShowMode<TNTPosition> traceShowMode) {
records.getOrDefault(region, new ArrayList<>()).forEach(record -> { records.getOrDefault(region, new ArrayList<>()).forEach(record -> {
record.getTnt().forEach(tntRecord -> { record.getTnt().forEach(tntRecord -> {
tntRecord.getPositions() tntRecord.getPositions().stream()
.filter(traceShowFilter)
.forEach(traceShowMode::show); .forEach(traceShowMode::show);
}); });
}); });

Datei anzeigen

@ -31,46 +31,43 @@ import org.bukkit.event.player.PlayerQuitEvent;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.function.Predicate;
public class TraceShowManager implements Listener { public class TraceShowManager implements Listener {
private TraceShowManager() { private TraceShowManager() {
} }
private static final Map<Region, Map<Player, ShowMode<TNTPosition>>> showModes = new HashMap<>(); private static final Map<Region, Map<Player, ShowMode<TNTPosition>>> showModes = new HashMap<>();
private static final Map<Region, Map<Player, Predicate<TNTPosition>>> showFilters = new HashMap<>();
public static void show(Player player, ShowMode<TNTPosition> traceShowMode) { public static void show(Player player, ShowMode<TNTPosition> traceShowMode) {
hide(player);
Region region = Region.getRegion(player.getLocation()); Region region = Region.getRegion(player.getLocation());
_hide(region, player, true);
Map<Player, ShowMode<TNTPosition>> regionalShowModes = showModes.computeIfAbsent(region, __ -> new HashMap<>()); Map<Player, ShowMode<TNTPosition>> regionalShowModes = showModes.computeIfAbsent(region, __ -> new HashMap<>());
regionalShowModes.put(player, traceShowMode); regionalShowModes.put(player, traceShowMode);
StoredRecords.show(region, traceShowMode); StoredRecords.show(region, getShowFilter(player, region), traceShowMode);
} }
public static void hide(Player player) { public static void hide(Player player) {
Region region = Region.getRegion(player.getLocation()); Region region = Region.getRegion(player.getLocation());
Map<Player, ShowMode<TNTPosition>> regionalShowModes = showModes.get(region); _hide(region, player, true);
if (regionalShowModes == null) {
return; showFilters.getOrDefault(region, new HashMap<>()).remove(player);
}
ShowMode<TNTPosition> showMode = regionalShowModes.remove(player);
if (showMode == null) {
return;
}
showMode.hide();
} }
public static void reshow(Region region, Player p) { public static void setShowFilter(Player player, Predicate<TNTPosition> showFilter) {
Map<Player, ShowMode<TNTPosition>> regionalShowModes = showModes.get(region); Region region = Region.getRegion(player.getLocation());
if (regionalShowModes == null) { Map<Player, Predicate<TNTPosition>> regionShowFilters = showFilters.computeIfAbsent(region, __ -> new HashMap<>());
return; if (showFilter == null) {
regionShowFilters.remove(player);
} else {
regionShowFilters.put(player, showFilter);
} }
ShowMode<TNTPosition> showMode = regionalShowModes.get(p);
if (showMode == null) { _hide(region, player, false);
return; ShowMode<TNTPosition> showMode = showModes.computeIfAbsent(region, __ -> new HashMap<>()).computeIfAbsent(player, __ -> new EntityShowMode(player, new ShowModeParameter(), 10));
} StoredRecords.show(region, getShowFilter(player, region), showMode);
showMode.hide();
StoredRecords.show(region, showMode);
} }
public static void reshow(Region region) { public static void reshow(Region region) {
@ -80,10 +77,31 @@ public class TraceShowManager implements Listener {
} }
for (Map.Entry<Player, ShowMode<TNTPosition>> entry : regionalShowModes.entrySet()) { for (Map.Entry<Player, ShowMode<TNTPosition>> entry : regionalShowModes.entrySet()) {
entry.getValue().hide(); entry.getValue().hide();
StoredRecords.show(region, entry.getValue()); StoredRecords.show(region, getShowFilter(entry.getKey(), region), entry.getValue());
} }
} }
private static void _hide(Region region, Player player, boolean remove) {
Map<Player, ShowMode<TNTPosition>> regionalShowModes = showModes.get(region);
if (regionalShowModes == null) {
return;
}
ShowMode<TNTPosition> showMode;
if (remove) {
showMode = regionalShowModes.remove(player);
} else {
showMode = regionalShowModes.get(player);
}
if (showMode == null) {
return;
}
showMode.hide();
}
private static Predicate<TNTPosition> getShowFilter(Player player, Region region) {
return showFilters.getOrDefault(region, new HashMap<>()).getOrDefault(player, tntPosition -> true);
}
/* Only to be called by record */ /* Only to be called by record */
static void show(Region region, TNTPosition tnt) { static void show(Region region, TNTPosition tnt) {
Map<Player, ShowMode<TNTPosition>> regionalShowModes = showModes.get(region); Map<Player, ShowMode<TNTPosition>> regionalShowModes = showModes.get(region);
@ -91,7 +109,9 @@ public class TraceShowManager implements Listener {
return; return;
} }
regionalShowModes.forEach((player, tntPositionShowMode) -> { regionalShowModes.forEach((player, tntPositionShowMode) -> {
tntPositionShowMode.show(tnt); if (getShowFilter(player, region).test(tnt)) {
tntPositionShowMode.show(tnt);
}
}); });
} }
@ -115,5 +135,8 @@ public class TraceShowManager implements Listener {
ShowMode<TNTPosition> showMode = playerShowModeMap.remove(event.getPlayer()); ShowMode<TNTPosition> showMode = playerShowModeMap.remove(event.getPlayer());
if (showMode != null) showMode.hide(); if (showMode != null) showMode.hide();
}); });
showFilters.forEach((region, playerPredicateMap) -> {
playerPredicateMap.remove(event.getPlayer());
});
} }
} }