Сложноватая тема 1.6.4

96
1
Всем привет, уф... в общем, я тут решила сделать своим итемам различные свойства. Ну, тут просто много придумала и хотела бы узнать можно ли вообще это сделать. Что я хотела сделать:

1. Сделать так чтобы описание у предмета открывалось после клика на него указателем и стояла даже если мышка ушла с этого предмета, а убиралось когда снова по нему кликнули.

2. Сделать так чтобы (если, то что я написала выше будет работать) некоторые слова в описании были активны (например словосочетание: "Дать предмет" и игроку даётся предмет). Хотя можно и Gui сделать, но для меня это сложно

В общем как-то так... я пыталась что-то делать, но не получилось. Просто не имею понятия как это сделать. Ну вот и захотела узнать, реально ли это вообще сделать?

СПАСИБО ЗА ОТВЕТЫ
 
1. Да это вполне возможно, но не по клику мыши. По клику ПКМ и ЛКМ делаются другие действия, желательно использовать по клику (или нажатию, зажатию) клавиши клавиатуры (я знаю только как с использованием NBT тега).

2. Если я правильно понял, то тут нужно использовать "StatCollector.translateToLocal("text.bla1")", в методе описании предмета наподобие "list.add("text.bla1");", а в фале ru_RU.lang написано "text.bla1=Какой-то текст." . Очень удобно когда у (твоего) мода используется несколько языков.
 
timaxa007 написал(а):
1. Да это вполне возможно, но не по клику мыши. По клику ПКМ и ЛКМ делаются другие действия, желательно использовать по клику (или нажатию, зажатию) клавиши клавиатуры (я знаю только как с использованием NBT тега).

2. Если я правельно понял, то тут нужно использовать "StatCollector.translateToLocal("text.bla1")", в методе описании предмета наподобие "list.add("text.bla1");", а в фале ru_RU.lang написано "text.bla1=Какой-то текст." . Очень удобно когда у (твоего) мода используется несколько языков.
Можешь рассказать подробней об первом, например нажимаем на предмет колёсиком мыши (или клавишей I,ш) Пожалуйста
 
Все сложнее чем кажется. Клавиатура - клиент, нбт - сервер. Без пакетов не обойтись.
 
NATALI, я по-подробнее не смогу, я только примерно написать. И я как-то не подумал об том, чтобы мышка стрелки была наведена на наш предмет и при этом были изменения по нажатию. Примерный рассказ:
- Создать или вызвать NBTTagCompound для нашего предмета в методе в котором есть ItemStack.
- Потом с условиями "Keyboard.isKeyDown(Keyboard.KEY_I)", выполняешь дальнейшие действия.
- Создать или вызвать Тег с Boolean значением для предмета. Если вызываешь тег, то гетишь, затем сетишь. Если не вызываешь, а создаёшь тег, то сетишь.
- Затем NBTTagCompound сохраняешь в ItemStack, чтобы потом вызвать в каком либо методе, где есть ItemStack и вызываешь наш тег для условиях. Если наш тег со значением false или он отсутствует, ну... Как-то так.
Мне как-то всегда было привычнее показывать готовый код, так как в объяснениях часто не видят как это делать.
---
Dragon2488 написал(а):
Все сложнее чем кажется. Клавиатура - клиент, нбт - сервер. Без пакетов не обойтись.
Ну, да это тоже правда.
 
Спасибо большое Timaxa007, ну, буду знать что это вообще возможно + ты мне дал хорошие подсказки о которых я не знала, спасибо.
 
У меня система пакетов выглядит так:
Код:
//Интерфейс, который должен имплементить пакет.
public interface IPacket  {

    //В этом методе ты пишешь данные в ByteBuf'ер.
    void write(ByteBuf buf);
    //В этом методе ты читаешь данные из ByteBuf'ера.
    void read(ByteBuf buf);
    //В этом методе ты выполняешь пакет. В аргументах дается сторона. Это либо сервер, Либо клиент.
    void execute(Side side);
}
Код:
//Кодировка пакетов.
public class PacketCodec extends FMLIndexedMessageToMessageCodec<IPacket> {
    
    //Кодит данные из нашего пакета.
    @Override
    public void encodeInto(ChannelHandlerContext ctx, IPacket msg, ByteBuf target) throws Exception {
        msg.write(target);
    }
    
    //Декодит данные из нашего пакета.
    @Override
    public void decodeInto(ChannelHandlerContext ctx, ByteBuf source, IPacket msg) {
        msg.read(source);
    }
}
Код:
//Исполнитель наших пакетов. Исполняет их на определенной стороне.
@ChannelHandler.Sharable
public class PacketHandler extends SimpleChannelInboundHandler<IPacket> {

    //Сторона на которой работает.
    private Side side;

    //Задаем сторону на которой работает.
    public PacketHandler(Side side1) {
        side = side1;
    }

    //Это то что исполняет наши пакеты.
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, IPacket msg) throws Exception {
       msg.execute(side);
    }
}
Код:
public class PacketManager {

    //Как бы 'цель'. Объяснить не могу.
    private AttributeKey<FMLOutboundHandler.OutboundTarget> target = FMLOutboundHandler.FML_MESSAGETARGET;
    //Аргументы для цели.
    private AttributeKey<Object> arg = FMLOutboundHandler.FML_MESSAGETARGETARGS;
    //Ошибка при неудаче.
    private ChannelFutureListener failExc = ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE;



    //Клиентский канал.
    public FMLEmbeddedChannel client = null;
    //Серверный канал.
    public FMLEmbeddedChannel server = null;

    //Инициализируем наш пакет мэнэджер. Это надо делать в пре ините.
    public void init() {
        EnumMap<Side, FMLEmbeddedChannel> channels = NetworkRegistry.INSTANCE.newChannel("technomagency", new PacketCodec());
        client = channels.get(Side.CLIENT);
        server = channels.get(Side.SERVER);
        client.pipeline().addAfter(client.findChannelHandlerNameForType(PacketCodec.class), "executor", new PacketHandler(Side.CLIENT));
        server.pipeline().addAfter(client.findChannelHandlerNameForType(PacketCodec.class), "executor", new PacketHandler(Side.SERVER));
    }

    //Сгенерировать ванильный пакет из нашего.
    public Packet getPacketFrom(IPacket packet) {
       return server.generatePacketFrom(packet);
    }

    //Отправить серверу.
    public void sendToServer(IPacket packet) {
        client.attr(target).set(FMLOutboundHandler.OutboundTarget.TOSERVER);
        client.writeAndFlush(packet).addListener(failExc);
    }
    //Отправить всем.
    public void sendToAll(IPacket packet)  {
        server.attr(target).set(FMLOutboundHandler.OutboundTarget.ALL);
        server.writeAndFlush(packet).addListener(failExc);
    }

    //Отправить определенному игроку.
    public void sendTo(Packet packet, EntityPlayerMP player) {
        server.attr(target).set(FMLOutboundHandler.OutboundTarget.PLAYER);
        server.attr(arg).set(player);
        server.writeAndFlush(packet).addListener(failExc);
    }

    //Отправить всем в радиусе.
    public void sendToAllAround(IPacket packet, int x, int y, int z, int range, int dim) {
        server.attr(target).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT);
        server.attr(arg).set(new NetworkRegistry.TargetPoint(dim, x, y, z, range));
        server.writeAndFlush(packet).addListener(failExc);
    }

    //Отправить в измерение.
    public void sendToDimension(IPacket packet, int dim) {
        server.attr(target).set(FMLOutboundHandler.OutboundTarget.DIMENSION);
        server.attr(arg).set(dim);
        server.writeAndFlush(packet).addListener(failExc);
    }
}
 
Dragon2488 написал(а):
Ну, я это писал очень давно, когда его не было.
Dragon2488 написал(а):
Ну, я это писал
Dragon2488 написал(а):
Dragon2488 написал(а):
Хех.
[merge_posts_bbcode]Добавлено: 30.09.2014 13:39:38[/merge_posts_bbcode]

А писал я это потому, что SimpleNetworkWrapper, во-первых, кривой, а во-вторых - не работал со Scala.
 
Тем, что нужно отправлять пакет обратно. А еще пакет отдельно от его хандлера, некомпактность короче.

И знаю я, что можно туда сунуть IMessageHandler и не надо пакет обратно слать, но это же костыль и лишняя писанина(учитывая, что в большинстве случаев это не нужно).

А просто реализация, что показана выше просто короче и красивее.
 
Лыл. Кстати, если кнопку надо не так, как написано, а держать, можно и не выеживаться. Да, по сути, можно и переменную на клиенте для этих дел хранить, чего уж там. Тогда норм. AddInfo клиентский жеж.
А вот с гивайтемом нужен гуй.

Вы что тут все, на пакеты передергиваете? Пакеты ненужны.
 
laz2727 написал(а):
Пакеты ненужны.
Ага, чтоб любой читераст спокойно отмодифицировал клиент в свою пользу.
 
Ну, тащемта, в 95% случаев пакеты там, где вы их суете, действительно ненужны.
 
Я с анти согласен,я недавно тоже клиентский написал,а какой ро урод глянул не декомпилированный код и с помощью рефлексии поменял мод. И с лазом согласен. Скорее в сторону лаза,т.к. программистов мало и некому менять
 
Назад
Сверху