diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java index 0e7033aa..3e91061c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java @@ -159,7 +159,7 @@ public class Trace { // TODO: Add UUID for file saving and so on! private void render(List records, REntityServer entityServer, PlayerTraceShowData playerTraceShowData) { if (records.isEmpty()) return; - List workingRecords = records; + List workingRecords = new ArrayList<>(records); Set flagList = playerTraceShowData.getEffectiveViewFlags(); //Apply filters diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java index 8cca81b7..f476f3f9 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java @@ -194,6 +194,10 @@ public class TraceManager implements Listener { public boolean follow(Player follower, Player following) { if (followerMap.containsKey(follower)) return false; + if (followerMap.entrySet().stream().anyMatch(playerSetEntry -> playerSetEntry.getValue().contains(follower))) { + unfollow(follower); + } + followerMap.computeIfAbsent(following, ignored -> new HashSet<>()).add(follower); showDataPerRegionPerPlayer.forEach((region, playerPlayerTraceShowDataMap) -> { @@ -215,13 +219,21 @@ public class TraceManager implements Listener { public void unfollow(Player follower) { if (followerMap.containsKey(follower)) return; List toRemove = new ArrayList<>(); + Set toHide = new HashSet<>(); followerMap.forEach((player, players) -> { - players.remove(player); + if (players.remove(follower)) toHide.add(follower); if (players.isEmpty()) toRemove.add(player); }); toRemove.forEach(followerMap::remove); showDataPerRegionPerPlayer.forEach((region, playerPlayerTraceShowDataMap) -> { + toHide.forEach(player -> { + if (!playerPlayerTraceShowDataMap.containsKey(player)) return; + tracesByRegion.getOrDefault(region, Collections.emptyMap()).forEach((integer, trace) -> { + trace.hide(follower); + }); + }); + PlayerTraceShowData playerTraceShowData = playerPlayerTraceShowDataMap.get(follower); if (playerTraceShowData == null) return; tracesByRegion.getOrDefault(region, Collections.emptyMap()).forEach((integer, trace) -> { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java index 946152c3..f88d0eab 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java @@ -19,18 +19,24 @@ package de.steamwar.bausystem.features.tracer.rendering; +import com.comphenix.tinyprotocol.Reflection; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.tracer.TNTPoint; +import de.steamwar.core.Core; +import de.steamwar.entity.REntity; import de.steamwar.entity.REntityServer; -import de.steamwar.entity.RFallingBlockEntity; +import de.steamwar.techhider.BlockIds; import lombok.Getter; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import java.util.List; -public class TraceEntity extends RFallingBlockEntity { +public class TraceEntity extends REntity { + + private static final Reflection.MethodInvoker addEntityMethod = Reflection.getMethod(REntityServer.class, "addEntity", REntity.class); /** * The records represented by this REntity @@ -39,9 +45,10 @@ public class TraceEntity extends RFallingBlockEntity { private final List records; public TraceEntity(REntityServer server, Location location, boolean isExplosion, List records) { - super(server, location, isExplosion ? Material.RED_STAINED_GLASS : Material.TNT); + super(server, EntityType.FALLING_BLOCK, location, BlockIds.impl.materialToId(isExplosion ? Material.RED_STAINED_GLASS : Material.TNT) >> (Core.getVersion() <= 12 ? 4 : 0)); setNoGravity(true); this.records = records; + addEntityMethod.invoke(server, this); } public void printIntoChat(Player player) {