Développeur Besoin d'aide de la part d'un Développeur java (Eclipse)

SayMown_

Massacreur de Mouton
2 Février 2020
17
1
20
21
Bonsoir à tous,
Cela fait maintenant 1 mois que je commence à faire du java sur Minecraft et actuellement, je me suis imposé une mission concernant les entités (Un EnderCrystal dans celui-ci) sauf que je ne sais ABSOLUMENT PAS comment m'y prendre avec les entités (j'ai beau cherché des solutions sur internet, rien n'y fait)

Comme Précisions :

-> J'aimerais Rajouter tout d'abord de la vie à celui-ci (Lui même possédant ordinairement 1/2 PV, je souhaiterais faire une commande java pour lui en rajouter et donc ainsi pouvoir le taper à plusieurs reprises avant qu'il meurt)
-> Ajouter 2 Formes d'Indications de Vie une fois celui-ci apparut :
Soit En lui Admettant une sorte de Name-tag au dessus de lui affichant ainsi sa vie ("2000/2000") par exemple et que celui-ci soit en Interaction avec le nombre de coups qu'on met au Crystal (1992/2000) puis (1982/2000) par exemple.
Soit En lui Admettant un BossBar montrant donc sa vie, et ainsi voir diminuer celui-ci en fonction du nombre de coups infligés par le joueur sur le Crystal.
-> Concernant les Animations diverses, particules, ... je pourrais voir de mon coté ce que je pourrais faire.

Merci de m'avoir lu
A la prochaine, je l'espère ! :D
 

ShE3py

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

Tu ne peux pas changer à proprement dire la vie des cristaux, parce que dans le code source ceux-ci explosent dès qu'ils subissent des dégâts, qu'importe la quantité.
Ce que tu dois faire, c'est suivre toi-même la vie des cristaux en annulant l'évènement EntityDamageEvent si celui-ci doit survivre.

Quant à afficher les points de vie, je ne sais pas si les cristaux peuvent avoir des nametags du fait qu'ils ne sont pas vivants, je te laisse regarder pour créer une barre de boss.
Sinon, tu peux toujours passer par une entité invisible immobile, mais c'est pas très propre.

Java:
public class EntityDamageHandler implements Listener {
	// associe à chaque cristal un nombre entier représentant ses PV
	private static final Map<EnderCrystal, Integer> CRYSTALS = new WeakHashMap<>(); // Weak- pour autoriser Java à supprimer les entités mortes
	
	@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
	public void onEntityDamage(EntityDamageEvent e) {
		Entity injured = e.getEntity();
		
		if(!(injured instanceof EnderCrystal))
			return; // on ignore les autres entités
		
		EnderCrystal crystal = (EnderCrystal) injured;
//		crystal.setBeamTarget(piouPiou);
		
		// si le cristal n'est pas dans la map,
		if(!CRYSTALS.containsKey(crystal)) {
			CRYSTALS.put(crystal, 2000); // on l'ajoute sans distinction avec 2000 PV
			crystal.setCustomNameVisible(true); // on configure notre entité
		}
		
		int health = CRYSTALS.get(crystal); // on récupère la vie du cristal
		health -= Math.round(e.getDamage());
		
		if(health > 0) {
			// on annule l'évènement, empêchant ainsi le cristal
			// d'exploser
			e.setCancelled(true);
			
			// on change les PV du cristal
			crystal.setCustomName("PV: " + health + " / 2000");
		}
		else {
			// l'évènement n'est pas annulé,
			// le cristal explose
			CRYSTALS.remove(crystal); // on enlève notre entité qui va (probablement) mourrir
			
			// ajouter des effets/messages ?
		}
	}
	
	
	/*
		J'ai un doute de si on peut @EventHandler un évènement générique,
		donc dans le doute je délègue
	 */
	
	@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
	public void onEntityDamageByEntity(EntityDamageByEntityEvent e) {
		onEntityDamage(e);
	}
	
	@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
	public void onEntityDamageByBlock(EntityDamageByBlockEvent e) {
		onEntityDamage(e);
	}
}

Bon après le code est un peu beaucoup moche, à toi de le refaire proprement. Je ne voulais pas partir sur un truc inutilement compliqué.

Cordialement,
ShE3py.