Помогите Голограммы над головами игроков

Жду код, который даст надпись НАД ником. Или скрины. Фантазёр.
Жди. (спустя 200 лет появится)

Прост почему то тупанул и воспринимал "над" как "под" (могу, умею, практикую)
 
Жди. (спустя 200 лет появится)

Прост почему то тупанул и воспринимал "над" как "под" (могу, умею, практикую)
Я так и думал.
Scoreboard умеет над ником, то там еще будет число, можете заюзать его как количество игроков в клане, или рейтинг клана. А через Factions api можно узнать вражеский игрок или нет.
Подробнее можно?
 
Не умеет Scoreboard отображать что либо над ником. Товарищи несут хрень.
 
Не умеет Scoreboard отображать что либо над ником. Товарищи несут хрень.
Скор борд - не может.
А вот пакеты - могут.
Не умеет Scoreboard отображать что либо над ником. Товарищи несут хрень.
Не тестил, бейте меня палками...
Java:
package test;

import java.lang.reflect.Field;

import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;

import com.mojang.authlib.GameProfile;

import net.minecraft.server.v1_10_R1.EntityPlayer;
import net.minecraft.server.v1_10_R1.EntityTracker;
import net.minecraft.server.v1_10_R1.WorldServer;

public class Main extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(this, this);
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        this.getServer().getScheduler().runTaskLater(
                this, () -> {
                    try {
                        setPlayerName(e.getPlayer(), "Kek", "Scoreboard magic");
                    } catch (
                            NoSuchFieldException | SecurityException | IllegalArgumentException
                            | IllegalAccessException e1
                    ) {
                        e1.printStackTrace();
                    }
                }, 60L
        );
    }

    private void setPlayerName(Player player, String newname, String scoreboard)
            throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
        EntityPlayer p = ((CraftPlayer) player).getHandle();
        player.setDisplayName(newname);
        WorldServer world = (WorldServer) p.world;
        EntityTracker tracker = world.tracker;
        tracker.untrackEntity(p);
        Field f = GameProfile.class.getDeclaredField("name");
        f.setAccessible(true);
        f.set(p.getProfile(), newname);
        tracker.track(p);
        ScoreboardManager sbManager = Bukkit.getScoreboardManager();
        Scoreboard sb = sbManager.getMainScoreboard();
        Objective OBJECTIVE = sb.registerNewObjective("custom", "dummy");
        OBJECTIVE.setDisplayName(scoreboard);
        OBJECTIVE.setDisplaySlot(DisplaySlot.BELOW_NAME);
        this.getServer().getOnlinePlayers().forEach(ps -> ps.setScoreboard(sb));
    }
}
 
Последнее редактирование:
Скор борд - не может.
А вот пакеты - могут.

Не тестил, бейте меня палками...
Java:
package test;

import java.lang.reflect.Field;

import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;

import com.mojang.authlib.GameProfile;

import net.minecraft.server.v1_10_R1.EntityPlayer;
import net.minecraft.server.v1_10_R1.EntityTracker;
import net.minecraft.server.v1_10_R1.WorldServer;

public class Main extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(this, this);
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        this.getServer().getScheduler().runTaskLater(
                this, () -> {
                    try {
                        setPlayerName(e.getPlayer(), "Kek", "Scoreboard magic");
                    } catch (
                            NoSuchFieldException | SecurityException | IllegalArgumentException
                            | IllegalAccessException e1
                    ) {
                        e1.printStackTrace();
                    }
                }, 60L
        );
    }

    private void setPlayerName(Player player, String newname, String scoreboard)
            throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
        this.getServer().getPluginManager().callEvent(new PlayerQuitEvent(player, "kek"));
        EntityPlayer p = ((CraftPlayer) player).getHandle();
        player.setDisplayName(newname);
        WorldServer world = (WorldServer) p.world;
        EntityTracker tracker = world.tracker;
        tracker.untrackEntity(p);
        Field f = GameProfile.class.getDeclaredField("name");
        f.setAccessible(true);
        f.set(p.getProfile(), newname);
        tracker.track(p);
        this.getServer().getPluginManager().callEvent(new PlayerJoinEvent(player, "kek"));
        ScoreboardManager sbManager = Bukkit.getScoreboardManager();
        Scoreboard sb = sbManager.getMainScoreboard();
        Objective OBJECTIVE = sb.registerNewObjective("custom", "dummy");
        OBJECTIVE.setDisplayName(scoreboard);
        OBJECTIVE.setDisplaySlot(DisplaySlot.BELOW_NAME);
        this.getServer().getOnlinePlayers().forEach(ps -> ps.setScoreboard(sb));
    }
}
Святой.
Спасибо тебе огромное.
Из 2 десятков кода я впервые узнал так много новой, полезной инфы. Премного благодарен.
 
Скор борд - не может.
А вот пакеты - могут.

Не тестил, бейте меня палками...
Java:
package test;

import java.lang.reflect.Field;

import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;

import com.mojang.authlib.GameProfile;

import net.minecraft.server.v1_10_R1.EntityPlayer;
import net.minecraft.server.v1_10_R1.EntityTracker;
import net.minecraft.server.v1_10_R1.WorldServer;

public class Main extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(this, this);
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        this.getServer().getScheduler().runTaskLater(
                this, () -> {
                    try {
                        setPlayerName(e.getPlayer(), "Kek", "Scoreboard magic");
                    } catch (
                            NoSuchFieldException | SecurityException | IllegalArgumentException
                            | IllegalAccessException e1
                    ) {
                        e1.printStackTrace();
                    }
                }, 60L
        );
    }

    private void setPlayerName(Player player, String newname, String scoreboard)
            throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
        this.getServer().getPluginManager().callEvent(new PlayerQuitEvent(player, "kek"));
        EntityPlayer p = ((CraftPlayer) player).getHandle();
        player.setDisplayName(newname);
        WorldServer world = (WorldServer) p.world;
        EntityTracker tracker = world.tracker;
        tracker.untrackEntity(p);
        Field f = GameProfile.class.getDeclaredField("name");
        f.setAccessible(true);
        f.set(p.getProfile(), newname);
        tracker.track(p);
        this.getServer().getPluginManager().callEvent(new PlayerJoinEvent(player, "kek"));
        ScoreboardManager sbManager = Bukkit.getScoreboardManager();
        Scoreboard sb = sbManager.getMainScoreboard();
        Objective OBJECTIVE = sb.registerNewObjective("custom", "dummy");
        OBJECTIVE.setDisplayName(scoreboard);
        OBJECTIVE.setDisplaySlot(DisplaySlot.BELOW_NAME);
        this.getServer().getOnlinePlayers().forEach(ps -> ps.setScoreboard(sb));
    }
}
Только я немного дурачек... Уберите вызов PlayerJoinEvent и PlayerQuitEvent, а то зациклится
 
Назад
Верх