[1.7.10] Pickup on key / Подбор на кнопку

[1.7.10] Pickup on key / Подбор на кнопку 0.0.1

Нет прав для скачивания
Версия(и) Minecraft
1.7.10
В этом ресурсе Вы узнаете:
  • Как создать кнопку, которая при нажатии подберает предмет с земли.
Скачать исходники
Скачать мод

Немного кода:
Регистрируем кнопку
KeybindsRegister.java:
public static final KeyBinding
    PICKUP_KEY = new KeyBinding(Type.getTranslate("key.pickup"), Keyboard.KEY_F, Type.getTranslate("key.categories.pickup"));

public static void register() {
    setRegister(PICKUP_KEY);
}

private static void setRegister(KeyBinding binding) {
    ClientRegistry.registerKeyBinding(binding);
}

Отменяем ванильный автоподбор предметов
PickupEvent.java:
@SubscribeEvent
public void onItemPickup(EntityItemPickupEvent event) {
    if(event.entity.worldObj.isRemote || !(event.entityLiving instanceof EntityPlayer)) {
        return;
    }   
    event.setCanceled(true);   
}

Отсылаем пакет на поднятие предмета при нажатии кнопки
PacketSender.java:
public Minecraft mc;
RenderItem itemRenderer = new RenderItem();

public PacketSender(Minecraft mc) {
    this.mc = mc;
}

@SubscribeEvent(priority = EventPriority.HIGHEST,receiveCanceled = true)
public void onKeyInput(KeyInputEvent e) {
    if(KeybindsRegister.PICKUP_KEY.isPressed()) {
        if (mc.theWorld.isRemote && mc.objectMouseOver != null && mc.objectMouseOver.hitVec != null) {
            Vec3 hitVec = mc.objectMouseOver.hitVec;
            EntityClientPlayerMP player = mc.thePlayer;
            double playerX = player.posX;
            double playerY = player.posY;
            double segLen = 0.25;
            double segLend2 = 0.125;
            double playerZ = player.posZ;
            double dx = hitVec.xCoord - playerX;
            double dy = hitVec.yCoord - playerY;
            double dz = hitVec.zCoord - playerZ;
            double lineLen = Math.sqrt(Math.pow(dx, 2.0) + Math.pow(dy, 2.0) + Math.pow(dz, 2.0));
            double segNumDouble = lineLen / segLen;
            int segNum = (int)segNumDouble;
            World world = player.getEntityWorld();
            ArrayList<EntityItem> items = null;
            int index = 0;

            while (++index <= segNum) {
                double cenX = playerX + dx / segNumDouble * (double)index;
                double cenY = playerY + dy / segNumDouble * (double)index;
                double cenZ = playerZ + dz / segNumDouble * (double)index;
                AxisAlignedBB curAABB = AxisAlignedBB.getBoundingBox((double)(cenX - segLend2), (double)(cenY - segLend2), (double)(cenZ - segLend2), (double)(cenX + segLend2), (double)(cenY + segLend2), (double)(cenZ + segLend2));
                items = (ArrayList)world.getEntitiesWithinAABB(EntityItem.class, curAABB);
                if (items == null || items.isEmpty()) continue;
                index = segNum + 1;
            }

            if (items != null && !items.isEmpty()) {
                EntityItem closeItem = (EntityItem)items.get(0);
                double closeDist = 100.0;
                for (EntityItem item : items) {
                    double itemDist = Math.pow(item.posX - playerX, 2.0) + Math.pow(item.posY - playerY, 2.0) + Math.pow(item.posZ - playerZ, 2.0);
                    if (itemDist >= closeDist) continue;
                    closeDist = itemDist;
                    closeItem = item;
                }
                PickupNetwork.netHandler.sendToServer(new PickupPacket(closeItem.getEntityId(), player.getEntityId()));
            }
        }
    }
}

@SubscribeEvent(receiveCanceled = true,    priority = EventPriority.HIGHEST)
public void onInGameUI(RenderGameOverlayEvent e) {
    if(e.type == ElementType.ALL) { 
        RenderHelper.disableStandardItemLighting();
        ItemRenderOnFloor.drawItems(e);
        RenderHelper.disableStandardItemLighting();
    }
}

Рендерим предмет и надпись, когда предмет лежит на земле и мы на него смотрим
ItemRenderOnFloor.java:
static RenderItem itemRenderer = new RenderItem();

public static void drawItems(RenderGameOverlayEvent e) {
    Minecraft mc = Minecraft.getMinecraft();
    if(e.type == ElementType.ALL) {
        if (Minecraft.getMinecraft().objectMouseOver != null && Minecraft.getMinecraft().objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
            Vec3 hitVec = mc.objectMouseOver.hitVec;
            EntityClientPlayerMP player = mc.thePlayer;
            double playerX = player.posX;
            double playerY = player.posY;
            double playerZ = player.posZ;
            WorldClient world = mc.theWorld;
            double segLen = 0.25;
            double segLend2 = 0.125;
            double dx = hitVec.xCoord - playerX;
            double dy = hitVec.yCoord - playerY;
            double dz = hitVec.zCoord - playerZ;
            double lineLen = Math.sqrt(Math.pow(dx, 2.0) + Math.pow(dy, 2.0) + Math.pow(dz, 2.0));
            double segNumDouble = lineLen / segLen;
            int segNum = (int)segNumDouble;
            ArrayList<EntityItem> items = null;
            int index = 0;
            while (++index <= segNum) {
                double cenX = playerX + dx / segNumDouble * (double)index;
                double cenY = playerY + dy / segNumDouble * (double)index;
                double cenZ = playerZ + dz / segNumDouble * (double)index;
                AxisAlignedBB curAABB = AxisAlignedBB.getBoundingBox((double)(cenX - segLend2), (double)(cenY - segLend2), (double)(cenZ - segLend2), (double)(cenX + segLend2), (double)(cenY + segLend2), (double)(cenZ + segLend2));
                items = (ArrayList)world.getEntitiesWithinAABB(EntityItem.class, curAABB);
                if (items == null || items.isEmpty()) continue;
                index = segNum + 1;
            }
            if (items != null && !items.isEmpty()) {
                EntityItem closeItem = (EntityItem)items.get(0);
                double closeDist = 100.0;
                for (EntityItem item : items) {
                    double itemDist = Math.pow(item.posX - playerX, 2.0) + Math.pow(item.posY - playerY, 2.0) + Math.pow(item.posZ - playerZ, 2.0);
                    if (itemDist >= closeDist) continue;
                    closeDist = itemDist;
                    closeItem = item;
                }

                String keyName = closeItem.getEntityItem().getDisplayName();
                String itemName = Keyboard.getKeyName(KeybindsRegister.PICKUP_KEY.getKeyCode());
                Minecraft.getMinecraft().fontRenderer.drawString("[" + itemName + "] " + Type.getTranslate("event.pickup"), e.resolution.getScaledWidth() / 2 - 2, e.resolution.getScaledHeight() / 2 + 22, 0xFFFFFF);
                Minecraft.getMinecraft().fontRenderer.drawString(keyName, (e.resolution.getScaledWidth()) / 2 - Minecraft.getMinecraft().fontRenderer.getStringWidth(keyName) - 6, e.resolution.getScaledHeight() / 2 + 22, 0xFFFFFF);
                renderInventorySlot(closeItem.getEntityItem(), e.resolution.getScaledWidth() / 2 - 7, e.resolution.getScaledHeight() / 2 + 6, 0f);               
            }
        }
    }
}

protected static void renderInventorySlot(ItemStack itemStack, double d, int i, float f) {
    Minecraft mc = Minecraft.getMinecraft();

    if(itemStack != null) {
        float f1 = (float)itemStack.animationsToGo - f;
        if(f1 > 0.0F) {
            GL11.glPushMatrix();
            float f2 = 1.0F + f1 / 5.0F;
            GL11.glTranslatef((float)(d + 8), (float)(i + 12), 0.0F);
            GL11.glScalef(1.0F / f2, (f2 + 1.0F) / 2.0F, 1.0F);
            GL11.glTranslatef((float)(-(d + 8)), (float)(-(i + 12)), 0.0F);
        }

        itemRenderer.renderItemIntoGUI(mc.fontRenderer, mc.getTextureManager(), itemStack, (int) d, i);
        if(f1 > 0.0F) {
            GL11.glPopMatrix();
        }
        itemRenderer.renderItemOverlayIntoGUI(mc.fontRenderer, mc.getTextureManager(), itemStack, (int) d, i);
    }
}

Результат:
2020-04-11_03.55.52.png


2020-04-11_03.56.07.png
Автор
Fr0Le
Скачивания
20
Просмотры
1,728
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя Fr0Le

Сверху