Welcome to Bukkit France

Inscrivez-vous maintenant pour profiter d'un accès total à tout le contenu offert par la meilleur communauté Bukkit française ! Une fois inscrit et connecté, vous pourrez contribuez à la communauté en postant vos propres sujets et questions ou en répondant à ceux existants. Vous pourrez aussi customiser votre profil, recevoir des points de réputations, communiquer avec les autres membres via le chat, et plus encore! 

  • Annonces

    • Pskyco

      Bukkit France passe sous Discord !   02/20/16

      Bukkit France est désormais passé sur Discord, au revoir donc notre vieux Teamspeak ! Téléchargez le client et venez nous rejoindre sur notre salon en suivant les instructions suivantes.
      M-à-j du 25/02/2017 : Désormais, seuls les comptes actifs sur le forum se verront donner l'accès au Discord, ce dernier n'est pas une plateforme d'aide de la même manière que le chat.
PYRRH4

ScoreboardSign en 1.7.10

2 messages dans ce sujet

Bonsoir !

 

API : Spigot 1.7.10

IDE : Eclipse

 

Voilà, j'essaie d'adapter le ScoreboardSign de zyuiop pour la 1.7.10. Je décompile donc nms pour changer les fields etc, pas d'erreur, mais mon scoreboard ne s'affiche tout simplement pas.

 

Spoiler
package be.pyrrh4.core.util.compat.scoreboard;

import java.lang.reflect.Field;
import java.util.Collection;

import net.minecraft.server.v1_7_R4.Packet;
import net.minecraft.server.v1_7_R4.PacketPlayOutScoreboardDisplayObjective;
import net.minecraft.server.v1_7_R4.PacketPlayOutScoreboardObjective;
import net.minecraft.server.v1_7_R4.PacketPlayOutScoreboardScore;
import net.minecraft.server.v1_7_R4.PacketPlayOutScoreboardTeam;
import net.minecraft.server.v1_7_R4.PlayerConnection;

import org.apache.commons.lang.Validate;
import org.bukkit.ChatColor;
import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer;
import org.bukkit.entity.Player;

/**
 * @author zyuiop
 * @author Seveningful
 */

public class ScoreboardSign_1_7_10 implements ScoreboardSign
{
	private boolean created = false;
	private String[] lines = new String[16];
	private PacketPlayOutScoreboardTeam[] teams = new PacketPlayOutScoreboardTeam[16];
	private final Player player;
	private String objectiveName;

	public ScoreboardSign_1_7_10(Player player, String objectiveName) {
		this.player = player;
		this.objectiveName = objectiveName;
	}

	public ScoreboardSign_1_7_10(Player player, String objectiveName, String[] lines) {
		this.player = player;
		this.objectiveName = objectiveName;
		this.lines = lines;
	}

	public void create() {
		if (created) return;

		PlayerConnection player = getPlayer();
		player.sendPacket(createObjectivePacket(0, objectiveName));
		player.sendPacket(setObjectiveSlot());
		int i = 0;
		while (i < lines.length)
		{
			sendLine(i++);
		}

		created = true;
	}

	public void destroy() {
		if (!created)
			return;

		getPlayer().sendPacket(createObjectivePacket(1, null));

		created = false;
	}

	private PlayerConnection getPlayer() {
		return ((CraftPlayer) player).getHandle().playerConnection;
	}

	private Packet sendLine(int line) {
		if (line > 15)
			return null;
		if (line < 0)
			return null;
		if (!created)
			return null;
		PacketPlayOutScoreboardTeam teamPacket = apply(line);
		int score = 15-line;
		getPlayer().sendPacket(teamPacket);
		return sendScore(ChatColor.values()[line].toString() + ChatColor.RESET , score);
	}

	public void setObjectiveName(String name) {
		this.objectiveName = name;
		if (created)
			getPlayer().sendPacket(createObjectivePacket(2, name));
	}

	public void setLine(int line, String value) {
		lines[line] = value;
		getPlayer().sendPacket(sendLine(line));
	}

	public void removeLine(int line) {
		String oldLine = getLine(line);
		if (oldLine != null && created)
			getPlayer().sendPacket(removeLine(oldLine));

		lines[line] = null;
	}

	public void clearLines()
	{
		for (int i = 0; i < 16; i++)
			removeLine(i);
	}

	public String getLine(int line) {
		if (line > 15)
			return null;
		if (line < 0)
			return null;
		return lines[line];
	}

	/*
    Factories
	 */
	private PacketPlayOutScoreboardObjective createObjectivePacket(int mode, String displayName) {
		PacketPlayOutScoreboardObjective packet = new PacketPlayOutScoreboardObjective();
		try {
			// Nom de l'objectif
			Field name = packet.getClass().getDeclaredField("a");
			name.setAccessible(true);
			name.set(packet, player.getName());

			// Mode
			// 0 : créer
			// 1 : Supprimer
			// 2 : Mettre à jour
			Field modeField = packet.getClass().getDeclaredField("c");
			modeField.setAccessible(true);
			modeField.set(packet, mode);

			if (mode == 0 || mode == 2) {
				Field displayNameField = packet.getClass().getDeclaredField("b");
				displayNameField.setAccessible(true);
				displayNameField.set(packet, displayName);

				/*Field display = packet.getClass().getDeclaredField("c");
				display.setAccessible(true);
				display.set(packet, IScoreboardCriteria.EnumScoreboardHealthDisplay.INTEGER);*/
			}
		} catch (NoSuchFieldException | IllegalAccessException e) {
			e.printStackTrace();
		}

		return packet;
	}

	private PacketPlayOutScoreboardDisplayObjective setObjectiveSlot() {
		PacketPlayOutScoreboardDisplayObjective packet = new PacketPlayOutScoreboardDisplayObjective();
		try {
			// Slot de l'objectif
			Field position = packet.getClass().getDeclaredField("a");
			position.setAccessible(true);
			position.set(packet, 1); // SideBar

			Field name = packet.getClass().getDeclaredField("b");
			name.setAccessible(true);
			name.set(packet, player.getName());
		} catch (NoSuchFieldException | IllegalAccessException e) {
			e.printStackTrace();
		}

		return packet;
	}

	private PacketPlayOutScoreboardScore sendScore(String line, int score) {
		PacketPlayOutScoreboardScore packet = new PacketPlayOutScoreboardScore(line);
		try {
			Field name = packet.getClass().getDeclaredField("b");
			name.setAccessible(true);
			name.set(packet, player.getName());

			Field scoreField = packet.getClass().getDeclaredField("c");
			scoreField.setAccessible(true);
			scoreField.set(packet, score); // SideBar

			Field action = packet.getClass().getDeclaredField("d");
			action.setAccessible(true);
			action.set(packet, 2); // 0 ? ou 1 ? tabarnak
		} catch (NoSuchFieldException | IllegalAccessException e) {
			e.printStackTrace();
		}

		return packet;
	}

	private PacketPlayOutScoreboardScore removeLine(String line) {
		return new PacketPlayOutScoreboardScore(line);
	}

	public Player getBukkitPlayer() {
		return player;
	}

	public String getDisplayName() {
		return objectiveName;
	}

	public String[] getLines() {
		return lines;
	}


	private String[] splitString(String string)
	{
		Validate.isTrue(string.length() <= 32, "String can't have more than 32 characters " );
		if (string.isEmpty()) {
			return new String[] { " ", "" };
		}
		StringBuilder prefix = new StringBuilder(string.substring(0, string.length() >= 16 ? 16 : string.length()));
		StringBuilder suffix = new StringBuilder(string.length() > 16 ? string.substring(16) : "");
		if (prefix.charAt(prefix.length() - 1) == '§')
		{
			prefix.deleteCharAt(prefix.length() - 1);
			suffix.insert(0, '§');
		}
		if(!suffix.toString().isEmpty())
			suffix.insert(0, ChatColor.getLastColors(prefix.toString()));

		return new String[] { prefix.toString().length() > 16 ? prefix.toString().substring(0, 16) : prefix.toString(), suffix.toString().length() > 16 ? suffix.toString().substring(0, 16) : suffix.toString() };
	}


	private PacketPlayOutScoreboardTeam apply(int line){
		if(teams[line] != null)
		{
			setField(getTeamLine(line), "f", 2);
			setField(getTeamLine(line), "c", splitString(getLine(line))[0]);
			setField(getTeamLine(line), "d", splitString(getLine(line))[1]);
		}


		return getTeamLine(line);
	}

	private PacketPlayOutScoreboardTeam getTeamLine(int line) {
		if(teams[line] == null)
		{
			PacketPlayOutScoreboardTeam team = new PacketPlayOutScoreboardTeam();
			setField(team, "a", line + "");
			setField(team, "b", line + "");
			setField(team, "c", splitString(getLine(line))[0]);
			setField(team, "d", splitString(getLine(line))[1]);
			addEntry(team, ChatColor.values()[line].toString() + ChatColor.RESET);
			teams[line] = team;
		}
		return teams[line];
	}


	private static void setField(PacketPlayOutScoreboardTeam packet, String field, Object value) {
		try {
			Field f = packet.getClass().getDeclaredField(field);
			f.setAccessible(true); f.set(packet, value); f.setAccessible(false);
		} catch (Exception ex) {ex.printStackTrace();}
	}

	@SuppressWarnings("unchecked")
	private void addEntry(PacketPlayOutScoreboardTeam packet, String entry) {
		Field f = null;
		try {
			f = packet.getClass().getDeclaredField("e");
			f.setAccessible(true);
			((Collection<String>) f.get(packet)).add(entry);
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}

 

 

Une idée du problème ? :3

 

Cdt, PYRRH4

Modifié par PYRRH4

Partager ce message


Lien à poster
Partager sur d’autres sites

Je me permets de UP car je n'ai pas trouvé de solution. :P

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant

  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.