Как достать игрока в IRecipe

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.7.10
73
1
Нужно достать игрока, который крафтит в методе matches в IRecipe
Уже спрашивал, думал, что нашел решение, но проверял я плохо
Dragon2488, eventHandler у InventoryCrafting private
 
Решение
Код:

Код:
class yourClass implements IRecipe {

    private static final Field eventHandlerField = ReflectionHelper.findField(InventoryCrafting.class, "eventHandler", "field_70465_c");
private static final Field containerPlayerPlayerField = ReflectionHelper.findField(ContainerPlayer.class, "thePlayer", "field_82862_h");
    private static final Field slotCraftingPlayerField = ReflectionHelper.findField(SlotCrafting.class, "thePlayer", "field_75238_b");

    @SubscribeEvent
    public void onCrafting(PlayerEvent.ItemCraftedEvent event) {
           //TODO
    }

    @Override
    public boolean matches(InventoryCrafting p_77569_1_, World p_77569_2_) {
        EntityPlayer player=findPlayer(p_77569_1_); //получаем игрока...
7,099
324
1,510
Рефлексия


Но идея с рефлексией не очень - будет лагать
 
2,505
81
397
Лагать будет, если обращаться к ней слишком часто, например, каждый тик. И то, наврятли заметишь. Но все равно, это не лучшая идея.


Конкретного игрока никак не достанешь. Можно, конечно, достать Container , а из него достать список кравтеров. Но это все же список игроков.


Я так понял, ты не знаешь, что такое рефлексия. Смотри ReflectionHelper
 
1,239
2
24
Код:

Код:
class yourClass implements IRecipe {

    private static final Field eventHandlerField = ReflectionHelper.findField(InventoryCrafting.class, "eventHandler", "field_70465_c");
private static final Field containerPlayerPlayerField = ReflectionHelper.findField(ContainerPlayer.class, "thePlayer", "field_82862_h");
    private static final Field slotCraftingPlayerField = ReflectionHelper.findField(SlotCrafting.class, "thePlayer", "field_75238_b");

    @SubscribeEvent
    public void onCrafting(PlayerEvent.ItemCraftedEvent event) {
           //TODO
    }

    @Override
    public boolean matches(InventoryCrafting p_77569_1_, World p_77569_2_) {
        EntityPlayer player=findPlayer(p_77569_1_); //получаем игрока
         
        if(player != null && player.inventory.hasItem(Items.ender_eye) ){
            return true; //если в инвентаре есть глаз эндермена-то рецепт "совпадает"
        }

        return false; //есть нет-то не совпадает
    }

    //нужный метод на игрока
    private static EntityPlayer findPlayer(InventoryCrafting inv) {
        try {
            Container container = (Container) eventHandlerField.get(inv);
            if (container instanceof ContainerPlayer) {
                return (EntityPlayer) containerPlayerPlayerField.get(container);
            } else if (container instanceof ContainerWorkbench) {
                return (EntityPlayer) slotCraftingPlayerField.get(container.getSlot(0));
            } else {

                return null;
            }
        } catch (Exception e) {
            throw Throwables.propagate(e);
        }
    }

    
    //Результат крафта
    /*
     Если во 2-м слоте,первой строки верстака есть палка,то рецепт совпадет,и мы получим яблоко 
      */
    @Override
    public ItemStack getCraftingResult(InventoryCrafting inv) {
            ItemStack stack = inv.getStackInSlot(1);
            if (stack != null) {
                if (stack.getItem() == Items.stick) {
                        return new ItemStack(Items.apple);
                }
            }
        return null;
    }

    @Override
    public int getRecipeSize() {
        return 0;
    }

    @Override
    public ItemStack getRecipeOutput() {
        return null;
    }


Проверял на сервереклиенте,всё работает.
 
7,099
324
1,510
eventHandlerField.get(inv)
может, сразу вот так сохранить, а не Field? Обращение к приватному полю через get - тоже рефлексия
 
73
1
hohserg написал(а):
eventHandlerField.get(inv)
может, сразу вот так сохранить, а не Field? Обращение к приватному полю через get - тоже рефлексия
inv при каждом вызове другой дается
 
73
1
всё работает, всем спасибо, хирургу отдельное спасибо, можно закрывать
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху