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

Fr0Le

Активный участник
Пользователь
Баллы
66
Ник в Minecraft
Fr0Le
В этом ресурсе Вы узнаете:
  • Как создать кнопку, которая при нажатии подберает предмет с земли.
Скачать исходники
Скачать мод

Немного кода:
Регистрируем кнопку
KeybindsRegister.java:
PHP:
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);
}

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

Отсылаем пакет на поднятие предмета при нажатии кнопки
PHP:
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();
    }
}

Рендерим предмет и надпись, когда предмет лежит на земле и мы на него смотрим
PHP:
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
 
Прикольно, только такое уже давно на HCS было сделано
 
Прикольно, только такое уже давно на HCS было сделано
И не только на хкс, хотя там сейчас совсем другая система подбора лута. И при этом никакой сервер тебе не даст исходный код или серверную часть мода, если есть разделение.
 
Последнее редактирование:
Бесполезно, но очень интересно. Да и версия дино.
 
Последнее редактирование:
полезно на некоторых тематиках типа DayZ, Metro, Stalker и т.д. а версию и портнуть можно.
Полезно это то, как реализовано в crafting dead. А это хрень. Без обид.
Самый лучший мод на дейз кстати.
 
Последнее редактирование:
без обид, просто одна из реализаций подбора лута с земли на кнопку, а причем здесь подбор лута с трупов? который можно добавить модом Corpse например. или покажи тайм код как подбирается с земли на твоем карфтинг деде.
 
без обид, просто одна из реализаций подбора лута с земли на кнопку, а причем здесь подбор лута с трупов? который можно добавить модом Corpse например. или покажи тайм код как подбирается с земли на твоем карфтинг деде.
Там на видосе смотри, есть и подбор лута с земли, он там лежит прям на земле. Ну и фишка с трупами тоже интересная. Правильно подметил.
 
Не, ну заставил видос смотреть) ну дроп лежит, да прикольно в ItemPhysic такое же есть, при желании это можно все добавить.
Ну вот тебе идея как реализовать. Не ставить же 90 модов ради этого). Извини за давление, если скил не позволяет, тогда ладно.
 
Ну вот тебе идея как реализовать. Не ставить же 90 модов ради этого). Извини за давление, если скил не позволяет, тогда ладно.
Доделаю арена шутер свой и можно будет поковырять
 
Зачем сливать давно слитые исходники, сделай и выложи текущий подбор хкс'а.
 
Зачем сливать давно слитые исходники, сделай и выложи текущий подбор хкс'а.
Почему так агрессивно? Он захотел выложить такой туториал и выложил.
И еще, он ничего не должен делать и выкладывать (это про хкс).
 
Автор увидит, ему будет не приятно, тебе не понять, сомневаюсь, что у тебя есть что украсть.
 
Назад
Верх Низ