Encore problème onUpdate
-
@‘SCAREX’:
En fait je vois pas le problème que pourrais causer ton code : tout ce que tu fais c’est incrémenter un timer, le problème vient d’autre part.
Envoi la classe de l’item en entier
Tien:
package net.legacymod.items; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.legacymod.LegacyMod; import net.legacymod.packets.Packet5Arrow; import net.legacymod.packets.PacketArrow; import net.legacymod.packets.PacketFireArrow; import net.legacymod.proxy.ClientProxy; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.entity.projectile.EntityLargeFireball; import net.minecraft.init.Items; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemBow; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; import net.minecraft.util.IIcon; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.event.entity.player.ArrowLooseEvent; import net.minecraftforge.event.entity.player.ArrowNockEvent; public class FlameBow extends ItemBow { public static final String[] bowPullIconNameArray = new String[] {"pulling_0", "pulling_1", "pulling_2"}; @SideOnly(Side.CLIENT) private IIcon[] iconArray; public boolean isExplosive; public FlameBow() { this.maxStackSize = 1; this.setMaxDamage(1000); this.setFull3D(); this.setCreativeTab(CreativeTabs.tabCombat); } /** * called when the player releases the use item button. Args: itemstack, world, entityplayer, itemInUseCount */ public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int p_77615_4_) { int j = this.getMaxItemUseDuration(stack) - p_77615_4_; ArrowLooseEvent event = new ArrowLooseEvent(player, stack, j); EntityLargeFireball fire = new EntityLargeFireball(world); MinecraftForge.EVENT_BUS.post(event); if (event.isCanceled()) { return; } j = event.charge; boolean flag = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, stack) > 0; if (flag || player.inventory.hasItem(Items.arrow)) { float f = (float)j / 20.0F; f = (f * f + f * 2.0F) / 3.0F; if ((double)f < 0.1D) { return; } if (f > 1.0F) { f = 1.0F; } EntityArrow entityarrow = new EntityArrow(world, player, f * 2.0F); EntityArrow entityarrow2 = new EntityArrow(world, player, f * 2.0F); EntityArrow entityarrow3 = new EntityArrow(world, player, f * 2.0F); EntityArrow entityarrow4 = new EntityArrow(world, player, f * 2.0F); EntityArrow entityarrow5 = new EntityArrow(world, player, f * 2.0F); if (f == 1.0F) { entityarrow.setIsCritical(true); } int k = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, stack); if (k > 0) { entityarrow.setDamage(entityarrow.getDamage() + (double)k * 0.5D + 0.5D); } int l = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, stack); if (l > 0) { entityarrow.setKnockbackStrength(l); } if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, stack) > 0) { entityarrow.setFire(100); } stack.damageItem(1, player); world.playSoundAtEntity(player, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F); if (flag) { entityarrow.canBePickedUp = 2; } if(!world.isRemote && ClientProxy.keyBindSortG2.isPressed() && stack.getTagCompound().getInteger("timer") >= 1) { entityarrow.getEntityData().setBoolean("isExplosive", true); LegacyMod.network.sendToServer(new PacketArrow(f * 2.0F)); System.out.println("flèche explosive"); stack.getTagCompound().setInteger("timer", 0); } if (!world.isRemote && ClientProxy.keyBindSortG1.isPressed()) { LegacyMod.network.sendToServer(new PacketFireArrow(f * 2.0F)); System.out.println("flèche en feu"); stack.getTagCompound().setInteger("timer2", 0); } if (player.isSneaking() && !world.isRemote) { System.out.println("5 flèches"); LegacyMod.network.sendToServer(new Packet5Arrow(2.0F)); stack.getTagCompound().setInteger("timer3", 0); }else if(!world.isRemote) { world.spawnEntityInWorld(entityarrow); System.out.println("flèche normale"); } } } public ItemStack onEaten(ItemStack p_77654_1_, World p_77654_2_, EntityPlayer p_77654_3_) { return p_77654_1_; } /** * How long it takes to use or consume an item */ public int getMaxItemUseDuration(ItemStack p_77626_1_) { return 72000; } /** * returns the action that specifies what animation to play when the items is being used */ public EnumAction getItemUseAction(ItemStack p_77661_1_) { return EnumAction.bow; } /** * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer */ public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) { ArrowNockEvent event = new ArrowNockEvent(p_77659_3_, p_77659_1_); MinecraftForge.EVENT_BUS.post(event); if (event.isCanceled()) { return event.result; } if (p_77659_3_.capabilities.isCreativeMode || p_77659_3_.inventory.hasItem(Items.arrow)) { p_77659_3_.setItemInUse(p_77659_1_, this.getMaxItemUseDuration(p_77659_1_)); } return p_77659_1_; } /** * Return the enchantability factor of the item, most of the time is based on material. */ public int getItemEnchantability() { return 1; } @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister p_94581_1_) { this.itemIcon = p_94581_1_.registerIcon(this.getIconString() + "_standby"); this.iconArray = new IIcon[bowPullIconNameArray.length]; for (int i = 0; i < this.iconArray.length; ++i) { this.iconArray* = p_94581_1_.registerIcon(this.getIconString() + "_" + bowPullIconNameArray*); } } /** * used to cycle through icons based on their used duration, i.e. for the bow */ @SideOnly(Side.CLIENT) public IIcon getItemIconForUseDuration(int p_94599_1_) { return this.iconArray[p_94599_1_]; } public void onUpdate(ItemStack item, World world, Entity player, int slotIndex, boolean inHand) { if(!item.hasTagCompound() && !world.isRemote) { item.setTagCompound(new NBTTagCompound()); } if(!world.isRemote){ // si tu met juste world.isRemote le bug avec l'arc disparait. int timer = !item.getTagCompound().hasKey("timer") ? 0 : item.getTagCompound().getInteger("timer"); timer++; item.getTagCompound().setInteger("timer", timer); int timer2 = !item.getTagCompound().hasKey("timer2") ? 0 : item.getTagCompound().getInteger("timer2"); timer2++; item.getTagCompound().setInteger("timer2", timer2); int timer3 = !item.getTagCompound().hasKey("timer3") ? 0 : item.getTagCompound().getInteger("timer3"); timer3++; item.getTagCompound().setInteger("timer3", timer3); super.onUpdate(item, world, player, slotIndex, inHand); } } @Override//Prob ici public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { if(usingItem != null && usingItem.getItem() == LegacyMod.FlameBow) { int k = usingItem.getMaxItemUseDuration() - useRemaining; if(k >= 18) return iconArray[2]; if(k > 13) return iconArray[1]; if(k > 0) return iconArray[0]; } return getIconIndex(stack); } } -
if(!world.isRemote && ClientProxy.keyBindSortG2.isPressed() && stack.getTagCompound().getInteger(“timer”) >= 1)
traduction -> si on est côté serveur et que la touche bindSortG2 est appuyée côté client…
Ton code ne peut pas fonctionner, tu demande que ce soit côté serveur et côté client, fais du ménage dans ton code et après je t’aiderai car sinon c’est impossible
-
@‘SCAREX’:
if(!world.isRemote && ClientProxy.keyBindSortG2.isPressed() && stack.getTagCompound().getInteger(“timer”) >= 1)
traduction -> si on est côté serveur et que la touche bindSortG2 est appuyée côté client…
Ton code ne peut pas fonctionner, tu demande que ce soit côté serveur et côté client, fais du ménage dans ton code et après je t’aiderai car sinon c’est impossible
Comment je peux faire pour ne avoir le conflit client serveur avec un !worldremote et un keybinpressed ? un packet ?
-
Oui, un packet (comme pour l’arc et la flèche qui doit s’enflammer).
-
@‘AymericRed’:
Oui, un packet (comme pour l’arc et la flèche qui doit s’enflammer).
ok mais je dois mettre quoi cette fois si? un String ?
Et si vous avez un peu plus de détails je suis prenneur -
Ça dépend de ce qu’il y dans le if (je n’ai pas le temps de regarder là surtout que tapatalk n’aime pas les balises codes).
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
D’acc j’attends ta réponse merci

-
Tu envoies déjà un packet qui est censé lancer la flèche, or elle doit forcément être explosive donc tu as juste à faire ```java
entityarrow.getEntityData().setBoolean(“isExplosive”, true); -
@‘AymericRed’:
Tu envoies déjà un packet qui est censé lancer la flèche, or elle doit forcément être explosive donc tu as juste à faire ```java
entityarrow.getEntityData().setBoolean(“isExplosive”, true);Ouaip je vais faire ça ok ^^ un switch case serrait bien pour les différentes flèches ?
Merci en tout cas
-
Oui un switch serait bien

-
@‘AymericRed’:
Oui un switch serait bien

Ok donc c’est bon!
J’ai ça comme code du coup:
if(ClientProxy.keyBindSortG2.isPressed() && stack.getTagCompound().getInteger("timer") >= 20 * 20) { LegacyMod.network.sendToServer(new PacketArrow(f * 2.0F, 1)); System.out.println("flèche explosive"); stack.getTagCompound().setInteger("timer", 0); } if (ClientProxy.keyBindSortG1.isPressed()) { LegacyMod.network.sendToServer(new PacketArrow(f * 2.0F, 3)); System.out.println("flèche en feu"); stack.getTagCompound().setInteger("timer2", 0); } if (player.isSneaking() && !world.isRemote) { System.out.println("5 flèches"); LegacyMod.network.sendToServer(new PacketArrow(2.0F, 2)); stack.getTagCompound().setInteger("timer3", 0); }else if(!world.isRemote) { world.spawnEntityInWorld(entityarrow); System.out.println("flèche normale"); } }ça marche mais ça me lance a chaque fois 2 flèches exemple: flèche en feu et flèche normale sauf pour la flèche normale et les 5 flèches alors que mon packet et bien enregistrer côté serveur du coup faut a chaque if mettre !world.isremote mais y’a un conflit avec le keybinding comment je peux faire ??
-
File ta classe PacketArrow et l’endroit de ta classe principale où tu l’enregistres.
Et puis c’est normal que plusieurs flèches différentes soienr envoyées alors que tu n’en souhaites qu’une seul, regarde un peu toutes tes conditions. Y’a plein de if à la suite, donc normal que tout ton code s’enchaîne à la lecture du code. Remplace les par des else if, si tu ne veux qu’une seule par type ne soit envoyée.
-
@‘Plaigon’:
File ta classe PacketArrow et l’endroit de ta classe principale où tu l’enregistres.
Et puis c’est normal que plusieurs flèches différentes soienr envoyées alors que tu n’en souhaites qu’une seul, regarde un peu toutes tes conditions. Y’a plein de if à la suite, donc normal que tout ton code s’enchaîne à la lecture du code. Remplace les par des else if, si tu ne veux qu’une seule par type ne soit envoyée.
Tien:
J’ai mis des else if c’est pareil
Classe principale:network = NetworkRegistry.INSTANCE.newSimpleChannel("lc:"); network.registerMessage(PacketClassesGUI.Handler.class, PacketClassesGUI.class, 0, Side.SERVER); network.registerMessage(PacketGuerrier.Handler.class, PacketGuerrier.class, 1, Side.SERVER); network.registerMessage(PacketArrow.Handler.class, PacketArrow.class, 2, Side.SERVER); network.registerMessage(PacketTitle.Handler.class, PacketTitle.class, 3, Side.CLIENT);PacketArrow:
package net.legacymod.packets; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.util.Vec3; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; public class PacketArrow implements IMessage{ private float f1; private static int i; public PacketArrow(){ } public PacketArrow(float f, int i) { this.f1 = f; this.i = i; } @Override public void fromBytes(ByteBuf buf) { f1 = buf.readFloat(); i = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { buf.writeFloat(f1); buf.writeInt(i); } public static class Handler implements IMessageHandler <packetarrow, imessage="">{ @Override public IMessage onMessage(PacketArrow message, MessageContext ctx) { EntityArrow entityarrow = new EntityArrow(ctx.getServerHandler().playerEntity.worldObj, ctx.getServerHandler().playerEntity, message.f1 + message.i); EntityArrow entityarrow2 = new EntityArrow(ctx.getServerHandler().playerEntity.worldObj, ctx.getServerHandler().playerEntity, message.f1 + message.i); EntityArrow entityarrow3 = new EntityArrow(ctx.getServerHandler().playerEntity.worldObj, ctx.getServerHandler().playerEntity, message.f1 + message.i); EntityArrow entityarrow4 = new EntityArrow(ctx.getServerHandler().playerEntity.worldObj, ctx.getServerHandler().playerEntity, message.f1 + message.i); EntityArrow entityarrow5 = new EntityArrow(ctx.getServerHandler().playerEntity.worldObj, ctx.getServerHandler().playerEntity, message.f1 + message.i); switch(i) { case 1: { entityarrow.getEntityData().setBoolean("isExplosive", true); ctx.getServerHandler().playerEntity.worldObj.spawnEntityInWorld(entityarrow); break; } case 2: { ctx.getServerHandler().playerEntity.worldObj.spawnEntityInWorld(entityarrow); ctx.getServerHandler().playerEntity.worldObj.spawnEntityInWorld(entityarrow2); ctx.getServerHandler().playerEntity.worldObj.spawnEntityInWorld(entityarrow3); ctx.getServerHandler().playerEntity.worldObj.spawnEntityInWorld(entityarrow4); ctx.getServerHandler().playerEntity.worldObj.spawnEntityInWorld(entityarrow5); Vec3 look = ctx.getServerHandler().playerEntity.getLookVec(); entityarrow.setPosition( ctx.getServerHandler().playerEntity.posX + look.xCoord, ctx.getServerHandler().playerEntity.posY + 1 + look.yCoord, ctx.getServerHandler().playerEntity.posZ + look.zCoord); entityarrow2.setPosition( ctx.getServerHandler().playerEntity.posX + 1 + look.xCoord, ctx.getServerHandler().playerEntity.posY + 1 + look.yCoord, ctx.getServerHandler().playerEntity.posZ + look.zCoord); entityarrow3.setPosition( ctx.getServerHandler().playerEntity.posX + look.xCoord, ctx.getServerHandler().playerEntity.posY + 1 + look.yCoord, ctx.getServerHandler().playerEntity.posZ + 1 + look.zCoord); entityarrow4.setPosition( ctx.getServerHandler().playerEntity.posX - 1 + look.xCoord, ctx.getServerHandler().playerEntity.posY + 1 + look.yCoord, ctx.getServerHandler().playerEntity.posZ + look.zCoord); entityarrow5.setPosition( ctx.getServerHandler().playerEntity.posX + look.xCoord, ctx.getServerHandler().playerEntity.posY + 1 + look.yCoord, ctx.getServerHandler().playerEntity.posZ - 1 + look.zCoord); break; } case 3: { ctx.getServerHandler().playerEntity.worldObj.spawnEntityInWorld(entityarrow); entityarrow.setFire(2 * 5); break; } default: break; } return null; } } }edit:
Help?</packetarrow,> -
Personne ne sait ?
-
Tu ne dois pas avoir de variables statiques dans ton paquet. Et pourquoi invoquer pleins de constructeurs s’ils ne sont pas tous utilisés ?
-
@‘SCAREX’:
Tu ne dois pas avoir de variables statiques dans ton paquet. Et pourquoi invoquer pleins de constructeurs s’ils ne sont pas tous utilisés ?
Pas sa mon problème, c’est que j’ai un problème avec le !world.remote et le ClientProxy.keybind … j’ai un conflit client / serveur.
Du coup on m’a dis de faire un packet pour le keybindMais je dois mettre quoi dans se packet ? juste le ClientProxy.key… dans la fonction onmessagage ?
-
@‘floriangabet’:
@‘SCAREX’:
Tu ne dois pas avoir de variables statiques dans ton paquet. Et pourquoi invoquer pleins de constructeurs s’ils ne sont pas tous utilisés ?
Pas sa mon problème, c’est que j’ai un problème avec le !world.remote et le ClientProxy.keybind … j’ai un conflit client / serveur.
Du coup on m’a dis de faire un packet pour le keybindMais je dois mettre quoi dans se packet ? juste le ClientProxy.key… dans la fonction onmessagage ?
C’est à dire ? tu essaies de faire quoi ?
-
@‘floriangabet’:
@‘SCAREX’:
Tu ne dois pas avoir de variables statiques dans ton paquet. Et pourquoi invoquer pleins de constructeurs s’ils ne sont pas tous utilisés ?
Pas sa mon problème, c’est que j’ai un problème avec le !world.remote et le ClientProxy.keybind … j’ai un conflit client / serveur.
Du coup on m’a dis de faire un packet pour le keybindMais je dois mettre quoi dans se packet ? juste le ClientProxy.key… dans la fonction onmessagage ?
Il y a plusieurs problèmes :
D’abord, dans ton packet, la variable “i” est static or elle ne doit pas l’être.
Ensuite dans la class de ton item, la ou tu vérifie sur quelle touche on click pour ensuite envoyer une flèche : il faut utiliser des “else if” au lieux de “if” car sinon, si plusieurs conditions sont validés, alors ça invoque plusieurs flèches. De plus, il ne faut pas mettre “&& !world.isRemote” car tu vérifie les touches coté client. (au passage, il manque quelques vérifications de timer) -
@‘LeBossMax2’:
@‘floriangabet’:
@‘SCAREX’:
Tu ne dois pas avoir de variables statiques dans ton paquet. Et pourquoi invoquer pleins de constructeurs s’ils ne sont pas tous utilisés ?
Pas sa mon problème, c’est que j’ai un problème avec le !world.remote et le ClientProxy.keybind … j’ai un conflit client / serveur.
Du coup on m’a dis de faire un packet pour le keybindMais je dois mettre quoi dans se packet ? juste le ClientProxy.key… dans la fonction onmessagage ?
Il y a plusieurs problèmes :
D’abord, dans ton packet, la variable “i” est static or elle ne doit pas l’être.
Ensuite dans la class de ton item, la ou tu vérifie sur quelle touche on click pour ensuite envoyer une flèche : il faut utiliser des “else if” au lieux de “if” car sinon, si plusieurs conditions sont validés, alors ça invoque plusieurs flèches. De plus, il ne faut pas mettre “&& !world.isRemote” car tu vérifie les touches coté client. (au passage, il manque quelques vérifications de timer)Salut,
Alors pour le i ok pour les else if c’est fait et si je met pas les && !world.isRemote sa me lance deux flèches une normale et une en feu (pour le sort de feu) et cela a chaque sort sauf pour les 5 flèches car c’est pas avec l’action d’un touche donc pas côté client . -
Oups, j’avais pas pensais à ça… Je pence que le plus simple ce serais d’envoyer aussi la flèche normal et les 5 flèches avec le packet des flèches en mettant bien des “world.isRemote” pour que le serveur ne s’envoie pas des packet à lui même.
Edit : tu devrais aussi gérer les timer coté serveur dans le “onMessage” du packet.