Recherche Recherche Plugin Svp

Ricco

Aventurier
17 Octobre 2018
10
1
4
Salut a tout le monde, cela fait un bout de temps que je cherche un plugin, il est simple mais malheureusement introuvable.
Je recherche un plugin pour pouvoir faire des effets aux armes par exemple une épée qui empoisonne, vol de vie, gel ou même faire tomber des éclairs ou même des effets wither, aussi des arcs pour pouvoir faire pareil , des grappins ect.
Avant il y avais Custom enchantements qui était parfais pour çà mais malheureusement abandonné.

J'ai besoin de votre aide si vous connaissez un plugin a mes attentes svp
 
Dernière édition:

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 139
162
464
247
21
Mìlhüsa
Bonsoir,

Je peux te faire cela, ce n'est vraiment pas compliqué. Il me faudrait juste :
  • La version de ton serveur,
  • La liste complète des effets, et
  • Comment ceux-ci s'obtiennent-ils.
Plus tu donnes d'informations, mieux sera le plugin.

Cordialement,
ShE3py.
 
  • J'aime
Reactions: Ricco

Ricco

Aventurier
17 Octobre 2018
10
1
4
D'accord mais le probleme est que j'utilise boxtoplay pour mon serveur donc pour les plugin je les installe pas moi meme j'ai une liste de plugin et je clique sur installer donc je ne sais pas comment faire (Regarde le fichier que j'envoie)

PS : mon serv est en 1.13.1

Sinon pour les effets :
Effet corps à corps (Quand tu attaque avec click gauche) :
- Wither
- Poison
- Lifesteal
- Ralentissemnt
- Célérité
- Gooey ( Project l'ennemis dans les airs ) un peu comme un golem de fer
- Click droit et fait tomber un eclair
- Charge sur l'ennemis en click droit

Effet Arc :
- Explosif ( sasn casser les blocs )
- Eclair ( a l'impact de la fleche )
- tire un feu d'artifice a la place de la fleche
- paralyse
- Wither ( a l'impact de la fleche )
- Perforation ( ignore l'armure )
- Grappin
- Teleportation
- Poison

Le tout sous forme d'enchantement givable ( non craftable ou obtenable )
Bien sur si l'effet est trop compliquer ou infaisable c'est pas grave pas obligé

Et aussi des effets sur les armures tel que :

- Night vision ( pour le casque )
- Jumpboost ( pour botte )
- Speed boost ( pour botte )
- un boost de regen constant
- explose à la mort du porteur
- 3 coeur ou moins gagne force 2

Pour le reste ce sont des effets qui s active lorsque on te tape :
- brule l ennemi
- regen 1/4 des dégâts reçu
- ralentis l ennemi
- empoissonne l ennemi
- nausée au ennemis
- wither au ennemi
- gain de speed
- drunk à l ennemi ( mining fatigue + slow )
- 1/3 de gagné résistance pendant 2s quand on t attaque
 

Fichiers joints

  • serv.PNG
    serv.PNG
    160.9 KB · Affichages: 307
Dernière édition:

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr
Salut,

D'accord mais le probleme est que j'utilise boxtoplay pour mon serveur donc pour les plugin je les installe pas moi meme
à partir du moment où tu as les accès (S)FTP(S), pas de problème. L'installation de plugin est extrêmement simple, tu télécharges le fichier .jar sur un site de confiance puis tu le glisses dans le dossier plugins. Ensuite, tu démarres ton serveur et le tour est joué.
D'ailleurs, note en passant, je te déconseille d'utiliser ces plugins fournis par l'hébergeur, généralement ils ne sont pas à jour ; il vaut mieux toujours aller sur un site de confiance (Spigot par exemple) et regarder précisément ce que fait le plugin et s'il a des chances d'être correctement fonctionnel.

PS: J'ai fusionné ton triple-post histoire de laisser la discussion lisible. ;)
 
  • J'aime
Reactions: Ricco

Ricco

Aventurier
17 Octobre 2018
10
1
4
Salut,


à partir du moment où tu as les accès (S)FTP(S), pas de problème. L'installation de plugin est extrêmement simple, tu télécharges le fichier .jar sur un site de confiance puis tu le glisses dans le dossier plugins. Ensuite, tu démarres ton serveur et le tour est joué.
D'ailleurs, note en passant, je te déconseille d'utiliser ces plugins fournis par l'hébergeur, généralement ils ne sont pas à jour ; il vaut mieux toujours aller sur un site de confiance (Spigot par exemple) et regarder précisément ce que fait le plugin et s'il a des chances d'être correctement fonctionnel.

PS: J'ai fusionné ton triple-post histoire de laisser la discussion lisible. ;)
D accord merci beaucoup dans ce cas je vais faire comme ça
 
  • J'aime
Reactions: DiscowZombie

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 139
162
464
247
21
Mìlhüsa
Bonjour,

J'ai à peu près fini le plugin, tu me dis si tu souhaites modifier quelques trucs :

Corps à corps, épées uniquement :
  • Wither
    Applique l'effet Wither I pendant 5 secondes à la cible.

  • Poison
    Applique l'effet Poison I pendant 5 secondes à la cible.

  • Slow
    Applique l'effet Slow I pendant 5 secondes à la cible.

  • Blindness
    Applique l'effet Blindness I pendant 5 secondes à la cible.

  • Lifesteal
    Soigne l'attaquant de 20% des dégâts infligés.

Distance, arcs uniquement :
  • Wither
    Applique l'effet Wither I pendant 5 secondes à la cible.

  • Perforation
    Les flèches ignorent la protection des armures.

  • Teleportation
    Téléporte le joueur à l'emplacement où la flèche tombe.

  • Explosive
    Les flèches créent une explosion équivalente à une TNT là où elles tombent.
    Note: L'attaquant ne peut subir ces dégâts et les dégâts lui sont associés (s'il tue un joueur, il aura le kill).

  • Lightning
    Les flèches créent un éclair là où elles tombent.
    Note: L'attaquant peut subir ces dégâts et les dégâts ne lui sont pas associés (s'il tue un joueur, il n'aura pas le kill).
Commande :
/ench <enchantment>
Ajoute l'enchantement spécifié sur l'item qu'à en main l'entité. Elle doit avoir la permission customenchants.use, ou être OP.​

Effet corps à corps (Quand tu attaque avec click gauche) :
- Gooey ( Project l'ennemis dans les airs ) un peu comme un golem de fer
- Click droit et fait tomber un eclair
- Charge sur l'ennemis en click droit
Je n'ai pas fait ceci, respectivement car :
- J'obtiens un bug lorsque l'entité a déjà une vélocité, en gros elle saute de 500 blocs au lieu de 3.
- Il faudrait faire un ray range, ce qui est quelques peu compliqué.
- Il faudrait aussi faire un sorte de ray range, combiné avec un vecteur unitaire pour le déplacement.

Et aussi des effets sur les armures tel que :
- Night vision ( pour le casque )
- Jumpboost ( pour botte )
- Speed boost ( pour botte )
- un boost de regen constant
- explose à la mort du porteur
- 3 coeur ou moins gagne force 2

Pour le reste ce sont des effets qui s active lorsque on te tape :
- brule l ennemi
- regen 1/4 des dégâts reçu
- ralentis l ennemi
- empoissonne l ennemi
- nausée au ennemis
- wither au ennemi
- gain de speed
- drunk à l ennemi ( mining fatigue + slow )
- 1/3 de gagné résistance pendant 2s quand on t attaque
Je t'invite à recruter un développeur, je pense que ceci est plus spécifique à ton serveur et plus long à développer.

Pour les effets sur les armures un mod serait plus envisageable je trouve, même si cela reste tout à fait possible en plugin. Il n'y a juste pas de vrai évènement quand l'armure change, il faudrait traiter les évènements InventoryClick, PlayerInteract & BlockDispense (source).

Pour les sortes d'abilities c'est juste du bête code, pour la sauvegarde et le déblocage c'est plus ardu.

Sinon, les commandes du plugin sont affichées en anglais, si tu souhaites du français dis-le moi.

Cordialement,
ShE3py.

Plugin: CustomEnchants.jar, code source :
Code:
package fr.she3py.ce;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.logging.Level;
import java.util.stream.Collectors;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.attribute.Attribute;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.craftbukkit.v1_13_R2.CraftWorld;
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.enchantments.EnchantmentTarget;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageModifier;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

@SuppressWarnings("deprecation")
public class CustomEnchants extends JavaPlugin implements Listener {
	@SuppressWarnings("unchecked")
	@Override
	public void onEnable() {
		try {
			final Field f0 = Enchantment.class.getDeclaredField("byKey");
			f0.setAccessible(true);
			final Map<NamespacedKey, Enchantment> byKey = (Map<NamespacedKey, Enchantment>) f0.get(null);
			
			final Field f1 = Enchantment.class.getDeclaredField("byName");
			f1.setAccessible(true);
			final Map<String, Enchantment> byName = (Map<String, Enchantment>) f1.get(null);
			
			Arrays.asList(Enchants.values()).forEach(e -> {
				byKey.put(e.ench.getKey(), e.ench);
				byName.put(e.ench.getName(), e.ench);
			});
			
			Bukkit.getPluginManager().registerEvents(this, this);
			
			final EnchCommand cmd = new EnchCommand();
			this.getCommand("ench").setExecutor(cmd);
			this.getCommand("ench").setTabCompleter(cmd);
			
		} catch(Exception e) {
			this.getLogger().log(Level.SEVERE, "Unable to enable the plugin", e);
			Bukkit.getPluginManager().disablePlugin(this);
		}
	}
	
	@EventHandler(priority = EventPriority.HIGH)
	public void onEntityDamagedByEntity(final EntityDamageByEntityEvent e) {
		if(!(e.getEntity() instanceof LivingEntity)) return;
		
		if(e.getDamager() instanceof Player) {
			final ItemStack item = ((Player) e.getDamager()).getInventory().getItemInMainHand();
			if(item == null || item.getType() == Material.AIR || !item.hasItemMeta() || !item.getItemMeta().hasEnchants()) return;
			
			item.getItemMeta().getEnchants().keySet().forEach(e0 -> { if(Enchants.has(e0)) Enchants.get(e0).handler.accept(e); });
		}
		else if(e.getDamager() instanceof Arrow) {
			final Arrow arrow = (Arrow) e.getDamager();
			
			if(arrow.hasMetadata("wither"))
				Enchants.WITHER.handler.accept(e);
			
			if(arrow.hasMetadata("perforation"))
				Enchants.PERFORATION.handler.accept(e);
		}
	}
	
	@EventHandler(priority = EventPriority.LOW)
	public void onProjectileLaunch(final ProjectileLaunchEvent e) {
		if(!(e.getEntityType() == EntityType.ARROW && e.getEntity().getShooter() instanceof Player)) return;
		
		final Arrow arrow = (Arrow) e.getEntity();
		final ItemStack item = ((Player) arrow.getShooter()).getInventory().getItemInMainHand();
		if(item == null || item.getType() == Material.AIR || !item.hasItemMeta()) return;
		
		final ItemMeta meta = item.getItemMeta();
		
		if(meta.hasEnchant(Enchants.PERFORATION.ench))
			arrow.setMetadata("perforation", new FixedMetadataValue(this, null));
		
		if(meta.hasEnchant(Enchants.WITHER.ench))
			arrow.setMetadata("wither", new FixedMetadataValue(this, null));
		
		if(meta.hasEnchant(Enchants.EXPLOSIVE.ench))
			arrow.setMetadata("explosive", new FixedMetadataValue(this, null));
		
		if(meta.hasEnchant(Enchants.LIGHTNING.ench))
			arrow.setMetadata("lightning", new FixedMetadataValue(this, null));
		
		if(meta.hasEnchant(Enchants.TELEPORTATION.ench))
			arrow.setMetadata("teleport", new FixedMetadataValue(this, null));
	}
	
	@EventHandler(priority = EventPriority.HIGH)
	public void onProjectileHit(final ProjectileHitEvent e) {
		if(e.getEntityType() != EntityType.ARROW) return;
		
		final Arrow arrow = (Arrow) e.getEntity();
		final Location l = arrow.getLocation();
		
		if(arrow.hasMetadata("lightning"))
			arrow.getWorld().strikeLightning(l);
		
		if(arrow.hasMetadata("explosive"))
			((CraftWorld) arrow.getWorld()).getHandle().createExplosion(((CraftEntity) arrow.getShooter()).getHandle(), l.getX(), l.getY(), l.getZ(), 4F, false, false);
		
		if(arrow.hasMetadata("teleport"))
			((LivingEntity) arrow.getShooter()).teleport(l, TeleportCause.PLUGIN);
		
		// avoid redoing the effects if the arrow falls
		arrow.removeMetadata("explosive", this);
		arrow.removeMetadata("lightning", this);
		arrow.removeMetadata("teleport", this);
	}
	
	private static enum Enchants {
		POISON(new MeleeEnchant("Poison"), e -> ((LivingEntity) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.POISON, 100, 1))),
		SLOW(new MeleeEnchant("Slow"), e -> ((LivingEntity) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 100, 1))),
		BLINDNESS(new MeleeEnchant("Blindness"), e -> ((LivingEntity) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 100, 1))),
		
		LIFESTEAL(new MeleeEnchant("Lifesteal"), e -> {
			final Player dmger = (Player) e.getDamager();
			dmger.setHealth(Math.min(dmger.getHealth() + e.getDamage() * 0.2, dmger.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()));
		}),
		
		PERFORATION(new DistanceEnchant("Perforation"), e -> e.setDamage(DamageModifier.ARMOR, -0)),
		
		TELEPORTATION(new DistanceEnchant("Teleportation"), e -> {}),
		EXPLOSIVE(new DistanceEnchant("Explosive"), e -> {}),
		LIGHTNING(new DistanceEnchant("Lightning"), e -> {}),
		
		WITHER(new HybridEnchant("Wither"), e -> ((LivingEntity) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.WITHER, 100, 1)));
		
		private final Enchant ench;
		private final Consumer<EntityDamageByEntityEvent> handler;
		
		private Enchants(final Enchant ench, final Consumer<EntityDamageByEntityEvent> handler) {
			this.ench = ench;
			this.handler = handler;
		}
		
		public static Enchants get(final Enchantment e) {
			for(int i = 0; i < Enchants.values().length; i++)
				if(Enchants.values()[i].ench == e) return Enchants.values()[i];
			
			return null;
		}
		
		public static Enchants get(final String name) {
			for(int i = 0; i < Enchants.values().length; i++)
				if(Enchants.values()[i].ench.getName().equals(name)) return Enchants.values()[i];
			
			return null;
		}
		
		public static boolean has(final Enchantment e) {
			return get(e) != null;
		}
		
		public void addTo(final ItemStack item) {
			final ItemMeta meta = item.getItemMeta();
			if(meta.hasEnchant(ench)) return;
			meta.addEnchant(ench, 1, false);
			
			final List<String> lore = (meta.hasLore()) ? meta.getLore() : new ArrayList<>();
			lore.add(0, "§r§7" + ench.getName());
			
			meta.setLore(lore);
			item.setItemMeta(meta);
		}
		
		private static class MeleeEnchant extends Enchant {
			public MeleeEnchant(final String name) {
				super(name, name.toLowerCase().replace(' ', '_') + "m");
			}
			
			@Override
			public EnchantmentTarget getItemTarget() {
				return EnchantmentTarget.ALL;
			}
			
			@Override
			public boolean canEnchantItem(final ItemStack item) {
				return EnchantmentTarget.WEAPON.includes(item) || EnchantmentTarget.TOOL.includes(item);
			}
		}
		
		private static class DistanceEnchant extends Enchant {
			public DistanceEnchant(final String name) {
				super(name, name.toLowerCase().replace(' ', '_') + "d");
			}

			@Override
			public EnchantmentTarget getItemTarget() {
				return EnchantmentTarget.BOW;
			}
			
			@Override
			public boolean canEnchantItem(final ItemStack item) {
				return EnchantmentTarget.BOW.includes(item);
			}
		}
		
		private static class HybridEnchant extends Enchant {
			public HybridEnchant(final String name) {
				super(name, name.toLowerCase().replace(' ', '_') + "h");
			}

			@Override
			public EnchantmentTarget getItemTarget() {
				return EnchantmentTarget.ALL;
			}
			
			@Override
			public boolean canEnchantItem(final ItemStack item) {
				return  EnchantmentTarget.WEAPON.includes(item) || EnchantmentTarget.TOOL.includes(item) || EnchantmentTarget.BOW.includes(item);
			}
		}
		
		private static abstract class Enchant extends Enchantment {
			public final String name;
			
			public Enchant(final String name, final String key) {
				super(new NamespacedKey("customenchants", key));
				
				this.name = name;
			}
			
			@Override
			public boolean isTreasure() {
				return false;
			}
			
			@Override
			public boolean isCursed() {
				return false;
			}
			
			@Override
			public int getStartLevel() {
				return 1;
			}
			
			@Override
			public String getName() {
				return name;
			}
			
			@Override
			public int getMaxLevel() {
				return 1;
			}
			
			@Override
			public boolean conflictsWith(final Enchantment other) {
				return false;
			}
		}
	}
	
	private static class EnchCommand implements CommandExecutor, TabCompleter {
		@Override
		public boolean onCommand(final CommandSender sender, final Command command, final String label, final String[] args) {
			if(!(sender instanceof LivingEntity)) { sender.sendMessage("§cYou must be a living entity to do that."); return true; }
			if(!sender.hasPermission("customenchants.use")) { sender.sendMessage("§cYou are not allowed to do this."); return true; }
			if(args.length != 1) return false;
			
			final ItemStack item = ((LivingEntity) sender).getEquipment().getItemInMainHand();
			if(item == null || item.getType() == Material.AIR) { sender.sendMessage("§cYou must have an item in your hand to do this."); return true; }
			
			final Enchants ench = Enchants.get(args[0]);
			if(ench == null) { sender.sendMessage("§cUnknown enchantment."); return true; }
			if(!ench.ench.canEnchantItem(item)) { sender.sendMessage("§cThis enchantment can not be applied on this item."); return true; }
			
			ench.addTo(item);
			sender.sendMessage("The specified enchantment has been added to your item.");
			return true;
		}
		
		@Override
		public List<String> onTabComplete(final CommandSender sender, final Command command, final String alias, final String[] args) {
			if(!(sender instanceof LivingEntity) || !sender.hasPermission("customenchants.use")) return new ArrayList<>();
			if(args.length != 1) return new ArrayList<>();
			
			final ItemStack item = ((LivingEntity) sender).getEquipment().getItemInMainHand();
			if(item == null || item.getType() == Material.AIR) return new ArrayList<>();
			
			return Arrays.asList(Enchants.values())
					.stream()
					.filter(ench -> ench.ench.canEnchantItem(item) && !item.getItemMeta().hasEnchant(ench.ench))
					.map(ench -> ench.ench.getName())
					.collect(Collectors.toList());
		}
	}
}
 

Fichiers joints

  • CustomEnchants.jar
    13 KB · Affichages: 432
Dernière édition:
  • J'aime
Reactions: Fau8

Ricco

Aventurier
17 Octobre 2018
10
1
4
Bonjour,

J'ai à peu près fini le plugin, tu me dis si tu souhaites modifier quelques trucs :

Corps à corps, épées uniquement :
  • Wither
    Applique l'effet Wither I pendant 5 secondes à la cible.

  • Poison
    Applique l'effet Poison I pendant 5 secondes à la cible.

  • Slow
    Applique l'effet Slow I pendant 5 secondes à la cible.

  • Blindness
    Applique l'effet Blindness I pendant 5 secondes à la cible.

  • Lifesteal
    Soigne l'attaquant de 20% des dégâts infligés.

Distance, arcs uniquement :
  • Wither
    Applique l'effet Wither I pendant 5 secondes à la cible.

  • Perforation
    Les flèches ignorent la protection des armures.

  • Teleportation
    Téléporte le joueur à l'emplacement où la flèche tombe.

  • Explosive
    Les flèches créent une explosion équivalente à une TNT là où elles tombent.
    Note: L'attaquant ne peut subir ces dégâts et les dégâts lui sont associés (s'il tue un joueur, il aura le kill).

  • Lightning
    Les flèches créent un éclair là où elles tombent.
    Note: L'attaquant peut subir ces dégâts et les dégâts ne lui sont pas associés (s'il tue un joueur, il n'aura pas le kill).
Commande :
/ench <enchantment>
Ajoute l'enchantement spécifié sur l'item qu'à en main l'entité. Elle doit avoir la permission customenchants.use, ou être OP.​


Je n'ai pas fait ceci, respectivement car :
- J'obtiens un bug lorsque l'entité a déjà une vélocité, en gros elle saute de 500 blocs au lieu de 3.
- Il faudrait faire un ray range, ce qui est quelques peu compliqué.
- Il faudrait aussi faire un sorte de ray range, combiné avec un vecteur unitaire pour le déplacement.


Je t'invite à recruter un développeur, je pense que ceci est plus spécifique à ton serveur et plus long à développer.

Pour les effets sur les armures un mod serait plus envisageable je trouve, même si cela reste tout à fait possible en plugin. Il n'y a juste pas de vrai évènement quand l'armure change, il faudrait traiter les évènements InventoryClick, PlayerInteract & BlockDispense (source).

Pour les sortes d'abilities c'est juste du bête code, pour la sauvegarde et le déblocage c'est plus ardu.

Sinon, les commandes du plugin sont affichées en anglais, si tu souhaites du français dis-le moi.

Cordialement,
ShE3py.

Plugin: CustomEnchants.jar, code source :
Code:
package fr.she3py.ce;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.logging.Level;
import java.util.stream.Collectors;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.attribute.Attribute;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.craftbukkit.v1_13_R2.CraftWorld;
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.enchantments.EnchantmentTarget;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageModifier;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

@SuppressWarnings("deprecation")
public class CustomEnchants extends JavaPlugin implements Listener {
   @SuppressWarnings("unchecked")
   @Override
   public void onEnable() {
       try {
           final Field f0 = Enchantment.class.getDeclaredField("byKey");
           f0.setAccessible(true);
           final Map<NamespacedKey, Enchantment> byKey = (Map<NamespacedKey, Enchantment>) f0.get(null);
        
           final Field f1 = Enchantment.class.getDeclaredField("byName");
           f1.setAccessible(true);
           final Map<String, Enchantment> byName = (Map<String, Enchantment>) f1.get(null);
        
           Arrays.asList(Enchants.values()).forEach(e -> {
               byKey.put(e.ench.getKey(), e.ench);
               byName.put(e.ench.getName(), e.ench);
           });
        
           Bukkit.getPluginManager().registerEvents(this, this);
        
           final EnchCommand cmd = new EnchCommand();
           this.getCommand("ench").setExecutor(cmd);
           this.getCommand("ench").setTabCompleter(cmd);
        
       } catch(Exception e) {
           this.getLogger().log(Level.SEVERE, "Unable to enable the plugin", e);
           Bukkit.getPluginManager().disablePlugin(this);
       }
   }
 
   @EventHandler(priority = EventPriority.HIGH)
   public void onEntityDamagedByEntity(final EntityDamageByEntityEvent e) {
       if(!(e.getEntity() instanceof LivingEntity)) return;
    
       if(e.getDamager() instanceof Player) {
           final ItemStack item = ((Player) e.getDamager()).getInventory().getItemInMainHand();
           if(item == null || item.getType() == Material.AIR || !item.hasItemMeta() || !item.getItemMeta().hasEnchants()) return;
        
           item.getItemMeta().getEnchants().keySet().forEach(e0 -> { if(Enchants.has(e0)) Enchants.get(e0).handler.accept(e); });
       }
       else if(e.getDamager() instanceof Arrow) {
           final Arrow arrow = (Arrow) e.getDamager();
        
           if(arrow.hasMetadata("wither"))
               Enchants.WITHERBOW.handler.accept(e);
        
           if(arrow.hasMetadata("perforation"))
               Enchants.PERFORATION.handler.accept(e);
       }
   }
 
   @EventHandler(priority = EventPriority.LOW)
   public void onProjectileLaunch(final ProjectileLaunchEvent e) {
       if(!(e.getEntityType() == EntityType.ARROW && e.getEntity().getShooter() instanceof Player)) return;
    
       final Arrow arrow = (Arrow) e.getEntity();
       final ItemStack item = ((Player) arrow.getShooter()).getInventory().getItemInMainHand();
       if(item == null || item.getType() == Material.AIR || !item.hasItemMeta()) return;
    
       final ItemMeta meta = item.getItemMeta();
    
       if(meta.hasEnchant(Enchants.PERFORATION.ench))
           arrow.setMetadata("perforation", new FixedMetadataValue(this, null));
    
       if(meta.hasEnchant(Enchants.WITHERBOW.ench))
           arrow.setMetadata("wither", new FixedMetadataValue(this, null));
    
       if(meta.hasEnchant(Enchants.EXPLOSIVE.ench))
           arrow.setMetadata("explosive", new FixedMetadataValue(this, null));
    
       if(meta.hasEnchant(Enchants.LIGHTNING.ench))
           arrow.setMetadata("lightning", new FixedMetadataValue(this, null));
    
       if(meta.hasEnchant(Enchants.TELEPORTATION.ench))
           arrow.setMetadata("teleport", new FixedMetadataValue(this, null));
   }
 
   @EventHandler(priority = EventPriority.HIGH)
   public void onProjectileHit(final ProjectileHitEvent e) {
       if(e.getEntityType() != EntityType.ARROW) return;
    
       final Arrow arrow = (Arrow) e.getEntity();
       final Location l = arrow.getLocation();
    
       if(arrow.hasMetadata("lightning"))
           arrow.getWorld().strikeLightning(l);
    
       if(arrow.hasMetadata("explosive"))
           ((CraftWorld) arrow.getWorld()).getHandle().createExplosion(((CraftEntity) arrow.getShooter()).getHandle(), l.getX(), l.getY(), l.getZ(), 4F, false, false);
    
       if(arrow.hasMetadata("teleport"))
           ((LivingEntity) arrow.getShooter()).teleport(l, TeleportCause.PLUGIN);
    
       // avoid redoing the effects if the arrow falls
       arrow.removeMetadata("explosive", this);
       arrow.removeMetadata("lightning", this);
       arrow.removeMetadata("teleport", this);
   }
 
   private static enum Enchants {
       WITHER("Wither", EnchantmentTarget.WEAPON, e -> ((LivingEntity) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.WITHER, 100, 1))),
       POISON("Poison", EnchantmentTarget.WEAPON, e -> ((LivingEntity) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.POISON, 100, 1))),
       SLOW("Slow", EnchantmentTarget.WEAPON, e -> ((LivingEntity) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 100, 1))),
       BLINDNESS("Blindness", EnchantmentTarget.WEAPON, e -> ((LivingEntity) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 100, 1))),
    
       LIFESTEAL("Lifesteal", EnchantmentTarget.WEAPON, e -> {
           final Player dmger = (Player) e.getDamager();
           dmger.setHealth(Math.min(dmger.getHealth() + e.getDamage() * 0.2, dmger.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()));
       }),
    
       WITHERBOW("Wither", EnchantmentTarget.BOW, e -> ((LivingEntity) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.WITHER, 100, 1))),
       PERFORATION("Perforation", EnchantmentTarget.BOW, e -> e.setDamage(DamageModifier.ARMOR, -0)),
    
       TELEPORTATION("Teleportation", EnchantmentTarget.BOW, e -> {}),
       EXPLOSIVE("Explosive", EnchantmentTarget.BOW, e -> {}),
       LIGHTNING("Lightning", EnchantmentTarget.BOW, e -> {});
    
       private final Enchantment ench;
       private final Consumer<EntityDamageByEntityEvent> handler;
    
       private Enchants(final String name, final EnchantmentTarget target, final Consumer<EntityDamageByEntityEvent> handler) {
           this.ench = new Enchantment(new NamespacedKey("customenchants", name().toLowerCase())) {
               @Override
               public boolean isTreasure() {
                   return false;
               }
            
               @Override
               public boolean isCursed() {
                   return false;
               }
            
               @Override
               public int getStartLevel() {
                   return 1;
               }
            
               @Override
               public String getName() {
                   return name;
               }
            
               @Override
               public int getMaxLevel() {
                   return 1;
               }
            
               @Override
               public EnchantmentTarget getItemTarget() {
                   return target;
               }
            
               @Override
               public boolean conflictsWith(final Enchantment other) {
                   return false;
               }
            
               @Override
               public boolean canEnchantItem(final ItemStack item) {
                   return target.includes(item);
               }
           };
        
           this.handler = handler;
       }
    
       public static Enchants get(final Enchantment e) {
           for(int i = 0; i < Enchants.values().length; i++)
               if(Enchants.values()[i].ench == e) return Enchants.values()[i];
        
           return null;
       }
    
       public static Enchants get(final String name) {
           for(int i = 0; i < Enchants.values().length; i++)
               if(Enchants.values()[i].ench.getName().equals(name)) return Enchants.values()[i];
        
           return null;
       }
    
       public static boolean has(final Enchantment e) {
           return get(e) != null;
       }
    
       public void addTo(final ItemStack item) {
           final ItemMeta meta = item.getItemMeta();
           if(meta.hasEnchant(ench)) return;
           meta.addEnchant(ench, 1, false);
        
           final List<String> lore = (meta.hasLore()) ? meta.getLore() : new ArrayList<>();
           lore.add(0, "§r§7" + ench.getName());
        
           meta.setLore(lore);
           item.setItemMeta(meta);
       }
   }
 
   private static class EnchCommand implements CommandExecutor, TabCompleter {
       @Override
       public boolean onCommand(final CommandSender sender, final Command command, final String label, final String[] args) {
           if(!(sender instanceof LivingEntity)) { sender.sendMessage("§cYou must be a living entity to do that."); return true; }
           if(!sender.hasPermission("customenchants.use")) { sender.sendMessage("§cYou are not allowed to do this."); return true; }
           if(args.length != 1) return false;
        
           final ItemStack item = ((LivingEntity) sender).getEquipment().getItemInMainHand();
           if(item == null || item.getType() == Material.AIR) { sender.sendMessage("§cYou must have an item in your hand to do this."); return true; }
        
           final Enchants ench = Enchants.get(args[0]);
           if(ench == null) { sender.sendMessage("§cUnknown enchantment."); return true; }
           if(!ench.ench.canEnchantItem(item)) { sender.sendMessage("§cThis enchantment can not be applied on this item."); return true; }
        
           ench.addTo(item);
           sender.sendMessage("The specified enchantment has been added to your item.");
           return true;
       }
    
       @Override
       public List<String> onTabComplete(final CommandSender sender, final Command command, final String alias, final String[] args) {
           if(!(sender instanceof LivingEntity) || !sender.hasPermission("customenchants.use")) return new ArrayList<>();
           if(args.length != 1) return new ArrayList<>();
        
           final ItemStack item = ((LivingEntity) sender).getEquipment().getItemInMainHand();
           if(item == null || item.getType() == Material.AIR) return new ArrayList<>();
        
           return Arrays.asList(Enchants.values())
                   .stream()
                   .filter(ench -> ench.ench.canEnchantItem(item) && !item.getItemMeta().hasEnchant(ench.ench))
                   .map(ench -> ench.ench.getName())
                   .collect(Collectors.toList());
       }
   }
}
Merci beaucoup cela me convient juste un petit détail qui m'aurais arrangé c'est que les enchantements corps a corps peuvent etre appliquer pas que sur les épées mais aussi les haches, faux, ect ..
 
Dernière édition:

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 139
162
464
247
21
Mìlhüsa
Merci beaucoup cela me convient juste un petit détail qui m'aurais arrangé c'est que les enchantements corps a corps peuvent etre appliquer pas que sur les épées mais aussi les haches, faux, ect ..
C'est fait, les enchantements de mêlées peuvent désormais être appliqués sur les outils.
J'ai modifié ma réponse, en remplaçant l'ancien lien vers le nouveau.