SetItemInUse custom
-
Bonjour, aujourd’hui je reviens avec un problème encore plus complexe : la fonction setItemInUse. J’ai voulu utiliser cette méthode avec une touche malheureusement il s’avère que Minecraft n’aime pas lorsque l’on utiliser setItemInUse en dehors de la méthode onItemRightClick. Je me suis dit que c’était un problème de synchronisation client / serveur (même si çà fait partie du côté client normalement, mais bon, j’ai essayé), sauf que même un paquet ne résout pas le problème :
@SubscribeEvent public void onInputEvent(InputEvent event) { if (ClientProxy.keyBindAim.isPressed()) { EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; if (player.getHeldItem() != null && player.getHeldItem().getItem() == HiliumItems.ITEM_GUN) { player.setItemInUse(player.getHeldItem(), 100); // j'utilise une constante pour verifier que le problème ne vient pas de là Hilium.network.sendToServer(new PacketItemInUse(100)); } } }
La fonction est appelée, le paquet est envoyé, mais lorsque j’applique le rendu :
@SubscribeEvent public void onRenderHand(RenderHandEvent event) { EntityPlayer player = Minecraft.getMinecraft().thePlayer; if (player.getHeldItem() != null && player.getHeldItem().getItemUseAction() == ItemGun.aim) { if (player.getItemInUseCount() > 0) { Hilium.LOGGER.info("rendering"); GL11.glPushMatrix(); // Useless openGL (tests) GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); GL11.glPopMatrix(); } else { Hilium.LOGGER.info(player.getItemInUseCount()); // debug } } }
je vois “rendering” apparaître seulement lorsque j’utilise la méthode setItemInUse dans la méthode onItemRightClick sinon çà m’affiche 0.
Classe du paquet (au cas où) :
public class PacketItemInUse implements IMessage { private int duration; public PacketItemInUse() {} public PacketItemInUse(int duration) { this.duration = duration; } @Override public void fromBytes(ByteBuf buf) { this.duration = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { buf.writeInt(this.duration); } public static class ServerHandler implements IMessageHandler <packetiteminuse, imessage="">{ @Override public IMessage onMessage(PacketItemInUse message, MessageContext ctx) { ctx.getServerHandler().playerEntity.setItemInUse(ctx.getServerHandler().playerEntity.getHeldItem(), message.duration); Hilium.LOGGER.info("received packet : " + ctx.getServerHandler().playerEntity.getItemInUseCount()); return null; } } } ```</packetiteminuse,>
-
J’ai trouvé d’où venait le problème, après avoir utilisé un Throwable dans l’event PlayerUseItem.Stop, voici d’où vient le problème :
Minecraft.class:2006if (this.thePlayer.isUsingItem()) // Si le joueur utilise l'item (c'est le cas) { if (!this.gameSettings.keyBindUseItem.getIsKeyPressed()) // On regarde si le bouton d'utilisation des items est pressée (dans ce cas elle ne l'est pas car j'utilise une touche du clavier custom) { this.playerController.onStoppedUsingItem(this.thePlayer); } label391: while (true) { if (!this.gameSettings.keyBindAttack.isPressed()) { while (this.gameSettings.keyBindUseItem.isPressed()) { ; } while (true) { if (this.gameSettings.keyBindPickBlock.isPressed()) { continue; } break label391; } } } }
Donc le seul moyen d’empêcher çà serai de modifier le code de Minecraft, je vais voir pour trouver un moyen de le contourner ou je posterai un commit sur le git de forge pour le corriger.
-
En fait pourquoi tu veux passer par une touche custom pour lancer l’utilisation de l’item ? Le clic droit ne convient pas ?
-
Je fait une arme, donc il me faut une touche de la souris pour tirer, je voulais utiliser le clique gauche à la base et utiliser le clique droit pour viser mais il n’y a aucun event pour le clique gauche (il n’y en a que lorsque l’on clique sur une entité) donc j’ai voulut garder le clique droit pour tirer et donc créer une touche pour viser mais je crois que je vais devoir faire l’inverse.
-
Faut regarder du côté de flan’s mod sinon.