Узнать имя игрока и изменить ник над головой [1.6.4]

100
0
Очень глупый вопрос, за ранние извиняюсь 
1) как узнать реальный ник игрока (это правильно ? player.getEntityName();)
2) как выводить ник над головой только над теми кто занесен в список друзей
 

timaxa007

Модератор
5,831
409
672
1.
Код:
EntityPlayer player = ...;
...
player.username;
или
player.getEntityName();
или
player.getCommandSenderName();
Проверка имени:
Код:
player.username.equals("Notch")
2. Я точно не знаю, но примерно... Использовать эвент рендер RenderPlayerEvent из под(/суб)-классов, Блокировать рендер ника над головой, за исключения кого-то из списка друзей.
Если во-обще такая возможность блокировки рендера. Если нет, то нужно просто убирать имя над головой, если он не в списке друзей.

[merge_posts_bbcode]Добавлено: 24.02.2016 12:44:48[/merge_posts_bbcode]

... или эвент PlayerEvent.NameFormat и displayname присвоить значение "".
Я точно не знаю, будет-ли работать.
 
100
0
я знаю это в bhj.class в данный момент у меня просто вырезан код вывода ника над головой (не сам вырезал), вот решил модорнезировать так чтобы  ники выводились только друзья в списке. может посмотришь как можно это реализовать.
[merge_posts_bbcode]Добавлено: 24.02.2016 14:42:07[/merge_posts_bbcode]

нашел в каком методе вырезан код  (это в классе package net.minecraft.client.renderer.entity;   public class RenderPlayer)

protected void func_96450_a(AbstractClientPlayer par1AbstractClientPlayer, double par2, double par4, double par6, String par8Str, float par9, double par10)

идеи есть как реализовать вывод только нужных игроков
 
100
0
Я навоял такой типо медод чтобы высвечивались ники только из списка 
Код:
import net.minecraft.client.renderer.entity.RenderPlayer;
@SideOnly(Side.CLIENT)
public class Player_Nick extends RenderPlayer {
    
    public ArrayList player_name = new ArrayList();
    
    @Override
    protected void func_96450_a(AbstractClientPlayer par1AbstractClientPlayer,
            double par2, double par4, double par6, String par8Str, float par9,
            double par10) {
        if (( !par8Str.equalsIgnoreCase("Admin") )||
            (!player_name.contains(par8Str.toLowerCase()) ) )  par10=200.0D;
        
        
        super.func_96450_a(par1AbstractClientPlayer, par2, par4, par6, par8Str, par9,
                par10);
    }
}

Вот скажите его как то надо инициализировать в основном классе, если надо то напишите как
 

timaxa007

Модератор
5,831
409
672
Я всё-же написал эвентом:
Код:
public static Set<String> friend_list = Sets.newHashSet();

static {
    friend_list.add("timaxa007");
    friend_list.add("timaxa001");
}

@SubscribeEvent
public void nameFormat(RenderLivingEvent.Specials.Pre event) {
    if (event.entity != null && event.entity instanceof EntityPlayer) {
        EntityPlayer player = (EntityPlayer)event.entity;
        boolean isFriend = friend_list.contains(player.getCommandSenderName());
        if (!isFriend) {event.setCanceled(true);return;}
    }
}
Только тебе (наверное) нужно использовать не static для friend_list, и не использовать static тело и использовать в нормальном месте. Либо этот лист будет для всех такой.
Вот, как примерно должно выглядеть:

Использовались ники: timaxa007, timaxa009, What и timaxa001, и видны ники: timaxa007 и timaxa001.
 
100
0
да лист я буду подгружать из SQLite для каждого свой , 
а почему эвентом , мой способ не сработает? я меняю параметр расстояния до игрока и по сути у игрока не должно быть ника над головой, только потестить так и не получается  , не повериш еще ни разу некомпелировал
 

timaxa007

Модератор
5,831
409
672
global-as написал(а):
да лист я буду подгружать из SQLite для каждого свой
Я понимал, что будешь свой лист использовать. Но не знал как именно.

global-as написал(а):
а почему эвентом , мой способ не сработает?
Потому-что я такой эвент попробовал, так реализовать задумку. Твой... Не знаю, нужно типа подменить рендер игрока и пока-что я не пробовал подменять рендер игроков (/мобов).

global-as написал(а):
не повериш еще ни разу некомпелировал
Поверить смогу.
 
100
0
проверь плиззз , пол дня тыркался, хочется узнать работает ли мой способ.
 

timaxa007

Модератор
5,831
409
672
global-as, извини не смогу проверить. Так как не знаю где сделать подмену твоего класса.
[merge_posts_bbcode]Добавлено: 24.02.2016 21:08:54[/merge_posts_bbcode]

Вспомнил ужасный способ:
Код:
RenderingRegistry.registerEntityRenderingHandler(EntityPlayer.class, new Player_Nick());
Пока-что, вроде как не сработало написанное, но сам метод и класс работает.
 
100
0
иницеализация неправильная походу он 100% должен работать и подменять значение,  а то что ты событием написал его куда вообще пихать то ? его надо как то инициализировать.
 

timaxa007

Модератор
5,831
409
672
global-as я инициализировал в метод init в классе Клиент Прокси.
 
100
0
слушай попробуй в моем способе еще один вариант super в условие воткнуть  
Код:
if (( !par8Str.equalsIgnoreCase("Admin") )||
            (!player_name.contains(par8Str.toLowerCase()) ) )
        super.func_96450_a(par1AbstractClientPlayer, par2, par4, par6, par8Str, par9,
                par10);

по сути если оно его не будит то и старый метод не будит выполнятся
 

timaxa007

Модератор
5,831
409
672
Не-а. Хотя... Ты понимаешь, что за метод используешь?
 
100
0
да , если код этого метода на клиенте полностью вырезать то ников ни будит. Я просто использую этот класс с пустым методом у себя но игроки просят сделать списки друзей для тех кто играет в команде
 

timaxa007

Модератор
5,831
409
672
Возможно ники в списке команды и могут исчезнуть, я не проверял и пока-что не собираюсь. Но вот ники над головой отвечает метод passSpecialRender.

[merge_posts_bbcode]Добавлено: 25.02.2016 13:53:08[/merge_posts_bbcode]

Кажется, твой метод, тоже работает. Просто условия не правельно написаны.
Ведь у тебя player_name это список друзей?
[merge_posts_bbcode]Добавлено: 25.02.2016 13:56:23[/merge_posts_bbcode]

"Admin" - тоже друг?
[merge_posts_bbcode]Добавлено: 25.02.2016 14:04:27[/merge_posts_bbcode]

Код:
public ArrayList player_name = new ArrayList();

@Override
public void func_96450_a(AbstractClientPlayer par1AbstractClientPlayer, double par2, double par4, double par6, String par8Str, float par9, double par10) {
    if (par8Str.equalsIgnoreCase("Admin") || player_name.contains(par8Str.toLowerCase()))
        super.func_96450_a(par1AbstractClientPlayer, par2, par4, par6, par8Str, par9, par10);
}
 
100
0
Admin это чтоб в админа за зря не стреляли )))))а, блин точно супер перенесли под условие и  !  уже ненужны 

а почему я прицепился к этому методу он выполняется раньше всех остальных (этот метод проверяет условие если игрок ближе чем 100.D от тебя  , тогда ...... и в рендер) ну и чтоб обрезать дальнейшие вычисления думаю его лучше использовать.

ты его через [font=Verdana, Helvetica, Arial, sans-serif]Клиент Прокси инециализировал? [/font]


[font=Verdana, Helvetica, Arial, sans-serif]timaxa007 Огромная тебе благодарность за помощь [/font]
 
100
0
Извини еще раз я так и не понял как прокси это делать как инициализировать то его
 

timaxa007

Модератор
5,831
409
672
Код:
public class ModTest {

public static final String
MODID = "mod_test ",
MODNAME = "ModTest",
VERSION = "0.1"
;

@Mod.Instance(ModTest.MODID) public static ModTest instance;

@SidedProxy(clientSide = "path.ClassProxyClient", serverSide = "path.ClassProxyCommon")
public static ProxyCommon proxy;

@Mod.EventHandler
public void init(FMLInitializationEvent event) {

    proxy.init();

}

Код:
public class ProxyCommon {

    public void init() {

    }

}
Код:
public class ProxyClient extends ProxyCommon {

    @Override
    public void init() {
        super.init();

        RenderingRegistry.registerEntityRenderingHandler(EntityPlayer.class, new Player_Nick());
    }

}
 
Сверху