[1.7.2] Рендер рук персонажа

Статус
В этой теме нельзя размещать новые ответы.
329
13
Пытаюсь сделать так, чтобы персонаж при взятии пистолета в руки держал его так, как будто он целится из лука.
Код:
@SubscribeEvent
public void onRenderPlayer(RenderPlayerEvent.Pre event)
{
    if (!(event.entityPlayer.inventory.getCurrentItem() == null) && event.entityPlayer.inventory.getCurrentItem().getItem() == Items.apple)
    {
        event.renderer.modelBipedMain.aimedBow = true;
    }
}
Приводит к ошибке The field RenderPlayer.modelBipedMain is not visible

Причина в том, что модификатор доступа modelBipedMain  - private.
Код:
@SideOnly(Side.CLIENT)
public class RenderPlayer extends RendererLivingEntity
{
    private static final ResourceLocation steveTextures = new ResourceLocation("textures/entity/steve.png");
    private ModelBiped modelBipedMain;
    private ModelBiped modelArmorChestplate;
    private ModelBiped modelArmor;
    private static final String __OBFID = "CL_00001020";

    public RenderPlayer()
    {
        super(new ModelBiped(0.0F), 0.5F);
        this.modelBipedMain = (ModelBiped)this.mainModel;
        this.modelArmorChestplate = new ModelBiped(1.0F);
        this.modelArmor = new ModelBiped(0.5F);
    }
// и так далее
}

Пока только думал в сторону 3-х решений:
  • Найти способ добраться до private modelBipedMain;
  • Найти способ изменить метод public void doRender() в классе RenderPlayer;
  • Найти способ полностью заменить ванильный RenderPlayer на свой.

Есть ли у вас идеи, как это сделать?
 
1,990
18
105
Код:
Field f = event.renderer.getClass().getDeclaredField("modelBipedMain");
f.setAccessible(true);
Object val = f.get(event.renderer);
ModelBiped modelBipedMain = (ModelBiped)val;
 
329
13
Анбеливэбл!!!

Код:
@SubscribeEvent
public void onRenderPlayer(RenderPlayerEvent.Pre event) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException
{
    if (!(event.entityPlayer.inventory.getCurrentItem() == null) && event.entityPlayer.inventory.getCurrentItem().getItem() == Items.apple)
    {
        java.lang.reflect.Field f = event.renderer.getClass().getDeclaredField("modelBipedMain");
        f.setAccessible(true);
        Object val = f.get(event.renderer);
        ModelBiped modelBipedMain = (ModelBiped)val;
        modelBipedMain.aimedBow = true;
    }
}

Спасибо, Oldestkon.
Вопрос решен, все работает. Ушел читать о рефлекторе.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Ну разве-что сохранить Field отдельно от рендера. И использовать импорты. И try-catch-и.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху