Skip to content

Commit

Permalink
v1_17 part 9: fourth sweep of updates
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Jun 12, 2021
1 parent b0ce228 commit 91d3789
Show file tree
Hide file tree
Showing 10 changed files with 321 additions and 296 deletions.
Expand Up @@ -14,6 +14,10 @@
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import net.md_5.bungee.api.ChatColor;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket;
import net.minecraft.network.protocol.game.ClientboundRemoveEntityPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.level.ServerLevel;
import org.bukkit.Bukkit;
Expand All @@ -34,7 +38,7 @@ public class ProfileEditorImpl extends ProfileEditor {
protected void updatePlayer(Player player, final boolean isSkinChanging) {
final ServerPlayer entityPlayer = ((CraftPlayer) player).getHandle();
final UUID uuid = player.getUniqueId();
PacketPlayOutEntityDestroy destroyPacket = new PacketPlayOutEntityDestroy(entityPlayer.getId());
ClientboundRemoveEntityPacket destroyPacket = new ClientboundRemoveEntityPacket(entityPlayer.getId());
for (Player p : Bukkit.getServer().getOnlinePlayers()) {
if (!p.getUniqueId().equals(uuid)) {
PacketHelperImpl.send(p, destroyPacket);
Expand All @@ -43,8 +47,8 @@ protected void updatePlayer(Player player, final boolean isSkinChanging) {
new BukkitRunnable() {
@Override
public void run() {
PacketPlayOutPlayerInfo playerInfo = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, entityPlayer);
PacketPlayOutNamedEntitySpawn spawnPacket = new PacketPlayOutNamedEntitySpawn(entityPlayer);
ClientboundPlayerInfoPacket playerInfo = new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, entityPlayer);
ClientboundAddPlayerPacket spawnPacket = new ClientboundAddPlayerPacket(entityPlayer);
for (Player player : Bukkit.getServer().getOnlinePlayers()) {
PacketHelperImpl.send(player, playerInfo);
if (!player.getUniqueId().equals(uuid)) {
Expand All @@ -61,15 +65,15 @@ public void run() {
}.runTaskLater(NMSHandler.getJavaPlugin(), 5);
}

public static boolean handleAlteredProfiles(PacketPlayOutPlayerInfo packet, DenizenNetworkManagerImpl manager) {
public static boolean handleAlteredProfiles(ClientboundPlayerInfoPacket packet, DenizenNetworkManagerImpl manager) {
if (ProfileEditor.mirrorUUIDs.isEmpty() && !RenameCommand.hasAnyDynamicRenames()) {
return true;
}
PacketPlayOutPlayerInfo.EnumPlayerInfoAction action = ReflectionHelper.getFieldValue(PacketPlayOutPlayerInfo.class, "a", packet);
if (action != PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER && action != PacketPlayOutPlayerInfo.EnumPlayerInfoAction.UPDATE_DISPLAY_NAME) {
ClientboundPlayerInfoPacket.Action action = ReflectionHelper.getFieldValue(ClientboundPlayerInfoPacket.class, "a", packet);
if (action != ClientboundPlayerInfoPacket.Action.ADD_PLAYER && action != ClientboundPlayerInfoPacket.Action.UPDATE_DISPLAY_NAME) {
return true;
}
List dataList = ReflectionHelper.getFieldValue(PacketPlayOutPlayerInfo.class, "b", packet);
List dataList = ReflectionHelper.getFieldValue(ClientboundPlayerInfoPacket.class, "b", packet);
if (dataList == null) {
return true;
}
Expand All @@ -84,19 +88,19 @@ public static boolean handleAlteredProfiles(PacketPlayOutPlayerInfo packet, Deni
if (!any) {
return true;
}
GameProfile ownProfile = manager.player.getProfile();
GameProfile ownProfile = manager.player.getGameProfile();
for (Object data : dataList) {
GameProfile gameProfile = (GameProfile) playerInfoData_gameProfile.get(data);
if (!ProfileEditor.mirrorUUIDs.contains(gameProfile.getId()) && !RenameCommand.customNames.containsKey(gameProfile.getId())) {
PacketPlayOutPlayerInfo newPacket = new PacketPlayOutPlayerInfo(action);
List newPacketDataList = ReflectionHelper.getFieldValue(PacketPlayOutPlayerInfo.class, "b", newPacket);
ClientboundPlayerInfoPacket newPacket = new ClientboundPlayerInfoPacket(action);
List newPacketDataList = ReflectionHelper.getFieldValue(ClientboundPlayerInfoPacket.class, "b", newPacket);
newPacketDataList.add(data);
manager.oldManager.send(newPacket);
}
else {
String rename = RenameCommand.getCustomNameFor(gameProfile.getId(), manager.player.getBukkitEntity(), false);
PacketPlayOutPlayerInfo newPacket = new PacketPlayOutPlayerInfo(action);
List newPacketDataList = ReflectionHelper.getFieldValue(PacketPlayOutPlayerInfo.class, "b", newPacket);
ClientboundPlayerInfoPacket newPacket = new ClientboundPlayerInfoPacket(action);
List newPacketDataList = ReflectionHelper.getFieldValue(ClientboundPlayerInfoPacket.class, "b", newPacket);
GameProfile patchedProfile = new GameProfile(gameProfile.getId(), rename != null ? (rename.length() > 16 ? rename.substring(0, 16) : rename) : gameProfile.getName());
if (ProfileEditor.mirrorUUIDs.contains(gameProfile.getId())) {
patchedProfile.getProperties().putAll(ownProfile.getProperties());
Expand All @@ -105,7 +109,7 @@ public static boolean handleAlteredProfiles(PacketPlayOutPlayerInfo packet, Deni
patchedProfile.getProperties().putAll(gameProfile.getProperties());
}
String listRename = RenameCommand.getCustomNameFor(gameProfile.getId(), manager.player.getBukkitEntity(), true);
IChatBaseComponent displayName = listRename != null ? Handler.componentToNMS(FormattedTextHelper.parse(listRename, ChatColor.WHITE)) : (IChatBaseComponent) playerInfoData_displayName.get(data);
Component displayName = listRename != null ? Handler.componentToNMS(FormattedTextHelper.parse(listRename, ChatColor.WHITE)) : (Component) playerInfoData_displayName.get(data);
Object newData = playerInfoData_construct.newInstance(newPacket, patchedProfile, playerInfoData_latency.getInt(data), playerInfoData_gamemode.get(data), displayName);
newPacketDataList.add(newData);
manager.oldManager.send(newPacket);
Expand All @@ -119,12 +123,12 @@ public static boolean handleAlteredProfiles(PacketPlayOutPlayerInfo packet, Deni
}
}

public static void updatePlayerProfiles(PacketPlayOutPlayerInfo packet) {
PacketPlayOutPlayerInfo.EnumPlayerInfoAction action = ReflectionHelper.getFieldValue(PacketPlayOutPlayerInfo.class, "a", packet);
if (action != PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER) {
public static void updatePlayerProfiles(ClientboundPlayerInfoPacket packet) {
ClientboundPlayerInfoPacket.Action action = ReflectionHelper.getFieldValue(ClientboundPlayerInfoPacket.class, "a", packet);
if (action != ClientboundPlayerInfoPacket.Action.ADD_PLAYER) {
return;
}
List<?> dataList = ReflectionHelper.getFieldValue(PacketPlayOutPlayerInfo.class, "b", packet);
List<?> dataList = ReflectionHelper.getFieldValue(ClientboundPlayerInfoPacket.class, "b", packet);
if (dataList != null) {
try {
for (Object data : dataList) {
Expand Down Expand Up @@ -162,7 +166,7 @@ private static GameProfile getGameProfile(PlayerProfile playerProfile) {
Field pidLatency = null, pidGamemode = null, pidGameProfile = null, pidDisplayName = null;
Constructor pidConstruct = null;
try {
for (Class clzz : PacketPlayOutPlayerInfo.class.getDeclaredClasses()) {
for (Class clzz : ClientboundPlayerInfoPacket.class.getDeclaredClasses()) {
if (CoreUtilities.toLowerCase(clzz.getName()).contains("infodata")) { // PlayerInfoData.
pid = clzz;
pidLatency = clzz.getDeclaredField("b");
Expand Down
Expand Up @@ -5,82 +5,95 @@
import com.denizenscript.denizen.nms.abstracts.Sidebar;
import com.denizenscript.denizen.utilities.FormattedTextHelper;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizen.utilities.debugging.Debug;
import net.md_5.bungee.api.ChatColor;
import net.minecraft.network.chat.IChatBaseComponent;
import net.minecraft.network.protocol.game.PacketPlayOutScoreboardDisplayObjective;
import net.minecraft.network.protocol.game.PacketPlayOutScoreboardObjective;
import net.minecraft.network.protocol.game.PacketPlayOutScoreboardScore;
import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam;
import net.minecraft.server.ScoreboardServer;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.protocol.game.ClientboundSetDisplayObjectivePacket;
import net.minecraft.network.protocol.game.ClientboundSetObjectivePacket;
import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket;
import net.minecraft.network.protocol.game.ClientboundSetScorePacket;
import net.minecraft.server.ServerScoreboard;
import net.minecraft.world.scores.Objective;
import net.minecraft.world.scores.PlayerTeam;
import net.minecraft.world.scores.Scoreboard;
import net.minecraft.world.scores.ScoreboardObjective;
import net.minecraft.world.scores.ScoreboardTeam;
import net.minecraft.world.scores.criteria.IScoreboardCriteria;
import net.minecraft.world.scores.criteria.ObjectiveCriteria;
import org.bukkit.entity.Player;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;

public class SidebarImpl extends Sidebar {

public static final Scoreboard dummyScoreboard = new Scoreboard();
public static final IScoreboardCriteria dummyCriteria = new IScoreboardCriteria("dummy"); // what
public static Scoreboard dummyScoreboard = new Scoreboard();
public static ObjectiveCriteria dummyCriteria;

private ScoreboardObjective obj1;
private ScoreboardObjective obj2;
static {
try {
Constructor<ObjectiveCriteria> constructor = ObjectiveCriteria.class.getConstructor(String.class);
constructor.setAccessible(true);
dummyCriteria = constructor.newInstance("dummy");
}
catch (Throwable ex) {
Debug.echoError(ex);
}
}

public Objective obj1;
public Objective obj2;

public SidebarImpl(Player player) {
super(player);
IChatBaseComponent chatComponentTitle = Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE));
this.obj1 = new ScoreboardObjective(dummyScoreboard, "dummy_1", dummyCriteria, chatComponentTitle, IScoreboardCriteria.EnumScoreboardHealthDisplay.INTEGER);
this.obj2 = new ScoreboardObjective(dummyScoreboard, "dummy_2", dummyCriteria, chatComponentTitle, IScoreboardCriteria.EnumScoreboardHealthDisplay.INTEGER);
MutableComponent chatComponentTitle = Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE));
this.obj1 = new Objective(dummyScoreboard, "dummy_1", dummyCriteria, chatComponentTitle, ObjectiveCriteria.RenderType.INTEGER);
this.obj2 = new Objective(dummyScoreboard, "dummy_2", dummyCriteria, chatComponentTitle, ObjectiveCriteria.RenderType.INTEGER);
}

@Override
protected void setDisplayName(String title) {
if (this.obj1 != null) {
IChatBaseComponent chatComponentTitle = Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE));
MutableComponent chatComponentTitle = Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE));
this.obj1.setDisplayName(chatComponentTitle);
this.obj2.setDisplayName(chatComponentTitle);
}
}

public List<ScoreboardTeam> generatedTeams = new ArrayList<>();
public List<PlayerTeam> generatedTeams = new ArrayList<>();

@Override
public void sendUpdate() {
List<ScoreboardTeam> oldTeams = generatedTeams;
List<PlayerTeam> oldTeams = generatedTeams;
generatedTeams = new ArrayList<>();
PacketHelperImpl.send(player, new PacketPlayOutScoreboardObjective(this.obj1, 0));
PacketHelperImpl.send(player, new ClientboundSetObjectivePacket(this.obj1, 0));
for (int i = 0; i < this.lines.length; i++) {
String line = this.lines[i];
if (line == null) {
break;
}
String lineId = Utilities.generateRandomColors(8);
ScoreboardTeam team = new ScoreboardTeam(dummyScoreboard, lineId);
team.getPlayerNameSet().add(lineId);
team.setPrefix(Handler.componentToNMS(FormattedTextHelper.parse(line, ChatColor.WHITE)));
PlayerTeam team = new PlayerTeam(dummyScoreboard, lineId);
team.getPlayers().add(lineId);
team.setPlayerPrefix(Handler.componentToNMS(FormattedTextHelper.parse(line, ChatColor.WHITE)));
generatedTeams.add(team);
PacketHelperImpl.send(player, new PacketPlayOutScoreboardTeam(team, 0));
PacketHelperImpl.send(player, new PacketPlayOutScoreboardScore(ScoreboardServer.Action.CHANGE, obj1.getName(), lineId, this.scores[i]));
PacketHelperImpl.send(player, ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, false));
PacketHelperImpl.send(player, new ClientboundSetScorePacket(ServerScoreboard.Method.CHANGE, obj1.getName(), lineId, this.scores[i]));
}
PacketHelperImpl.send(player, new PacketPlayOutScoreboardDisplayObjective(1, this.obj1));
PacketHelperImpl.send(player, new PacketPlayOutScoreboardObjective(this.obj2, 1));
ScoreboardObjective temp = this.obj2;
PacketHelperImpl.send(player, new ClientboundSetDisplayObjectivePacket(1, this.obj1));
PacketHelperImpl.send(player, new ClientboundSetObjectivePacket(this.obj2, 1));
Objective temp = this.obj2;
this.obj2 = this.obj1;
this.obj1 = temp;
for (ScoreboardTeam team : oldTeams) {
PacketHelperImpl.send(player, new PacketPlayOutScoreboardTeam(team, 1));
for (PlayerTeam team : oldTeams) {
PacketHelperImpl.send(player, ClientboundSetPlayerTeamPacket.createRemovePacket(team));
}
}

@Override
public void remove() {
for (ScoreboardTeam team : generatedTeams) {
PacketHelperImpl.send(player, new PacketPlayOutScoreboardTeam(team, 1));
for (PlayerTeam team : generatedTeams) {
PacketHelperImpl.send(player, ClientboundSetPlayerTeamPacket.createRemovePacket(team));
}
generatedTeams.clear();
PacketHelperImpl.send(player, new PacketPlayOutScoreboardObjective(this.obj2, 1));
PacketHelperImpl.send(player, new ClientboundSetObjectivePacket(this.obj2, 1));
}
}

0 comments on commit 91d3789

Please sign in to comment.