Résolu ReCréer un enchantement Death Strider
-
Salut, j’ai un petit problème je voudrais essayer de recréer l’enchantement Death Strider (permet d’aller plus vite dans l’eau)
Mais je ne sais pas quel event appeler donc si vous avez deux trois idée je suis preneur
Merci -
Tu peux essayer avec le playerTickEvent
-
Alors j’ai fais au mieux mais je ne vais pas plus vite sous l’eau =/ :
package fr.serveur.mods; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraft.entity.player.EntityPlayer; public class Eventenchant { public void onplayeriswater(PlayerTickEvent event,EntityPlayer player, World world) { { if (player.isInWater()) { player.motionX *= 1.2D; if (player.motionY > 0.0D) { player.motionY *= 1.2D; } player.motionZ *= 1.2D; double maxSpeed = 0.2D; if (player.motionX > maxSpeed) { player.motionX = maxSpeed; } else if (player.motionX < -maxSpeed) { player.motionX = -maxSpeed; } if (player.motionY > maxSpeed) { player.motionY = maxSpeed; } if (player.motionZ > maxSpeed) { player.motionZ = maxSpeed; } else if (player.motionZ < -maxSpeed) { player.motionZ = -maxSpeed; } } } } public boolean hasEnchantment(ItemStack stack, int id) { boolean flag = false; if (stack.getEnchantmentTagList() != null) { for (int i = 0; i < stack.getEnchantmentTagList().tagCount(); i++) { if (stack.getEnchantmentTagList().getCompoundTagAt(i).getShort("140") == id) { flag = true; } else { flag = false; } } } return flag; } }
-
ta fonction n’est pas enregistrée correctement, regarde le tutoriel sur les événements.
-
@SubscribeEvent Je l’ai rajouter mais toujours rien =/
-
Tu as enregistré la classe ?
-
MinecraftForge.EVENT_BUS.register(new Eventenchant());
Dans preinit -
PlayerTickEvent est un event de FML, donc faut utiliser la méthode de FML.
Aussi, un seul argument pour les fonctions d’event :
public void onplayeriswater(PlayerTickEvent event,EntityPlayer player, World world) {
->
public void onplayeriswater(PlayerTickEvent event) {
Utilises event.player et event.player.worldObj -
Juste comme ça pense à la convention Java et renomme ta méthode d’event.
-
Ok merci ça marche mais juste une question je ne peux pas changer de sens si je ne m’arrête pas une idée ?
-
Mh… tu peux toujours changer de manière brutale la vitesse du joueur comme ceci :
event.player.getEntityAttributes(SharedMonsterAttributes.movementSpeed).setBaseValue(5D); //5D = un exemple de double
-
J’essaye de suite merci !
-
C’est moins efficace que mon ancien code le problème c’est que le FOV change mais pas le speed même si j’augmente 5D
-
Personne n’aurais une idée ?
-
Quel est le problème ?
Tu veux modifier la vitesse du joueur quand il est dans l’eau et qu’il a l’enchantement, c’est ça ? -
Yeap c’est tous a fais ça
-
Alors il me semble que passer par les Events soit la meilleur solution
-
xD pour info c’est se que je fais lis la page n°1
-
J’avais lu la première page mais bon …
Voilà un code, je ne sais pas si ça te conviendra :@SubscribeEvent public void onPlayerTick(PlayerTickEvent event) { EntityPlayer player = event.player; if(player.isInWater()) { //Si il est dans l'eau on augmente sa vitesse de marche player.capabilities.setPlayerWalkSpeed(0.15F); } else { //Si il est pas dans l'eau on lui remet sa vitesse de marche normale player.capabilities.setPlayerWalkSpeed(0.1F); } }
-
Au pire minecraft 1.8 n’a pas une classe sur laquelle je peux me baser pour le code ?