Все потом что я глупый ;D

Версия Minecraft
1.7.10
212
8
29
ВОООООБЩЕМ, хочу что бы лут подбирался на определенную кнопку, так вот , как это сделать?
 

timaxa007

Модератор
5,831
409
672
Подобный вопрос был.
http://forum.mcmodding.ru/%D0%A2%D0%B5%D0%BC%D0%B0-%D0%9A%D0%B0%D0%BA-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-%D0%BF%D0%BE%D0%B4%D0%B1%D0%BE%D1%80-%D0%BB%D1%83%D1%82%D0%B0-%D0%BD%D0%B0-%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D1%83%D1%8E-%D0%BA%D0%BB%D0%B0%D0%B2%D0%B8%D1%88%D1%83
 

timaxa007

Модератор
5,831
409
672

[Набросил и порезал]
На клиентской стороне:
Java:
public class ProxyClient extends ProxyCommon {

    public void preInit() {
        FMLCommonHandler.instance().bus().register(new EventInit());
        RegKey.preInit();
    }

}
Java:
public class EventInit {

    @SubscribeEvent
    public void onKeyInputEvent(InputEvent.KeyInputEvent event) {
        MovingObjectPosition mop = EntityLook.getMouseOver(mc.thePlayer, 1F, 5D, true);
        if (mop == null) return;
        if (mop.typeOfHit != MovingObjectPosition.MovingObjectType.ENTITY) return;
        if (RegKey.use.isPressed()) {
            MessageUpPickup message = new MessageUpPickup();
            message.id = mop.entityHit.getEntityId();
            SMTCommon.network.sendToServer(message);
        }
    }

}
Java:
public class EntityLook {

    public static MovingObjectPosition getMouseOver(EntityLivingBase entity_base, float fasc, double dist, boolean interact) {
        if (entity_base == null || entity_base.worldObj == null) return null;
        Entity pointedEntity = null;
        double d0 = dist;
        double d1 = d0;
        Vec3 vec3 = Vec3.createVectorHelper(entity_base.posX,
                (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT ? entity_base.posY : entity_base.posY + entity_base.getEyeHeight()),
                entity_base.posZ);
        Vec3 vec31 = entity_base.getLook(fasc);
        Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0);
        Vec3 vec33 = null;
        MovingObjectPosition objectMouseOver = rayTrace(entity_base, dist, fasc);

        if (objectMouseOver != null)
            d1 = objectMouseOver.hitVec.distanceTo(vec3);

        float f1 = 1.0F;
        List list = entity_base.worldObj.getEntitiesWithinAABBExcludingEntity(entity_base, entity_base.boundingBox.addCoord(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0).expand((double)f1, (double)f1, (double)f1));
        double d2 = d1;

        for (int i = 0; i < list.size(); ++i) {
            Entity entity = (Entity)list.get(i);

            if (entity.canBeCollidedWith() || interact) {
                float f2 = entity.getCollisionBorderSize();
                AxisAlignedBB axisalignedbb = entity.boundingBox.expand((double)f2, (double)f2, (double)f2);
                MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32);

                if (axisalignedbb.isVecInside(vec3)) {
                    if (0.0D < d2 || d2 == 0.0D) {
                        pointedEntity = entity;
                        vec33 = movingobjectposition == null ? vec3 : movingobjectposition.hitVec;
                        d2 = 0.0D;
                    }
                } else if (movingobjectposition != null) {
                    double d3 = vec3.distanceTo(movingobjectposition.hitVec);

                    if (d3 < d2 || d2 == 0.0D) {
                        if (entity == entity_base.ridingEntity && !entity.canRiderInteract()) {
                            if (d2 == 0.0D) {
                                pointedEntity = entity;
                                vec33 = movingobjectposition.hitVec;
                            }
                        } else {
                            pointedEntity = entity;
                            vec33 = movingobjectposition.hitVec;
                            d2 = d3;
                        }
                    }
                }
            }
        }

        if (pointedEntity != null && (d2 < d1 || objectMouseOver == null))
            return new MovingObjectPosition(pointedEntity, vec33);
        return null;
    }

    public static MovingObjectPosition rayTrace(EntityLivingBase entity, double dist, float fasc) {
        Vec3 vec3 = Vec3.createVectorHelper(entity.posX,
                (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT ? entity.posY : entity.posY + entity.getEyeHeight()),
                entity.posZ);
        Vec3 vec31 = entity.getLook(fasc);
        Vec3 vec32 = vec3.addVector(vec31.xCoord * dist, vec31.yCoord * dist, vec31.zCoord * dist);
        return entity.worldObj.func_147447_a(vec3, vec32, false, false, true);
    }

}
Java:
@SideOnly(Side.CLIENT)
public class RegKey {

    private static final String CAT_NAME = "category.control_button.name";

    public static final KeyBinding use = new KeyBinding("key.use.name", Keyboard.KEY_F, CAT_NAME);

    public static void preInit() {
        ClientRegistry.registerKeyBinding(use);
    }

}
В главный класс:
Java:
public static SimpleNetworkWrapper network;

@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
    MinecraftForge.EVENT_BUS.register(new EventsForge());

    network = NetworkRegistry.INSTANCE.newSimpleChannel(MODID);
    network.registerMessage(MessageUpPickup.Handler.class, MessageUpPickup.class, 0, Side.CLIENT);
    network.registerMessage(MessageUpPickup.Handler.class, MessageUpPickup.class, 0, Side.SERVER);

    proxy.preInit();
}
Java:
public class MessageUpPickup implements IMessage {

    public int id;

    public MessageUpPickup() {}

    @Override
    public void toBytes(ByteBuf buf) {
        buf.writeInt(id);
    }

    @Override
    public void fromBytes(ByteBuf buf) {
        id = buf.readInt();
    }

    public static class Handler implements IMessageHandler<MessageUpPickup, IMessage> {

        @Override
        public IMessage onMessage(MessageUpPickup packet, MessageContext message) {
            if (message.side.isClient())
                act(packet);
            else
                act(message.getServerHandler().playerEntity, packet);
            return null;
        }

        @SideOnly(Side.CLIENT)
        private void act(MessageUpPickup packet) {
            Minecraft mc = Minecraft.getMinecraft();
            if (!EventsForge.pickup.containsKey(mc.thePlayer)) {
                ArrayList list = new ArrayList();
                list.add(packet.id);
                EventsForge.pickup.put(mc.thePlayer, list);
            } else {
                EventsForge.pickup.get(mc.thePlayer).add(packet.id);
            }
        }

        private void act(EntityPlayerMP player, MessageUpPickup packet) {
            if (!EventsForge.pickup.containsKey(player)) {
                ArrayList list = new ArrayList();
                list.add(packet.id);
                EventsForge.pickup.put(player, list);
            } else {
                EventsForge.pickup.get(player).add(packet.id);
            }
        }

    }

}
Java:
public class EventsForge {

    public static final HashMap<EntityPlayer, ArrayList<Integer>> pickup = new HashMap<EntityPlayer, ArrayList<Integer>>();

    @SubscribeEvent
    public void noPuckup(EntityItemPickupEvent event) {
        List<Integer> list = pickup.get(event.entityPlayer);
        if (list != null) {
            for (int i = 0; i < list.size(); ++i) {
                int id = list.get(i);
                if (id == event.item.getEntityId()) {
                    list.remove(i);
                    return;
                }
            }
        }
        event.setCanceled(true);
    }

}
 
Последнее редактирование:
2,505
81
397
timaxa007 написал(а):
Код:
HashMap<EntityPlayer, ArrayList<Integer>>
Не делай так. Игрок выходя с сервере не исчезнет из мапы, и будет утечка. Для таких целей нужно использовать мягкие ссылки. Например, WeakHashMap или другую коллекцию, содержащую WeakReference'ы.
 
Сверху