Encore problème onUpdate
-
La flèche de feu est ok, appuies sur 6 pour changer de mode.
En passant j’ai corrigé la convention Java et formaté ton code. -
@‘robin4002’:
La flèche de feu est ok, appuies sur 6 pour changer de mode.
En passant j’ai corrigé la convention Java et formaté ton code.Super! merci c’est exactement se qui me fallait!
Par contre j’ai un soucis,
Je m’explique:
Comme vous le savez très bien je veux faire un système de recharge pour chaque sort sur l’arc avec la fonction onUpdate.
Le soucis est que cette fonction fait bug mon arc comme ceci: https://youtu.be/wThsb3Fi4jU
Du coup pour évité ce problème je r’ajoute un world.isRemote comme ça:@Override public void onUpdate(ItemStack item, World world, Entity player, int slotIndex, boolean inHand) { if(!item.hasTagCompound()) { item.setTagCompound(new NBTTagCompound()); } if(world.isRemote) // Comme ça { 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); } }Mais le soucis c’est que le world.isremote cause un soucis du coup les timers ils sont complètement faux j’ai fias un test sans le world.isremote avec le bug et la les timers marche.
Du coup je vois pas du tout comment faire car même avec un !world.isRemote c’est le même soucis!
J’espère que vous m’avez compris sinon faite le moi savoir!
Merci en tout cas robin

-
Faudrait voir si on peut désactiver la synchro du tag nbt.
Car c’est ça qui fait ce bug visuel. -
D’acc je cherche de mon côté demain la je vais dodo !
Edit:
J’ai pas trouvé perso sur internet.
C’est possible tu penses ?
-
@Override public boolean getShareTag() { return false; } -
@‘BrokenSwing’:
@Override public boolean getShareTag() { return false; }Salut,
J’ai ajouté cette fonction dans la classe de mon arc et j’ai ensuite enlever le world.isremote mais j’ai toujours le problème “visuel” comme dis robin.
Je précise juste que ce bug influence aussi sur le “chargement” de l’arc c’est un peu compliqué a expliqué.
Je sais pas si vous voyez se que je veux dire au pire vous avez mon src juste au dessus vous enlevez le if(world.isremote) dans la fonction onUpdate de l’arc et vous verrez par vous même.
En tout cas merci quand même x) .
-
Je vais tester de mon côté, les sources n’ont pas été modifiées ?
EDIT : j’ai pris les sources données par robin. Mis à part quelques petits trucs qui ne sont pas très correctes, le code est globalement bon. En revanche je n’est pas ton problème lorsque je test de mon côté, est-ce que tu testes sur cauldron ou quelque chose comme ça ?
-
Coucou !
Bon, alors j’avais étudier le système de minecraft car je voulais faire un truc similaire.
En fait c’est simple : tu peux pas.Quand tu mets à jour un NBT, ça met à jour ton ItemStack et ça fait planter le “Player Using Item”.
On peut très bien récupérer des données via le getter des NBTTagCompound, mais faut surtout pas utiliser les setters.
Pour les sceptiques, faites le test vous verrez.
Du coup t’as plusieurs options : soit tu refait un système de “Use Item”, un peu relou, soit tu utilises les ExtendedProperties et tu stock les cooldowns “sur le joueur”, par contre c’est un peu sale. (Ou une autre méthode à toi de voir, là c’est les deux qui me viennent à l’esprit tout de suite)
-
Pourtant moi quand je teste j’ai aucun problème
-
C’est bizarre, car en 1.7.10, c’est justement un problème.
Utiliser les NBT dans le onUpdate ou dans le onUsingTick va empêcher la méthode onPlayerStoppedUsing d’être appelée. (Et en plus ça fait le problème visuel)
Si tu veux jeter un oeil : http://www.minecraftforge.net/forum/index.php?topic=35035.0 -
Peut être que le problème a été réglé dans ma version
-
@‘SCAREX’:
Peut être que le problème a été réglé dans ma version
Euhh tu as enlever la ligne if(world.isRemote) dans la fonction onUpdate
Salut Eikins,
Merci des infos, du coup c’est chiant ouais…
Y’a vraiment aucun moyen autre fonction ou une autre version de forge ?En tout cas merci de votre aides!
-
Je n’ai absolument rien modifié, j’ai pris le zip donné par robin, s’il est différent du tiens, envoi le tiens
-
@‘SCAREX’:
Je n’ai absolument rien modifié, j’ai pris le zip donné par robin, s’il est différent du tiens, envoi le tiens
Tien:
Si tu veux “réglé” le problème tu rajoute un if(world.isremote) dans la fonction onUdpate de l’arc (FlameBow) mais ça fausse les timers…
-
Effectivement je comprends d’où vient le problème maintenant : à chaque fois que tu modifies les nbt de l’itemStack, son utilisation est reset, le seul moyen est donc de stocker autre pars ton timer, par exemple dans un ExtendedEntityProperties, ce qui résoudrai le problème.
EDIT : petite question, pourquoi utiliser un timer sachant que tu en as déjà un dans les paramètres ?
-
@‘SCAREX’:
Effectivement je comprends d’où vient le problème maintenant : à chaque fois que tu modifies les nbt de l’itemStack, son utilisation est reset, le seul moyen est donc de stocker autre pars ton timer, par exemple dans un ExtendedEntityProperties, ce qui résoudrai le problème.
EDIT : petite question, pourquoi utiliser un timer sachant que tu en as déjà un dans les paramètres ?
Pour l’extended je suis chaud par contre va falloir que je re regarde les extended ^^ .
dans ton edit:
C’est à dire je peux directement faire un timer sans la fonction onupdate ? j’ai pas bien compris x)
-
Il veut dire que l’entity player possède déjà un timer qui compte depuis combien de temps il utilise l’objet.
-
Pour l’EEP, voici qui t’aidera : https://www.minecraftforgefrance.fr/showthread.php?tid=905
Bah tu incrémentes un timer lorsque l’item est utilisé mais minecraft incrémente déjà un timer (ton paramètre useRemaining), donc je vois pas l’utilité de créer plusieurs timers
-
Re,
Alors du coup j’ai fais l’extended
voilà ma classe:public class ExtendedEntityPropTimer implements IExtendedEntityProperties { public final static String EXT_PROP_NAME = "ExtPropTimer"; private final EntityPlayer player; public int timer; public ExtendedEntityPropTimer(EntityPlayer player) { this.player = player; this.timer = 0; } public static final void register(EntityPlayer player) { player.registerExtendedProperties(ExtendedEntityPropTimer.EXT_PROP_NAME, new ExtendedEntityPropTimer(player)); } public static final ExtendedEntityPropTimer get(EntityPlayer player) { return (ExtendedEntityPropTimer) player.getExtendedProperties(EXT_PROP_NAME); } @Override public void saveNBTData(NBTTagCompound compound) { NBTTagCompound properties = new NBTTagCompound(); properties.setInteger("Timer", this.timer); compound.setTag(EXT_PROP_NAME, properties); } @Override public void loadNBTData(NBTTagCompound compound) { NBTTagCompound properties = (NBTTagCompound) compound .getTag(EXT_PROP_NAME); properties.setInteger("Timer", this.timer); } public final void sync() { PacketTimer packetTimer = new PacketTimer(this.timer); LegacyMod.network.sendToServer(packetTimer); if (!player.worldObj.isRemote) { EntityPlayerMP player1 = (EntityPlayerMP) player; //Ici, même chose que précédemment, sauf que le packet est envoyé au player. LegacyMod.network.sendTo(packetTimer, player1); } } private static String getSaveKey(EntityPlayer player) { return player.getDisplayName() + ":" + EXT_PROP_NAME; } public static void saveProxyData(EntityPlayer player) { ExtendedEntityPropTimer playerData = ExtendedEntityPropTimer.get(player); NBTTagCompound savedData = new NBTTagCompound(); playerData.saveNBTData(savedData); CommonProxy.storeEntityData(getSaveKey(player), savedData); } public static void loadProxyData(EntityPlayer player) { ExtendedEntityPropTimer playerData = ExtendedEntityPropTimer.get(player); NBTTagCompound savedData = CommonProxy .getEntityData(getSaveKey(player)); if (savedData != null) { playerData.loadNBTData(savedData); } playerData.sync(); } @Override public void init(Entity entity, World world) { // TODO Auto-generated method stub } }Mon packet:
public class PacketTimer implements IMessage{ private int Timer; public PacketTimer() { } public PacketTimer(int timer) { this.Timer = timer; } @Override public void fromBytes(ByteBuf buf) { this.Timer = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { buf.writeInt(this.Timer); } public static class Handler implements IMessageHandler <packettimer, imessage="">{ public IMessage onMessage(PacketTimer message, MessageContext ctx) { ExtendedEntityPropTimer props = ExtendedEntityPropTimer .get(ctx.getServerHandler().playerEntity); props.timer = message.Timer; return null; } } }register packet:
network.registerMessage(PacketTimer.Handler.class, PacketTimer.class, 4, Side.SERVER);Mais je suis bloqué car je vois pas trop comment faire pour le timer.
Je dois rajouter des fonctions dans l’extended pour le timer ou pas ? je dois surement faire this.timer++ / – mais je vois pas du tout ou ^^ et esque je dois faire aussi des fonction settimer / gettimer etc…Merci :)</packettimer,>
-
Maintenant que tu as ton EEP, il fait falloir utiliser les event forge, notamment le TickEvent.PlayerTickEvent.
Attention toutefois, cet event est appelé deux fois : une fois au début du tick, et une fois à la fin du tick.
Donc tu vérifies si la Phase de l’event est END, et tu appelles une méthode d’update que tu auras préalablement créer dans ton EEP.Comme ceci :
public void onTickEnd() { //Ton code }@SubscribeEvent public void onPlayerTick(TickEvent.PlayerTickEvent event) { if(event.phase.equals(Phase.END)) { ExtendedEntityPropTimer.get(event.player).onTickEnd(); } }