Résolu Enlever les dégats d'explosion pour une armure
-
Bonjour, je suis à la recherche de comment faire pour que mon armure immunise le joueur contre les dégats d’explosion.
Si quelqu’un a la solution je le remercierai.
Bonne journée :beaming_face_with_smiling_eyes: -
Oui ton event n’est jamais appelé
-
Bonsoir,
Regardes du côté de l’event LivingDamageEvent.
Avecevent.getSource().isExplosion()
tu peux savoir si les dégats viennent d’une explosion, reste à vérifier si le joueur à l’armure et cancel l’event. -
Salut, le plus simple et sans doute le plus propre est de passer par les events, en outre LivingDamageEvent, tu récupère l’entité ( event.getEntity() instanceof EntityPlayer ), puis la source des dégâts, je n’ai pas de méthode en tête, de la tu vérifie les slots d’armure du joueur et si c’est ok event.setCanceled( true ) c’est basique mais sa devrait suffire ^^
-
Désolé de redemander mais, j’ai mis comme la bonne réponse trop rapidement. Ca ne va pas.
Quelqu’un pourrait me dire pourquoi ?package com.drastic.mod.init.objects.armour; import com.drastic.mod.Main; import com.drastic.mod.init.ItemInit; import com.drastic.mod.util.IHasModel; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Enchantments; import net.minecraft.init.MobEffects; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.event.entity.living.LivingDamageEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; public class ArmourMod extends ItemArmor implements IHasModel { public static boolean isC, isH, isL, isB; public ArmourMod(String name, ArmorMaterial materialIn, int renderIndexIn, EntityEquipmentSlot equipmentSlotIn) { super(materialIn, renderIndexIn, equipmentSlotIn); setUnlocalizedName(name); setRegistryName(name); setCreativeTab(CreativeTabs.COMBAT); ItemInit.ITEMS.add(this); } @Override public void registerModels() { Main.proxy.registerItemRederer(this, 0); } @Override public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { if(isFullSet(player)) { if(player.isBurning()) { player.addPotionEffect(new PotionEffect(MobEffects.FIRE_RESISTANCE, 5, 0, true, false)); } if(player.isInWater()) { player.addPotionEffect(new PotionEffect(MobEffects.WATER_BREATHING, 5, 0, true, false)); } if(player.isPotionActive(MobEffects.POISON)) { player.removePotionEffect(MobEffects.POISON); } if(player.isPotionActive(MobEffects.SLOWNESS)) { player.removePotionEffect(MobEffects.SLOWNESS); } if(player.isPotionActive(MobEffects.HUNGER)) { player.removePotionEffect(MobEffects.HUNGER); } if(player.isPotionActive(MobEffects.BLINDNESS)) { player.removePotionEffect(MobEffects.BLINDNESS); } if(player.getHealth() < 5) { player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 5, 0, true, false)); } player.addPotionEffect(new PotionEffect(MobEffects.RESISTANCE, 5, 0, true, false)); player.addPotionEffect(new PotionEffect(MobEffects.STRENGTH, 5, 0, true, false)); player.addPotionEffect(new PotionEffect(MobEffects.JUMP_BOOST, 5, 1, true, false)); player.addPotionEffect(new PotionEffect(MobEffects.HASTE, 5, 0, true, false)); player.capabilities.allowFlying = true; player.capabilities.setPlayerWalkSpeed(0.2F); player.capabilities.setFlySpeed(0.2F); } else { player.capabilities.allowFlying = false; player.capabilities.isFlying = false; player.capabilities.setPlayerWalkSpeed(0.1F); player.capabilities.setFlySpeed(0.1F); } super.onArmorTick(world, player, stack); } public static boolean isFullSet(EntityPlayer player){ ItemStack head = player.getItemStackFromSlot(EntityEquipmentSlot.HEAD); ItemStack chest = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); ItemStack legs = player.getItemStackFromSlot(EntityEquipmentSlot.LEGS); ItemStack feet = player.getItemStackFromSlot(EntityEquipmentSlot.FEET); return !head.isEmpty() && head.getItem() instanceof ArmourMod && !chest.isEmpty() && chest.getItem() instanceof ArmourMod && !legs.isEmpty() && legs.getItem() instanceof ArmourMod && !feet.isEmpty() && feet.getItem() instanceof ArmourMod; } public static void noBlastDamage(LivingDamageEvent e, EntityPlayer player) { if(e.getSource().isExplosion()) { if(isFullSet(player)) { e.setCanceled(true); } } } }
-
Je pense que ce dont ils parlaient c’est dans ta classe où tu souscris aux évènements (avec l’annotation SubscribeEvent) c’est de souscrire à l’event LivingDamageEvent
@SubscribeEvent public static void onLivingGettingHit(LivingDamageEvent event) { }
de vérifier si l’entité affectée par l’event est le joueur et si la source est une explosion
if(event.getEntity() instanceof EntityPlayer && event.getSource().isExplosion())
et dans ce cas là, tu annules
event.setCanceled(true);
-
Et quelle est cette class ? la principale , la registryHandler ?
Merci -
La classe où tu as mis ton
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
ou ton
MinecraftForge.EVENT_BUS.register(this);
personnellement, je l’ai dans ma classe principale :face_with_monocle:
-
D’accord, je vais voir
Merci :beaming_face_with_smiling_eyes: -
@Epharos Malheureusement, ca ne va pas.
Il y a t il un problème dans mon code ?package com.drastic.mod; import com.drastic.mod.init.objects.armour.ArmourMod; import com.drastic.mod.proxy.CommonProxy; import com.drastic.mod.util.Reference; import com.drastic.mod.util.handlers.RegistryHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.event.entity.living.LivingDamageEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.Mod.Instance; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @Mod(modid = Reference.MODID, name = Reference.NAME, version = Reference.VERSION) public class Main { @Instance public static Main instance; @SidedProxy(clientSide = Reference.CLIENT, serverSide = Reference.COMMON) public static CommonProxy proxy; @EventHandler public static void preInit(FMLPreInitializationEvent e) { RegistryHandler.preInitRegistries(); } @EventHandler public static void init(FMLInitializationEvent e) { RegistryHandler.initRegistries(); } @EventHandler public static void postInit(FMLPostInitializationEvent e) { } @SubscribeEvent public static void noBlastDamage(LivingDamageEvent event) { if(event.getEntity() instanceof EntityPlayer && event.getSource().isExplosion()) { event.setCanceled(true); } } }
-
Ce message a été supprimé ! -
Oui ton event n’est jamais appelé
-