ПКМ в онАпдейт

317
10
Пытался делать через банальный Keyboard (Не нашел там пкм + узнал что на серваке не будет работать даже если и сделаю.). Выудил в одной из тем что надо мутить как то с пакетами(Клиент + Сервер). Опять же не нашел того как забиндить пкм. Есть желающие помочь кодом в этом дельце?
PS. Помню тимаха007 писал кому-то как сделать перезарядку. Но опять же потерял та и толком не понял.
PSS: Всем громадное спасибо кто будет тратить на меня время :)
 
2,955
12
А тебе какая разница? Это тоже самое, что и онАпдейт, только выполняется при задержке нажатия ПКМ.
 
317
10
Dragon2488 написал(а):
А тебе какая разница? Это тоже самое, что и онАпдейт, только выполняется при задержке нажатия ПКМ.
Проверил. Нету такого метода в род. классе Item. Или его тупо запилить в код оружки и он будет пахать?
 

timaxa007

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

Yarik написал(а):
Пытался делать через банальный Keyboard.
Есть "банальный" Mouse ("Mouse.isButtonDown(1)").

Yarik написал(а):
узнал что на серваке не будет работать даже если и сделаю.
Хорошо, что узнал.

Yarik написал(а):
Опять же не нашел того как забиндить пкм.
Кнопки мыши

Yarik написал(а):
Выудил в одной из тем что надо мутить как то с пакетами(Клиент + Сервер). Опять же не нашел того как забиндить пкм. Есть желающие помочь кодом в этом дельце?
PS. Помню тимаха007 писал кому-то как сделать перезарядку. Но опять же потерял та и толком не понял.
Могу помочь с подобным кодом, но если ты толком ни чего не понял, то будет трудно помочь с кодом.
 
7,099
324
1,510
О, а можешь во флудилке сделать тему, типо учебник по пакетам? Если нет времени комментировать, то думаю, большинство поймет)
 

timaxa007

Модератор
5,831
409
672
Тут типа и про левую и про правую кнопку мыши.

В клиент прокси (в инит желательно):
Код:
FMLCommonHandler.instance().bus().register(new EventActionMouse());

EventActionMouse
Код:
public class EventActionMouse {
//--------------------------------------------------------------------------------------------------------------
    boolean lc, lc_last = false;
    int tick_lc = 0;

    boolean rc, rc_last = false;
    int tick_rc = 0;
//--------------------------------------------------------------------------------------------------------------
    @SubscribeEvent
    public void actionBindAttack(TickEvent.PlayerTickEvent event) {
        if (event.phase == TickEvent.Phase.START && event.side == Side.CLIENT) {
            if (Minecraft.getMinecraft().gameSettings.keyBindAttack.getIsKeyPressed()) {
                ActionMouseKey.actionLeftClickTickClient(event.player, tick_lc);
                tick_lc += 1;
                lc = true;
                if (!lc_last && lc) ActionMouseKey.actionLeftClickClient(event.player, true);//press down
                lc_last = lc;
            } else {
                tick_lc = 0;
                lc = false;
                if (lc_last && !lc) ActionMouseKey.actionLeftClickClient(event.player, false);//unpress down
                lc_last = lc;
            }
        }
    }
//--------------------------------------------------------------------------------------------------------------
    @SubscribeEvent
    public void actionBindUseItem(TickEvent.PlayerTickEvent event) {
        if (event.phase == TickEvent.Phase.START && event.side == Side.CLIENT) {
            if (Minecraft.getMinecraft().gameSettings.keyBindUseItem.getIsKeyPressed()) {
                ActionMouseKey.actionRightClickTickClient(event.player, tick_rc);
                tick_rc += 1;
                rc = true;
                if (!rc_last && rc) ActionMouseKey.actionRightClickClient(event.player, true);//press down
                rc_last = rc;
            } else {
                tick_rc = 0;
                rc = false;
                if (rc_last && !rc) ActionMouseKey.actionRightClickClient(event.player, false);//unpress down
                rc_last = rc;
            }
        }
    }
//--------------------------------------------------------------------------------------------------------------
}

ActionMouseKey
Код:
public class ActionMouseKey {
//--------------------------------------------------------------------------------------------------------------
    public static void actionLeftClickTickClient(EntityPlayer player, int tick_lc) {
        ItemStack current = player.getCurrentEquippedItem();
        if (current != null && current.getItem() instanceof IActionMouse)
            ((IActionMouse)current.getItem()).onLeftClickTickClient(current, player.worldObj, player, tick_lc);
    }

    public static void actionLeftClickClient(EntityPlayer player, boolean buttonstate) {
        ItemStack current = player.getCurrentEquippedItem();
        if (current != null && current.getItem() instanceof IActionMouse)
            ((IActionMouse)current.getItem()).onLeftClickClient(current, player.worldObj, player, buttonstate);
    }
//--------------------------------------------------------------------------------------------------------------
    public static void actionRightClickTickClient(EntityPlayer player, int tick_rc) {
        ItemStack current = player.getCurrentEquippedItem();
        if (current != null && current.getItem() instanceof IActionMouse)
            ((IActionMouse)current.getItem()).onRightClickTickClient(current, player.worldObj, player, tick_rc);
    }

    public static void actionRightClickClient(EntityPlayer player, boolean buttonstate) {
        ItemStack current = player.getCurrentEquippedItem();
        if (current != null && current.getItem() instanceof IActionMouse)
            ((IActionMouse)current.getItem()).onRightClickClient(current, player.worldObj, player, buttonstate);
    }
    //--------------------------------------------------------------------------------------------------------------
}

IActionMouse
Код:
public interface IActionMouse {
//--------------------------------------------------------------------------------------------------------------
    @SideOnly(Side.CLIENT)
    public void onLeftClickTickClient(ItemStack is, World world, EntityPlayer player, int tick);

    @SideOnly(Side.CLIENT)
    public void onLeftClickClient(ItemStack is, World world, EntityPlayer player, boolean isPress);
//--------------------------------------------------------------------------------------------------------------
    @SideOnly(Side.CLIENT)
    public void onRightClickTickClient(ItemStack is, World world, EntityPlayer player, int tick);

    @SideOnly(Side.CLIENT)
    public void onRightClickClient(ItemStack is, World world, EntityPlayer player, boolean isPress);
//--------------------------------------------------------------------------------------------------------------
}

Всё что написано выше, всё это клиенский код.

Имплементируем "IActionMouse" в предмет:
Код:
extends Item implements IActionMouse
Попросит добавит методов из "IActionMouse":
Код:
//--------------------------------------------------------------------------------------------------------------
    @SideOnly(Side.CLIENT)
    public void onLeftClickTickClient(ItemStack is, World world, EntityPlayer player, int tick) {

    }

    @SideOnly(Side.CLIENT)
    public void onLeftClickClient(ItemStack is, World world, EntityPlayer player, boolean isPress) {

    }
//--------------------------------------------------------------------------------------------------------------
    @SideOnly(Side.CLIENT)
    public void onRightClickTickClient(ItemStack is, World world, EntityPlayer player, int tick) {

    }

    @SideOnly(Side.CLIENT)
    public void onRightClickClient(ItemStack is, World world, EntityPlayer player, boolean isPress) {

    }
//--------------------------------------------------------------------------------------------------------------

Теперь нужно сделать отправку пакетов в случаи каких-либо условий.

Код:
public class PackWeapons {

//mod_id, mod_name, клиент прокси и бла-бла-бла...
public static SimpleNetworkWrapper network;

//В преИнит
public void preInit() {

//Предметы и блоки и бла-бла-бла...

network = NetworkRegistry.INSTANCE.newSimpleChannel(PackWeapons.MODID);
network.registerMessage(MessageActionWeapons.Handler.class, MessageActionWeapons.class, 0, Side.SERVER);
}

}

MessageActionWeapons
Код:
public class MessageActionWeapons implements IMessage {

    public int action;

    public MessageActionWeapons() {}

    public MessageActionWeapons(int action) {
        this.action = action;
    }

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

    @Override
    public void fromBytes(ByteBuf buf) {
        action = buf.readInt();
    }
    //----------------------------------------------------------------------------------
    public static class Handler implements IMessageHandler<MessageActionWeapons, IMessage> {

        @Override
        public IMessage onMessage(MessageActionWeapons packet, MessageContext message) {
            int action = packet.action;
            EntityPlayerMP player = message.getServerHandler().playerEntity;

            switch(action) {
            case 1:ActionWeapons.onFire(player);break;
            case 2:ActionWeapons.onScope(player, true);break;
            case -2:ActionWeapons.onScope(player, false);break;
            //case 3:ActionWeapons.onReload(player);break;
            }

            return null;
        }

    }
    //----------------------------------------------------------------------------------
}

ActionWeapons
Код:
public class ActionWeapons {

public static void onFire(EntityPlayer player) {
    ItemStack current = player.getCurrentEquippedItem();
    if (current != null && current.getItem() instanceof ItemWeapons)
        ((ItemWeapons)current.getItem()).fire(current, player.worldObj, player);
}

public static void onScope(EntityPlayer player, boolean buttonstate) {
    ItemStack current = player.getCurrentEquippedItem();
    if (current != null && current.getItem() instanceof ItemWeapons)
        ((ItemWeapons)current.getItem()).scope(current, player.worldObj, player, buttonstate);
}

}
ItemWeapons - это наш предмет.
PackWeapons - это главный класс мода.
Затем добавим новые методы в наш предмет и отправку месседж-пакета, возвращаемся к предмету и должно примерно так:
Код:
//--------------------------------------------------------------------------------------------------------------
    @SideOnly(Side.CLIENT)
    public void onLeftClickTickClient(ItemStack is, World world, EntityPlayer player, int tick) {
//Могут быть всякие условия.
        PackWeapons.network.sendToServer(new MessageActionWeapons(1));
    }

    @SideOnly(Side.CLIENT)
    public void onLeftClickClient(ItemStack is, World world, EntityPlayer player, boolean isPress) {

    }

    public void fire(ItemStack is, World world, EntityPlayer player) {
//Какие-то условия на сервере, типа
        /*EntityArrow entityarrow = new EntityArrow(world, player, 5.0F);
        world.spawnEntityInWorld(entityarrow);*/
    }
//--------------------------------------------------------------------------------------------------------------
    @SideOnly(Side.CLIENT)
    public void onRightClickTickClient(ItemStack is, World world, EntityPlayer player, int tick) {

    }

    @SideOnly(Side.CLIENT)
    public void onRightClickClient(ItemStack is, World world, EntityPlayer player, boolean isPress) {
        PackWeapons.network.sendToServer(new MessageActionWeapons((isPress ? 2 : -2)));
    }

    public void scope(ItemStack is, World world, EntityPlayer player, boolean isPress) {
//Какие-то условия на сервере
    }
//--------------------------------------------------------------------------------------------------------------

Ну вроде ни чего не забыл.
[merge_posts_bbcode]Добавлено: 25.04.2015 07:50:16[/merge_posts_bbcode]

hohserg написал(а):
О, а можешь во флудилке сделать тему, типо учебник по пакетам? Если нет времени комментировать, то думаю, большинство поймет)
Могу попробовать сделать, что-то подобное, но думаю что без каких-то комментариев не обойдётся подобная тема. И я сам мало что знаю про пакеты, (просто думаю и делаю).
 
317
10
timaxa007 а как сделать так что бы стрелял тупо по зажатию пкм(я нажимаю пкм, держу ее, выполняет действия каждый тик)
 

timaxa007

Модератор
5,831
409
672
Точно не знаю. Можно попробовать типа этого:
Код:
public int getMaxItemUseDuration(ItemStack is) {
    return 72000;//На сколько тиков он будет использовать(/стреляет)
}

public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player) {
    player.setItemInUse(is, getMaxItemUseDuration(is));
    return super.onItemRightClick(is, world, player);
}

public void onUsingTick(ItemStack stack, EntityPlayer player, int count) {
//стрельба каждый тик или типа того
}
 

timaxa007

Модератор
5,831
409
672
Место onUsingTick использовать onUsingItemTick.
[merge_posts_bbcode]Добавлено: 16.06.2016 14:09:29[/merge_posts_bbcode]

Или вы про 10 пост?
 

timaxa007

Модератор
5,831
409
672
Я мало вероятно или не скоро сделаю работающею версию, так как мне не очень нравиться там работать с пакетами (хотя особо ни чего и сложного нет).
 
61
0
Код:
FMLCommonHandler.instance().bus().register(new EventActionMouse());

в 1.6.4 нет bus

и IMessage тоже
 
608
5
15
Golddrak написал(а):
Код:
FMLCommonHandler.instance().bus().register(new EventActionMouse());

в 1.6.4 нет bus

и IMessage тоже
А, видимо постами ошиблись.
В 1.6.4 другая система пакетов, и другая регистрация ивентов.
 
Сверху