Résolu Effectuer une suite d'actions lors du placement d'une TNT ?
-
@‘robin4002’:
Je viens de vérifier ça :
@SubscribeEvent public void onBlockPlace(BlockEvent.PlaceEvent e) { System.out.println(e.getWorld().isRemote); }
La console ne renvoies que false.
Donc l’event n’est que appelé côté serveur et non côté client, donc ça ne va pas.
Il faut un autre event.
Je vais voir avec l’event interact si c’est possible.D’accord, je n’y connaît rien du tout là dedans.
J’ai cru comprendre que c’était les proxys qui géraient ça, mais je ne sais pas m’en servir. -
Dans ton cas tu n’as pas à te soucier des proxys comme tu veux faire un mod client side only.
Par contre pour que ton mod puisse fonctionner comme tu veux il faut faire uniquement des actions sur le client (donc world.isRemote doit être avoir la valeur true).
PlayerInteractEvent.RightClickBlock est bien appelé côté client, mais il ne permet pas de faire ce que tu veuxJe crains que ce que tu souhaites faire n’est pas possible sans modifier le code de Minecraft via ASM ou sans que le mod soit installé sur le serveur.
-
@‘robin4002’:
Dans ton cas tu n’as pas à te soucier des proxys comme tu veux faire un mod client side only.
Par contre pour que ton mod puisse fonctionner comme tu veux il faut faire uniquement des actions sur le client (donc world.isRemote doit être avoir la valeur true).
PlayerInteractEvent.RightClickBlock est bien appelé côté client, mais il ne permet pas de faire ce que tu veuxJe crains que ce que tu souhaites faire n’est pas possible sans modifier le code de Minecraft via ASM ou sans que le mod soit installé sur le serveur.
Ah
Mais quel est donc le problème, je ne l’ai pas bien compris ?
-
BlockEvent.PlaceEvent n’est que appelé côté serveur.
Donc si le mod n’est pas installé sur le serveur, ça ne fonctionnera pas.
De plus la fonction setPickedItemStack que tu as utilisé n’est que disponible côté client. C’est pour ça que ton code ne fonctionne pas vraiment (bug visuel en solo et ne fonctionnerai pas du tout en multi, il ferai crasher le serveur si on le tente de l’installer sur un serveur).Et avec l’event PlayerInteractEvent.RightClickBlock on ne peut pas détecté le bloc posé car il n’est pas encore posé à ce moment.
J’ai essayé de détecter l’item en main du-coup, mais player.getActiveHand() ne fonctionne pas à ce moment.En fait je viens de voir qu’on peut utiliser e.getHand().
Du-coup on peut détecter l’item en main, mais le souci est ensuite de faire le clic droit avec le briquet : il sera fait trop tôt.
Il faudrait mettre en place un petit délai.Finalement c’est peut-être quand même possible sans trop se casser la tête.
-
@‘robin4002’:
BlockEvent.PlaceEvent n’est que appelé côté serveur.
Donc si le mod n’est pas installé sur le serveur, ça ne fonctionnera pas.
De plus la fonction setPickedItemStack que tu as utilisé n’est que disponible côté client. C’est pour ça que ton code ne fonctionne pas vraiment (bug visuel en solo et ne fonctionnerai pas du tout en multi, il ferai crasher le serveur si on le tente de l’installer sur un serveur).Et avec l’event PlayerInteractEvent.RightClickBlock on ne peut pas détecté le bloc posé car il n’est pas encore posé à ce moment.
J’ai essayé de détecter l’item en main du-coup, mais player.getActiveHand() ne fonctionne pas à ce moment.En fait je viens de voir qu’on peut utiliser e.getHand().
Du-coup on peut détecter l’item en main, mais le souci est ensuite de faire le clic droit avec le briquet : il sera fait trop tôt.
Il faudrait mettre en place un petit délai.Finalement c’est peut-être quand même possible sans trop se casser la tête.
Ah, voila qui me rassure
As-tu Skype, pour pouvoir discuter (à l’écrit, pas forcément en vocal) instantanément, ce serait plus simple.
Si oui, ajoute moi : fury.jarMerci d’avance cordialement, Matt.
-
Je ne distribue jamais mon Skype, désolé.
Si tu veux parler en instantané il y a le discord de MFF.J’ai trouvé comment faire :
package fr.minecraftforgefrance.test; import net.minecraft.client.Minecraft; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; import net.minecraft.util.math.RayTraceResult; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; public class EventsHandler { private int delay = -1; private int flintAndSteelSlotId; private Minecraft mc = Minecraft.getMinecraft(); @SubscribeEvent public void onRightClickBlock(PlayerInteractEvent.RightClickBlock e) { if(e.getWorld().isRemote) { // Si le bloc placé est une TNT if(e.getEntityPlayer().getHeldItem(e.getHand()) != null && e.getEntityPlayer().getHeldItem(e.getHand()).getItem() == Item.getItemFromBlock(Blocks.TNT)) { this.flintAndSteelSlotId = e.getEntityPlayer().inventory.getSlotFor(new ItemStack(Items.FLINT_AND_STEEL)); // Si le joueur dispose d'un briquet dans les 9 cases du bas if(this.flintAndSteelSlotId < 10 && this.flintAndSteelSlotId >= 0) { this.delay = 5; } } } } @SubscribeEvent public void onPlayerClientTick(TickEvent.PlayerTickEvent e) { if(e.player.worldObj.isRemote) { if(this.delay == 1) { e.player.inventory.currentItem = flintAndSteelSlotId; } if(this.delay == 0) { System.out.println("clic"); if(mc.objectMouseOver.typeOfHit == RayTraceResult.Type.BLOCK) { mc.playerController.processRightClickBlock(mc.thePlayer, mc.theWorld, mc.thePlayer.getHeldItem(EnumHand.MAIN_HAND), mc.objectMouseOver.getBlockPos(), mc.objectMouseOver.sideHit, mc.objectMouseOver.hitVec, EnumHand.MAIN_HAND); } } if(this.delay >= 0) { this.delay –; } } } }
-
-