Welcome to Bukkit France

Inscrivez-vous maintenant pour profiter d'un accès total à tout le contenu offert par la meilleur communauté Bukkit française ! Une fois inscrit et connecté, vous pourrez contribuez à la communauté en postant vos propres sujets et questions ou en répondant à ceux existants. Vous pourrez aussi customiser votre profil, recevoir des points de réputations, communiquer avec les autres membres via le chat, et plus encore! 

  • Annonces

    • Pskyco

      Bukkit France passe sous Discord !   02/20/16

      Bukkit France est désormais passé sur Discord, au revoir donc notre vieux Teamspeak ! Téléchargez le client et venez nous rejoindre sur notre salon en suivant les instructions suivantes.
      M-à-j du 25/02/2017 : Désormais, seuls les comptes actifs sur le forum se verront donner l'accès au Discord, ce dernier n'est pas une plateforme d'aide de la même manière que le chat.
SpK

Remplacer un item par un autre toutes les x secondes

3 messages dans ce sujet

Version (serveur) : 1.7.10
API utilisée : Vanilla
IDE utilisé : Eclipse
Explications du problème rencontré :
Recherches effectuées : google, doc
Code d'erreur : ;
Code :
Informations supplémentaires :

 

Salut,

 

je m'explique, je voudrai que quand un joueur entre dans une zone définie, un item dans son inventaire soit converti en un autre, et ça toute les x secondes.

Chaque joueurs a son temps.

Si un joueur est frappé, le temps revient à 15 secondes.

 

J'ai déjà la fonction qui me sert à savoir si la personne est dans la zone. ( avec onPlayerMoveEvent )

Il faut aussi que uniquement un items soit converti à la fois.

 

Exemple:

 

Pierre entre dans la zone de conversion, si dans son inventaire, il a au minimum un bloc de dirt, un message lui est envoyé pour lui annoncer que UN bloc de dirt ( même si il en a plusieurs ) sera converti dans 15secondes si il ne sort pas de la zone.

 

15 secondes plus tard, Pierre n'est pas sorti de la zone, donc un de ces blocs de dirt a été converti en grass. ( Le bloc de dirt a été retiré de son inventaire évidement. )

 

J'imagine une HashMap<Player, ?> et une task BukkitRunnable, mais je n'ai aucune idée de comment procédés.

 

 

Pour résumé, Pierre rentre dans la zone, si il a un bloc de dirt, 15 secondes plus tard il est converti en grass. Si un autre joueurs entre dans la zone après Pierre, il devra aussi attendre 15secondes.

Si pierre est frappé par un joueur, son temps se reset à 15 secondes.

L'opération se repete tant que Pierre est dans la zone et qu'il a de la dirt dans l'inventaire.

 

Deux items ne peuvent pas être converti en même temps.

 

La fonction qui permet de "tag" un joueur comme étant dans la zone:

@EventHandler
	public void move(PlayerMoveEvent e){
		Location npc = CitizensAPI.getNPCRegistry().getById(14).getStoredLocation();
		Location player =  e.getPlayer().getLocation();
		Player p = e.getPlayer();
		
		int nx = npc.getBlockX();
		int ny = npc.getBlockY();
		int nz = npc.getBlockZ();
		
		int x = player.getBlockX();
		int y = player.getBlockY();
		int z = player.getBlockZ();
		
		int nxminus = nx - 3;
		int nyminus = ny - 3;
		int nzminus = nz - 3;
	
		int nxplus = nx + 3;
		int nyplus = ny + 3;
		int nzplus = nz + 3;
		
		
		if(x < nxplus && x > nxminus && y == ny || z < nzplus && z > nzminus && y == ny){
			if(!(inArea.contains(e.getPlayer()))){
				inArea.add(e.getPlayer());
			}
		}
			
		else{
			if(inArea.contains(e.getPlayer())){
				inArea.remove(e.getPlayer());
			}
		}
			
	
		
	}

 

 

Pour replacer l'item

public static void replace(Player p){
		
		boolean hasItem = ....
		boolean area = inArea.contains(p);
		
		
		if(hasItem && area){
			
			//convert
			
		}
		
	}

 

 

Le reste, je vois pas trop comment procéder...

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est un peu long comme explication...

 

Mais si tu veux changer un item, tu peux faire ça :

(J'ai pas testé)

	private HashMap<Player, BukkitRunnable> run = new HashMap<>();

	public void changeItem(Player p) {
		if (run.containsKey(p))
			return;
		for (ItemStack stack : p.getInventory().getContents()) {
			if (stack.getType() != Material.GRASS) {
				if (p.getInventory().first(Material.AIR) != -1 && p.getInventory().first(Material.GRASS) == -1) {
					run.put(p, new BukkitRunnable() {
						
      					private int i = 0;
      
						@Override
						public void run() {
							if (/*le joueur n'est pas dans la zone*/) {
								cancel();
								run.remove(p);
							} else if (i == 15) {
   							   //tu ennlève un item et tu ajoute de l'herbe
      						} else {
								i++;
							}
						}
					}.runTaskTimer(plugin, 20, 20)); //20 = 1 sec (selon le serveur)
				} else {
					p.sendMessage("Erreur"); //ou tu avertis que tout le stack sera remplacé et tu modifi le code
				}
				break;
			}
		}
	}

Mais essaye de comprendre le code, et si ce n'est pas à quoi tu t'attendais, explique un peux plus clairement et plus court stp

Modifié par SeaMoon69

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut, en effet j'ai un peu expliqué ça n'importe comment.

 

 

Je voudrais que si un joueur entre dans une zone, toutes les 15 secondes un item de son inventaire soit converti en un autre. Si le joueur sort de la zone, la conversion est annulé.

 

Je voudrais aussi que si le joueur 2 entre après le joueurs 1, le joueur 2 doit quand même attendre 15 secondes et que ces items ne soit pas converti en même temps que le joueur 1.

 

Si tu veux savoir les items que je vais utiliser, la dirt sera convertie en grass.

 

Je suis pas sur que tu comprenne ce que je veux dire, donc demande en plus si tu le veux.

 

Le code que je pensais bon ne l'est pas, donc tout est à refaire..

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant

  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.