Monture Custom
-
Moi non plus, j’ai regardé la classe de la selle
-
Edit: Cette méthode tombe vraiment à pic. Merci Bodri pour ton intuition sur la selle.
Alors j’arrive à récupérer l’item voulu en fonction de l’entité sur laquelle je clique. Le problème est que ça consomme deux fois l’item et me donne deux fois l’autre item ^^’
Par contre si je clique sur une autre entité avec cette item je crash, où dois-je mettre le nullcheck svp?
:::
public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity) { int metadata = stack.getItemDamage(); if (metadata == 14) { DataWatcher dw = entity.getDataWatcher(); if (dw.getWatchableObjectString(30) == "Moto" && entity instanceof EntityMoto) { entity.setDead(); –stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 0)); return true; } else if (dw.getWatchableObjectString(30) == "Kart2" && entity instanceof EntityKart) { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 12)); return true; } else if (entity instanceof EntityBolide) { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 13)); return true; } } else return false; } return false; }:::
-
Envoies le rapport de crash.
Et pour l’action fait en double il faut ajouter if(!world.isRemote) -
En faisant:
:::
public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity, World world) { int metadata = stack.getItemDamage(); if (metadata == 14 && !world.isRemote) {[…]}:::
Les items ne remplissent plus leur fonction mais font toujours crash quand je clique sur un animal (autre entité que mes véhicules).
Et le rapport de crash (quand je ne met pas le isRemote): Pastebin
-
La condition “entity instanceof EntityMoto” doit être avant “dw.getWatchableObjectString(30) == “Moto””
-
C’était bien ça.
Par contre toujours le même problème de “double action” exécutée côté client +serveur je suppose mais le !world.isRemote que je rajoute rend obselète la méthode: l’item ne fonctionne plus quoi.
-
Pourtant il n’y a pas de raison pour que ça bloque. Étrange.
-
La méthode en entière même si ça va pas vraiment aider: (beaucoup de répétitions)
:::
public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity, World world) { int metadata = stack.getItemDamage(); if (!world.isRemote && metadata == 14) { DataWatcher dw = entity.getDataWatcher(); if (entity instanceof EntityMoto && dw.getWatchableObjectString(30) == "Moto") { entity.setDead(); –stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 0)); return true; } else if (entity instanceof EntityMoto && dw.getWatchableObjectString(30) == "Moto1") { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 1)); return true; } else if (entity instanceof EntityMoto && dw.getWatchableObjectString(30) == "Moto2") { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 2)); return true; } else if (entity instanceof EntityBMX && dw.getWatchableObjectString(30) == "BMX") { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 3)); return true; } else if (entity instanceof EntityBMX && dw.getWatchableObjectString(30) == "BMX1") { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 4)); return true; } else if (entity instanceof EntityBMX && dw.getWatchableObjectString(30) == "BMX2") { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 5)); return true; } else if (entity instanceof EntityBuggy && dw.getWatchableObjectString(30) == "Buggy") { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 6)); return true; } else if (entity instanceof EntityBuggy && dw.getWatchableObjectString(30) == "Buggy1") { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 7)); return true; } else if (entity instanceof EntityBuggy && dw.getWatchableObjectString(30) == "Buggy2") { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 8)); return true; } else if (entity instanceof EntityBaignoire) { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 9)); return true; } else if (entity instanceof EntityKart && dw.getWatchableObjectString(30) == "Kart") { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 10)); return true; } else if (entity instanceof EntityKart && dw.getWatchableObjectString(30) == "Kart1") { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 11)); return true; } else if (entity instanceof EntityKart && dw.getWatchableObjectString(30) == "Kart2") { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 12)); return true; } else if (entity instanceof EntityBolide) { entity.setDead(); --stack.stackSize; player.inventory.addItemStackToInventory(new ItemStack(Modpg.itemMonture, 1, 13)); return true; } else return false; } return false; }:::
Est-ce que je te mets la classe en entière? La même beaucoup de répétitions c’est pas un truc trop fournis, c’pour ça que je vois pas où ça bloque.
-
Ajoutes au début de la fonction:
System.out.println(world.isRemote)
et dit moi ce qu’il y a dans la console. -
ça ne marque rien par contre j’ai compris à quel moment ça ne faisait plus rien, c’est quand j’ajoute l’argument World:
public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity, World world)Alors qu’on m’a conseillé de l’utiliser comme ça
public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity)La différence est simple, l’un marche, l’autre non Xd.
Erreur en java de ma part?
-
Oui en effet, si tu ajoutes un argument ce n’est plus la même fonction. Comme tu n’as pas d’argument world tu peux utiliser player.worldObj.isRemote
-
Je sens que ça va finir par rentrer mais là c’est pas encore ça:
:::
public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity) { int metadata = stack.getItemDamage(); if (player.worldObj.isRemote && metadata == 14) {:::
Alors en ayant fait ça ça me donne toujours deux items mais en plus en déco/reco les entités reviennent.
J’en déduis juste qu’il n’y a que le côté client qui a été pris en compte… Bref que j’ai pas mis ça comme et où il fallait Xdedit: Encore plus n’importe quoi avec “!” devant “player” xD
-
!player.worldObj.isRemote
et non player.worldObj.isRemote -
Ah bah c’est ce que j’ai de suite tenté et c’est encore plus bizarre:
L’entité disparait deco/reco elle a bien disparu, par contre les items:
je clique, y’a rien, déco/reco: bim y’en a deux qui sont apparus.
J’ai supprimé la carte et j’ai en créé une autre au cas où, ça ne change rien. -
Bon visiblement si je mets comme condition que le joueur doit être en train de sneak c’est bon.
Reste le test serveur mais ça devrait être ça
-
Salut, je reviens sur les montures avec un point de détail qui reste quand même quelque chose de visuellement très frappant.
Pour que mes montures ne bougent plus quand on n’est pas dessus j’ai fais ça::::
else if (this.riddenByEntity == null) { motionX = motionY = motionZ = 0.0F; }:::
Ce qu’il fait que si je quitte le véhicule en l’air, celui-ci reste figé dans les airs, comme si de rien était.
Je vois mal la condition qu’il me faut pour, qu’une fois dépourvu de rider, la monture retombe au sol avant de rester immobile.Je souligne le fait que mes véhicules ont le code du cheval et le onUpdate qui va avec donc.
-
else if (this.riddenByEntity == null) { motionX = motionZ = 0.0F; }Voila, suffit de faire comme ça.
-
J’ai bien déjà “tenté” ça et la monture reste tout de même figée en l’air.
Edit:
Ce soucis est réglé, il faut croire que bidouiller le code du cheval c’est pas top.
:::public void onUpdate() { super.onUpdate(); if (this.riddenByEntity == null) { motionX = motionZ = 0.0F; this.rotationYaw = this.prevRotationYaw; } }:::
-
Me revoici également sur les montures et ce concernant la privatisation de l’entité.
De ce que j’ai pu obtenir comme info, je dois faire via datawatcher et nbt, comme il en avait été question pour les textures.
Actuellement j’ai ces méthodes:
:::
public boolean interact(EntityPlayer player) { String str = this.getTagCompound().getString("<id>"); if (player.inventory.getCurrentItem() == null && this.riddenByEntity == null && str.equals ("<id>")) { this.moteur = 200; worldObj.playSoundAtEntity(this, "modpg:moteur", 1.0F, 1.0F); player.mountEntity(this); return true; } return false; } public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); DataWatcher dw = this.getDataWatcher(); nbt.setString("EntityBaignoireTexture", dw.getWatchableObjectString(30)); nbt.setInteger("timer", this.timer); nbt.setString("<id>", dw.getWatchableObjectString(31)); } public void readEntityFromNBT(NBTTagCompound nbt) { super.readEntityFromNBT(nbt); DataWatcher dw = this.getDataWatcher(); dw.updateObject(30, nbt.getString("EntityBaignoireTexture")); dw.updateObject(31, nbt.getString("<id>")); nbt.getInteger("timer"); }:::
Et dans une classe j’ai la méthode handleConstruction pour faire:
:::else if(event.entity instanceof EntityBaignoire) { DataWatcher dw = event.entity.getDataWatcher(); dw.addObject(30, "PG Baignoire"); dw.addObject(31, "<id>"); }:::
Mon principal soucis est de récupérer mon nbt dans l’entité car:
String str = this.getTagCompound().getString("<id>");Me fait une erreur sur le “.getTagCompound()” (tout naturellement m’as-t-on dis)
Je m’en remet à vous à ce sujet.</id></id></id></id></id></id>
-
EUh, là tu utilises les dataWatcher les nbt en même temps ? Or dataWatcher != nbt