mirror of
https://github.com/Xiao-MoMi/Custom-Nameplates.git
synced 2026-01-04 15:31:47 +00:00
3.0.5
This commit is contained in:
@@ -17,17 +17,13 @@
|
||||
|
||||
package net.momirealms.customnameplates.bukkit;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.momirealms.customnameplates.api.*;
|
||||
import net.momirealms.customnameplates.api.event.NameplatesReloadEvent;
|
||||
import net.momirealms.customnameplates.api.feature.ChatListener;
|
||||
import net.momirealms.customnameplates.api.feature.JoinQuitListener;
|
||||
import net.momirealms.customnameplates.api.feature.OffsetFont;
|
||||
import net.momirealms.customnameplates.api.feature.PlayerListener;
|
||||
import net.momirealms.customnameplates.api.helper.AdventureHelper;
|
||||
import net.momirealms.customnameplates.api.helper.VersionHelper;
|
||||
import net.momirealms.customnameplates.api.placeholder.internal.StaticPosition;
|
||||
import net.momirealms.customnameplates.api.util.Vector3;
|
||||
import net.momirealms.customnameplates.backend.feature.actionbar.ActionBarManagerImpl;
|
||||
import net.momirealms.customnameplates.backend.feature.advance.AdvanceManagerImpl;
|
||||
@@ -42,6 +38,7 @@ import net.momirealms.customnameplates.backend.placeholder.PlaceholderManagerImp
|
||||
import net.momirealms.customnameplates.backend.storage.StorageManagerImpl;
|
||||
import net.momirealms.customnameplates.bukkit.command.BukkitCommandManager;
|
||||
import net.momirealms.customnameplates.bukkit.compatibility.NameplatesExpansion;
|
||||
import net.momirealms.customnameplates.bukkit.compatibility.NameplatesExtraExpansion;
|
||||
import net.momirealms.customnameplates.bukkit.compatibility.cosmetic.MagicCosmeticsHook;
|
||||
import net.momirealms.customnameplates.bukkit.requirement.BukkitRequirementManager;
|
||||
import net.momirealms.customnameplates.bukkit.scheduler.BukkitSchedulerAdapter;
|
||||
@@ -57,7 +54,6 @@ import net.momirealms.customnameplates.common.plugin.logging.PluginLogger;
|
||||
import net.momirealms.customnameplates.common.plugin.scheduler.AbstractJavaScheduler;
|
||||
import net.momirealms.customnameplates.common.plugin.scheduler.SchedulerAdapter;
|
||||
import net.momirealms.customnameplates.common.plugin.scheduler.SchedulerTask;
|
||||
import net.momirealms.customnameplates.common.util.Pair;
|
||||
import org.bstats.bukkit.Metrics;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
@@ -200,6 +196,7 @@ public class BukkitCustomNameplates extends CustomNameplates implements Listener
|
||||
}
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
|
||||
new NameplatesExpansion(this).register();
|
||||
new NameplatesExtraExpansion(this).register();
|
||||
}
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("MagicCosmetics")) {
|
||||
try {
|
||||
|
||||
@@ -37,6 +37,7 @@ import net.momirealms.customnameplates.bukkit.util.BiomeUtils;
|
||||
import net.momirealms.customnameplates.bukkit.util.EntityData;
|
||||
import net.momirealms.customnameplates.bukkit.util.Reflections;
|
||||
import net.momirealms.customnameplates.common.util.TriConsumer;
|
||||
import net.momirealms.customnameplates.common.util.UUIDUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
@@ -296,27 +297,77 @@ public class BukkitPlatform implements Platform {
|
||||
}
|
||||
}, "ClientboundSetEntityDataPacket", "PacketPlayOutEntityMetadata");
|
||||
|
||||
// not a perfect solution but would work in most cases
|
||||
registerPacketConsumer((player, event, packet) -> {
|
||||
if (!ConfigManager.nametagModule()) return;
|
||||
if (!ConfigManager.hideTeamNames()) return;
|
||||
try {
|
||||
int method = (int) Reflections.field$ClientboundSetPlayerTeamPacket$method.get(packet);
|
||||
if (method == 0 || method == 2) {
|
||||
// How to handle mixed entity team packs
|
||||
// @SuppressWarnings("unchecked")
|
||||
// Collection<String> entities = (Collection<String>) Reflections.field$ClientboundSetPlayerTeamPacket$players.get(packet);
|
||||
// outer: {
|
||||
// for (String entity : entities) {
|
||||
// if (!UUIDUtils.isUUID(entity)) {
|
||||
// break outer;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
@SuppressWarnings("unchecked")
|
||||
Optional<Object> optionalParameters = (Optional<Object>) Reflections.field$ClientboundSetPlayerTeamPacket$parameters.get(packet);
|
||||
if (optionalParameters.isPresent()) {
|
||||
Object parameters = optionalParameters.get();
|
||||
Reflections.field$ClientboundSetPlayerTeamPacket$Parameters$nametagVisibility.set(parameters, "never");
|
||||
String teamName = (String) Reflections.field$ClientboundSetPlayerTeamPacket$name.get(packet);
|
||||
switch (method) {
|
||||
// create
|
||||
case 0 -> {
|
||||
@SuppressWarnings("unchecked")
|
||||
Collection<String> entities = (Collection<String>) Reflections.field$ClientboundSetPlayerTeamPacket$players.get(packet);
|
||||
player.teamView().addTeamMembers(teamName, entities);
|
||||
// additional check for those teams with only one member
|
||||
if (entities.size() <= 1) {
|
||||
for (String entity : entities) {
|
||||
// is a player
|
||||
if (!UUIDUtils.isUUID(entity)) {
|
||||
Player p = Bukkit.getPlayer(entity);
|
||||
// it's a fake player
|
||||
if (p == null) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
Optional<Object> optionalParameters = (Optional<Object>) Reflections.field$ClientboundSetPlayerTeamPacket$parameters.get(packet);
|
||||
if (optionalParameters.isPresent()) {
|
||||
Object parameters = optionalParameters.get();
|
||||
Reflections.field$ClientboundSetPlayerTeamPacket$Parameters$nametagVisibility.set(parameters, "never");
|
||||
}
|
||||
}
|
||||
// remove
|
||||
case 1 -> {
|
||||
player.teamView().removeTeam(teamName);
|
||||
}
|
||||
// update
|
||||
case 2 -> {
|
||||
Set<String> members = player.teamView().getTeamMembers(teamName);
|
||||
if (members == null) return;
|
||||
if (members.size() <= 1) {
|
||||
for (String entity : members) {
|
||||
// is a player
|
||||
if (!UUIDUtils.isUUID(entity)) {
|
||||
Player p = Bukkit.getPlayer(entity);
|
||||
// it's a fake player
|
||||
if (p == null) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
Optional<Object> optionalParameters = (Optional<Object>) Reflections.field$ClientboundSetPlayerTeamPacket$parameters.get(packet);
|
||||
if (optionalParameters.isPresent()) {
|
||||
Object parameters = optionalParameters.get();
|
||||
Reflections.field$ClientboundSetPlayerTeamPacket$Parameters$nametagVisibility.set(parameters, "never");
|
||||
}
|
||||
}
|
||||
// add members
|
||||
case 3 -> {
|
||||
@SuppressWarnings("unchecked")
|
||||
Collection<String> entities = (Collection<String>) Reflections.field$ClientboundSetPlayerTeamPacket$players.get(packet);
|
||||
player.teamView().addTeamMembers(teamName, entities);
|
||||
}
|
||||
// remove members
|
||||
case 4 -> {
|
||||
@SuppressWarnings("unchecked")
|
||||
Collection<String> entities = (Collection<String>) Reflections.field$ClientboundSetPlayerTeamPacket$players.get(packet);
|
||||
player.teamView().removeTeamMembers(teamName, entities);
|
||||
}
|
||||
}
|
||||
} catch (ReflectiveOperationException e) {
|
||||
|
||||
@@ -1006,6 +1006,12 @@ public class Reflections {
|
||||
)
|
||||
);
|
||||
|
||||
public static final Field field$ClientboundSetPlayerTeamPacket$name = requireNonNull(
|
||||
ReflectionUtils.getInstanceDeclaredField(
|
||||
clazz$ClientboundSetPlayerTeamPacket, String.class, 0
|
||||
)
|
||||
);
|
||||
|
||||
public static final Field field$ClientboundSetPlayerTeamPacket$parameters = requireNonNull(
|
||||
ReflectionUtils.getInstanceDeclaredField(
|
||||
clazz$ClientboundSetPlayerTeamPacket, Optional.class, 0
|
||||
|
||||
Reference in New Issue
Block a user