Skip to content

Commit

Permalink
Merge pull request #24 from Xezard/dev
Browse files Browse the repository at this point in the history
Fix problems associated with clearing Set<Entity>
  • Loading branch information
Xezard committed Nov 19, 2022
2 parents 059309e + 873f28b commit 1609a75
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 20 deletions.
22 changes: 18 additions & 4 deletions api/src/main/java/ru/xezard/glow/data/glow/AbstractGlow.java
Expand Up @@ -23,21 +23,25 @@
import lombok.Getter;
import lombok.experimental.FieldDefaults;
import lombok.experimental.NonFinal;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import ru.xezard.glow.data.glow.manager.GlowsManager;

import java.util.Collections;
import java.util.Set;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@EqualsAndHashCode
@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true)
public abstract class AbstractGlow
implements IGlow {
// <player name (false) or entity uuid (true)>
Map<String, Boolean> holders = new ConcurrentHashMap<> ();

Set<Player> viewers = ConcurrentHashMap.newKeySet();
Set<Entity> holders = ConcurrentHashMap.newKeySet();

@Getter
@NonFinal ChatColor color;
Expand All @@ -60,11 +64,21 @@ public void setColor(ChatColor color) {

@Override
public Set<Entity> getHolders() {
return Collections.unmodifiableSet(this.holders);
return Collections.unmodifiableSet(getHoldersStream(this.holders)
.collect(Collectors.toSet()));
}

@Override
public Set<Player> getViewers() {
return Collections.unmodifiableSet(this.viewers);
}

public static Stream<Entity> getHoldersStream(Map<String, Boolean> holders) {
return holders.entrySet().stream().map((entry) -> {
String key = entry.getKey();

return entry.getValue() ? Bukkit.getEntity(UUID.fromString(key)) :
Bukkit.getPlayer(key);
}).filter(Objects::nonNull);
}
}
14 changes: 12 additions & 2 deletions api/src/main/java/ru/xezard/glow/data/glow/Glow.java
Expand Up @@ -18,7 +18,6 @@
*/
package ru.xezard.glow.data.glow;

import com.google.common.base.Preconditions;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
Expand Down Expand Up @@ -55,7 +54,18 @@ private void processHolder(boolean add, Entity... entities) {
List<AbstractPacket> packets = new ArrayList<> ();

for (Entity entity : entities) {
if (add ? !this.holders.add(entity) : !this.holders.remove(entity)) {
boolean player = entity instanceof Player;
boolean changed;

String value = player ? entity.getName() : entity.getUniqueId().toString();

if (add && !this.holders.containsKey(value)) {
changed = this.holders.put(value, !player) == null;
} else {
changed = this.holders.remove(value) != null;
}

if (!changed) {
continue;
}

Expand Down
Expand Up @@ -21,20 +21,21 @@
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import com.comphenix.protocol.wrappers.WrappedWatchableObject;
import com.google.common.collect.Lists;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.experimental.FieldDefaults;
import lombok.experimental.NonFinal;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Entity;
import ru.xezard.glow.data.glow.AbstractGlow;
import ru.xezard.glow.packets.AbstractPacket;
import ru.xezard.glow.packets.AbstractWrapperPlayServerScoreboardTeam;
import ru.xezard.glow.packets.WrapperPlayServerEntityMetadata;
import ru.xezard.glow.packets.WrapperPlayServerScoreboardTeam;

import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.stream.Collectors;

@AllArgsConstructor
Expand All @@ -59,14 +60,14 @@ public static GlowProcessor getInstance() {
}

@Override
public List<AbstractPacket> createGlowPackets(Set<Entity> entities, boolean glow) {
return entities.stream()
.map((entity) -> this.createGlowPacket(entity, glow))
.collect(Collectors.toList());
public List<AbstractPacket> createGlowPackets(Map<String, Boolean> holders, boolean glow) {
return AbstractGlow.getHoldersStream(holders)
.map((entity) -> this.createGlowPacket(entity, glow))
.collect(Collectors.toList());
}

@Override
public AbstractPacket createTeamPacket(Set<Entity> holders, ChatColor color, String teamName,
public AbstractPacket createTeamPacket(Map<String, Boolean> holders, ChatColor color, String teamName,
AbstractWrapperPlayServerScoreboardTeam.Mode mode) {
WrapperPlayServerScoreboardTeam team = new WrapperPlayServerScoreboardTeam();

Expand All @@ -81,10 +82,7 @@ public AbstractPacket createTeamPacket(Set<Entity> holders, ChatColor color, Str
team.setColor(color);
team.setNameTagVisibility(AbstractWrapperPlayServerScoreboardTeam.NameTagVisibility.ALWAYS);

team.setPlayers(holders.stream()
.map((holder) -> holder instanceof OfflinePlayer ?
holder.getName() : holder.getUniqueId().toString())
.collect(Collectors.toList()));
team.setPlayers(Lists.newArrayList(holders.keySet()));

return team.getPacket();
}
Expand Down
Expand Up @@ -25,13 +25,13 @@
import ru.xezard.glow.packets.AbstractWrapperPlayServerScoreboardTeam;

import java.util.List;
import java.util.Set;
import java.util.Map;

public interface IGlowProcessor {
AbstractPacket createTeamPacket(Set<Entity> holders, ChatColor color, String teamName,
AbstractPacket createTeamPacket(Map<String, Boolean> holders, ChatColor color, String teamName,
AbstractWrapperPlayServerScoreboardTeam.Mode mode);

List<AbstractPacket> createGlowPackets(Set<Entity> entities, boolean enableGlow);
List<AbstractPacket> createGlowPackets(Map<String, Boolean> holders, boolean glow);

AbstractPacket createGlowPacket(Entity entity, boolean enableGlow);

Expand Down

0 comments on commit 1609a75

Please sign in to comment.