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.
CaadriFR

Message dans le chat

35 messages dans ce sujet

Bonjour, Bonsoir,

J'ai besoin d'aide pour terminer un plugin, 

Voilà un exemple de ce que j'aimerais aboutir :

 

Si le joueur dis dans le chat <Tel message>

 

(Ensuite je fais gagner le lot à la personne)

En gros j'aimerais faire une condition, que le joueurs dis dans le chat sans faire une commande, bien entendue !

Voilà si vous pouviez m'aider sa serais très gentil, cordialement.

Bonne soirée / Journée.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir, Tu checks tout simplement si la phrase du joueur contiens ce "mot" et tu éxécute ton action ;) .

 

Voila L'event à utiliser:

@EventHandler
	public void onChat(AsyncPlayerChatEvent e){
		Player p = e.getPlayer(); //Tu récupères le joueur
		String msg = e.getMessage(); //Tu récupères le message dans le chat du joueur
  
		if(msg.contains("surprise")){ //Si la phrase du joueur contiens le mot 'surprise' alors...
			
			e.setCancelled(true); //Tu effaces sont message si besoin...
			p.sendMessage("§6Surprise tu as gagner le lot !"); //Et tu remplace sa phrase par ceci.
			
		}
	}

Voila en éspérant t'avoir aidé :) !

2 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci de l'aide, 

Mais comment faire pour que sa ne soit que quand un joueur rejoint le serveur pour la première fois ?

Voici mon code pour le moment :

   @EventHandler
   public void onFirstJoin(final PlayerJoinEvent e) {
   	
   	if(!e.getPlayer().hasPlayedBefore()) {

   		
   	}

   	}
   	
   @EventHandler
	public void onChat(AsyncPlayerChatEvent e){
		Player p = e.getPlayer(); 
		String msg = e.getMessage(); 
 
		if(msg.contains("Bienvenue")){ 
			
			
			
			
		}
	}
   
}

Et j'aimerais que quand le joueur rejoint pour la première fois le serveur, si un joueurs marque bienvenue dans le chat ont effectue une action, Cordialement

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

Hin d'accord alors si je comprend bien tu veux que quand il ya un nouvelle arrivant le joueur qui le souhaite la bienvenue gagne quelque chose ?

Modifié par Qeed

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 2 minutes, Qeed a dit :

Alors si je comprend bien tu veux récup* la phrase de bienvenue quand le joueur se connecte pour la premiere fois et lui donner quelque chose ?

 

Non,

Je voudrais que quand un joueur se connecte pour la première fois sur le serveur, si un joueur connecté sur le serveur dis Bienvenue dans un petit delai, alors il peut recevoir une récompense ou autre.

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 2 minutes, CaadriFR a dit :

 

Non,

Je voudrais que quand un joueur se connecte pour la première fois sur le serveur, si un joueur connecté sur le serveur dis Bienvenue dans un petit delai, alors il peut recevoir une récompense ou autre.

Oui je viens d'edit mon message ;).

 

Bon je ne pense pas que sa soit optimiser mdr mais la seul chose qui me viens à l'esprit de suite..

 

C'est de faire un timer de Quelque secondes à chaque nouvelle arrivant sur le serveur et que si le joeur dans ce temp impartie lui dit la bienvenue et bien sa execute une action :P 

1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 4 minutes, Qeed a dit :

Oui je viens d'edit mon message ;).

 

Bon je ne pense pas que sa soit optimiser mdr mais la seul chose qui me viens à l'esprit de suite..

 

C'est de faire un timer de Quelque secondes à chaque nouvelle arrivant sur le serveur et que si le joeur dans ce temp impartie lui dit la bienvenue et bien sa execute une action :P 

J'ai tout les éléments, mais je ne sait pas comment les mettre avec tout ses EventHandler; mdrr

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 15 minutes, CaadriFR a dit :

J'ai tout les éléments, mais je ne sait pas comment les mettre avec tout ses EventHandler; mdrr

Euh bon  je tes fait un truc à l'arrache je ne suis pas cher moi je suis sur téléphone mdr je pourrait réelement t'aider à partir de Lundi

 

@EventHandler
	public void onJoin(PlayerJoinEvent e){
		Player p = e.getPlayer();
		final String msg = e.toString();

		if(p.hasPlayedBefore()){
			
			Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable(){

				public void run(){
					
					if(msg.contains("bienvenue")){
						
						//ton action
						
					}
					
				}
			}, 100L);

Mais bon je ne pense vraiment pas que sa sois correct

1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 4 minutes, Qeed a dit :

Euh bon  je tes fait un truc à l'arrache je ne suis pas cher moi je suis sur téléphone mdr je pourrait réelement t'aider à partir de Lundi

 


@EventHandler
	public void onJoin(PlayerJoinEvent e){
		Player p = e.getPlayer();
		final String msg = e.toString();

		if(p.hasPlayedBefore()){
			
			Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable(){

				public void run(){
					
					if(msg.contains("bienvenue")){
						
						//ton action
						
					}
					
				}
			}, 100L);

Mais bon je ne pense vraiment pas que sa sois correct

Merci beaucoup beaucoup :P

Si j'ai un problème je te demande lundi !

Bonne soirée

 

1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a une heure, Qeed a dit :

Euh bon  je tes fait un truc à l'arrache je ne suis pas cher moi je suis sur téléphone mdr je pourrait réelement t'aider à partir de Lundi

 


@EventHandler
	public void onJoin(PlayerJoinEvent e){
		Player p = e.getPlayer();
		final String msg = e.toString();

		if(p.hasPlayedBefore()){
			
			Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable(){

				public void run(){
					
					if(msg.contains("bienvenue")){
						
						//ton action
						
					}
					
				}
			}, 100L);

Mais bon je ne pense vraiment pas que sa sois correct

Oula xD ! Réfléchis un peu ! Tout ce que fait ton code c'est tester après 100 ticks si le message contient bienvenue !

 

Il y a 1 heure, CaadriFR a dit :

 

Non,

Je voudrais que quand un joueur se connecte pour la première fois sur le serveur, si un joueur connecté sur le serveur dis Bienvenue dans un petit delai, alors il peut recevoir une récompense ou autre.

Puisque tu n'as pas l'air d'être très à l'aise avec le java je te conseille d'aller lire quelques cours avant de te lancer ! (tu peux aller ici : https://openclassrooms.com/courses/apprenez-a-programmer-en-java)

 

Sinon à ta place je ne me casserais pas la tête, une HashMap<UUID, Long> contenant en clé les joueurs ayant accès à l'évenement et en valeur le temps en millisecondes après lequel l'event n'est plus valable. Lorsqu'un joueur se co pour la premiere fois tu l'ajoute à la map (  map.put(player.getUniqueId(), System.currentTimeMillis() + 60_000)  ) avec comme clé le temps actuel + 60000 (pour 60 secondes). Quand un joueur parle, si il est dans la liste && si System.currentTimeMillis() < map.get(player.getUniqueId()) --> tu peux faire l'event.

 

N'hésite pas à demander plus d'explications si tu ne comprends pas :)

4 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 39 minutes, Wisteca a dit :

Oula xD ! Réfléchis un peu ! Tout ce que fait ton code c'est tester après 100 ticks si le message contient bienvenue !

 

Puisque tu n'as pas l'air d'être très à l'aise avec le java je te conseille d'aller lire quelques cours avant de te lancer ! (tu peux aller ici : https://openclassrooms.com/courses/apprenez-a-programmer-en-java)

 

Sinon à ta place je ne me casserais pas la tête, une HashMap<UUID, Long> contenant en clé les joueurs ayant accès à l'évenement et en valeur le temps en millisecondes après lequel l'event n'est plus valable. Lorsqu'un joueur se co pour la premiere fois tu l'ajoute à la map (  map.put(player.getUniqueId(), System.currentTimeMillis() + 60_000)  ) avec comme clé le temps actuel + 60000 (pour 60 secondes). Quand un joueur parle, si il est dans la liste && si System.currentTimeMillis() < map.get(player.getUniqueId()) --> tu peux faire l'event.

 

N'hésite pas à demander plus d'explications si tu ne comprends pas :)

J'ai bien précisé comme quoi je n'etait pas cher moi et que je lui avait fait un truc à l'arrache pas complet xD

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 11 heures, Wisteca a dit :

Oula xD ! Réfléchis un peu ! Tout ce que fait ton code c'est tester après 100 ticks si le message contient bienvenue !

 

Puisque tu n'as pas l'air d'être très à l'aise avec le java je te conseille d'aller lire quelques cours avant de te lancer ! (tu peux aller ici : https://openclassrooms.com/courses/apprenez-a-programmer-en-java)

 

Sinon à ta place je ne me casserais pas la tête, une HashMap<UUID, Long> contenant en clé les joueurs ayant accès à l'évenement et en valeur le temps en millisecondes après lequel l'event n'est plus valable. Lorsqu'un joueur se co pour la premiere fois tu l'ajoute à la map (  map.put(player.getUniqueId(), System.currentTimeMillis() + 60_000)  ) avec comme clé le temps actuel + 60000 (pour 60 secondes). Quand un joueur parle, si il est dans la liste && si System.currentTimeMillis() < map.get(player.getUniqueId()) --> tu peux faire l'event.

 

N'hésite pas à demander plus d'explications si tu ne comprends pas :)

Merci de ta réponse, je vais approfondir mes connaissances en Java :) 

Je demande juste de l'aide pour se plugin, car j'ai besoin d'avoir ceci très rapidement? 

Et à vrai dire je n'ai pas vraiment compris...

Il y a 11 heures, Qeed a dit :

J'ai bien précisé comme quoi je n'etait pas cher moi et que je lui avait fait un truc à l'arrache pas complet xD

Merci quand même ^^'

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

Si le joueur joue pour la première fois sur ton serveur et que tu veux que lui donner une surprise dès lors qu'il dit un mot en ignorant la case (en un seul événement, pas besoin de plus) :

Spoiler

 


private static final String WORD = "Surprise";

@EventHandler(priority = EventPriority.LOWEST)
public final void onAsyncPlayerChat(final AsyncPlayerChatEvent event) {
	if(event.isCancelled() || event.getPlayer().hasPlayedBefore()) { // Si l'événement est annulé (eh oui, il faut y penser !) ou si le joueur a déjà joué, on s'en va.
		return;
	}
	if(event.getMessage().toLowerCase().contains(WORD.toLowerCase()) { // Si le message contient ton mot en ignorant la case, alors on annule l'événement et on appelle la fonction surprise(...).
		event.setCancelled(true);
		surprise(event.getPlayer());
	}
}

/**
* Appelé pour donner une surprise.
*/
public final void surprise(final Player player) {
	player.sendMessage(ChatColor.GOLD + "Voici ta surprise !");
	player.getWorld().dropItem(player.getLocation(), new ItemStack(Material.CAKE));
}

 

 

Et @Qeed, c'est bien sympa de vouloir aider les autres mais là tu le mets plus sur une fausse piste qu'autre chose. Je ne vois pas par quelle magie appeler toString() sur un PlayerJoinEvent renverrai le message du joueur.

Et admettons que ça marche, ce que ton code fait, c'est de tester si le "message" que tu obtiens quand le joueur se connecte contient le mot surprise mais seulement 5 secondes après...

 

Modifié par Skyost
4 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Ce n'est toujours pas ce qu'il demande, il veut que quand un nouveau joueur se connecte, pendant un certain temps si un joueur connecté (autre que le nouveau) envoi un certain message ("bienvenue" par exemple), une récompense lui est donnée.

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 20 minutes, Forsties08 a dit :

Ce n'est toujours pas ce qu'il demande, il veut que quand un nouveau joueur se connecte, pendant un certain temps si un joueur connecté (autre que le nouveau) envoi un certain message ("bienvenue" par exemple), une récompense lui est donnée.

Oui donc il faut adapter le code de Skyost et rajouter mon système d'HashMap.

1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

Il y a 6 heures, Forsties08 a dit :

Ce n'est toujours pas ce qu'il demande, il veut que quand un nouveau joueur se connecte, pendant un certain temps si un joueur connecté (autre que le nouveau) envoi un certain message ("bienvenue" par exemple), une récompense lui est donnée.

Ah d'accord, j'avais mal compris. Alors oui dans ce cas là, la solution de @Wisteca est bonne, j'en propose ici une alternative :

 

Spoiler

private static final String WORD = "Bienvenue";
private static final int DELAY = 10;

private boolean givePresents = false;
private final Set<UUID> hasPresent = new HashSet<UUID>();

@EventHandler
public final void onPlayerJoin(final PlayerJoinEvent event) {
	final Player player = event.getPlayer();
	if(!player.hasPlayedBefore()) { // Si le joueur n'a jamais joué...
		givePresents = true; // Permet d'indiquer que l'on va donner des cadeaux :D
		Bukkit.broadcastMessage(ChatColor.GOLD + "Veuillez souhaiter la bienvenue à " + player.getName() + " pour avoir une surprise :)");
		new BukkitRunnable() {
			
			@Override
			public final void run() {
				givePresents = false; // On arrête les dons de cadeaux.
				hasPresent.clear(); // Et on accepte à nouveau les joueurs qui ont reçu leur cadeau.
			}
			
		}.runTaskLaterAsynchronously(Bukkit.getPlugin("ton_plugin"), DELAY * 20L); // On programme une tâche permettant l'arrêt des dons de cadeaux.
	}
}

@EventHandler(priority = EventPriority.LOWEST)
public final void onAsyncPlayerChat(final AsyncPlayerChatEvent event) {
	if(event.isCancelled() || !givePresents) { // Si c'est annulé ou qu'on ne donne plus de cadeau, on s'en va.
		return;
	}
	if(event.getMessage().toLowerCase().contains(WORD.toLowerCase()) { // Si le message contient le "bienvenue" sans tenir compte de la case.
		event.setCancelled(true);
		final Player player = event.getPlayer();
		if(hasPresent.contains(player.getUniqueId())) { // Tu peux enlever ce bloc si tu souhaite désactiver le message.
			player.sendMessage(ChatColor.RED + "Vous avez déjà eu un cadeau, n'en demandez pas trop !");
			return;
		}
		surprise(player);
		hasPresent.add(player.getUniqueId()); // On n'oublie pas d'indiquer que le joueur a déjà reçu un cadeau.
	}
}

/**
* Appelé pour donner une surprise.
*/
public final void surprise(final Player player) {
	player.sendMessage(ChatColor.GOLD + "Voici ta surprise !");
	player.getWorld().dropItem(player.getLocation(), new ItemStack(Material.CAKE));
}

 

 

Alors cette solution est perfectible, notamment si deux nouveaux joueurs se connectent, l'un plus tard que l'autre. Il faudrait garder une instance de la tâche créée dans le PlayerJoinEvent. Ensuite, si elle existe tu l'annules (avec cancel(), puis tu lui mets sa variable à null) et tu programmes la nouvelle ce qui permettra à nouveau d'activer l'envoi de bienvenues :)

 

EDIT : Bon comme je suis assez déter, voilà où je voulais en venir :

Spoiler

private static final String WORD = "Bienvenue";
private static final int DELAY = 10;

private final Set<UUID> hasPresent = new HashSet<UUID>();
private BukkitTask currentTask;

@EventHandler
public final void onPlayerJoin(final PlayerJoinEvent event) {
	final Player player = event.getPlayer();
	if(!player.hasPlayedBefore()) { // Si le joueur n'a jamais joué...
		if(currentTask != null) { // On vérifie si une tâche est programmée, si oui on l'annule.
			hasPresent.clear();
			currentTask.cancel();
		}
		Bukkit.broadcastMessage(ChatColor.GOLD + "Veuillez souhaiter la bienvenue à " + player.getName() + " pour avoir une surprise :)");
		currentTask = new BukkitRunnable() { // On créé une nouvelle tâche ce qui permettra d'accepter le don de cadeaux.
			
			@Override
			public final void run() {
				currentTask = null; // On arrête les dons de cadeaux.
				hasPresent.clear(); // Et on accepte à nouveau les joueurs qui ont reçu leur cadeau.
			}
			
		}.runTaskLaterAsynchronously(Bukkit.getPlugin("ton_plugin"), DELAY * 20L); // On programme cette tâche pour qu'elle permette l'arrêt des dons de cadeaux.
	}
}

@EventHandler(priority = EventPriority.LOWEST)
public final void onAsyncPlayerChat(final AsyncPlayerChatEvent event) {
	if(event.isCancelled() || currentTask == null) { // Si c'est annulé ou qu'on ne donne plus de cadeau, on s'en va.
		return;
	}
	if(event.getMessage().toLowerCase().contains(WORD.toLowerCase()) { // Si le message contient le "bienvenue" sans tenir compte de la case.
		event.setCancelled(true);
		final Player player = event.getPlayer();
		if(hasPresent.contains(player.getUniqueId())) { // Tu peux enlever ce bloc si tu souhaite désactiver le message.
			player.sendMessage(ChatColor.RED + "Vous avez déjà eu un cadeau, n'en demandez pas trop !");
			return;
		}
		surprise(player);
		hasPresent.add(player.getUniqueId()); // On n'oublie pas d'indiquer que le joueur a déjà reçu un cadeau.
	}
}

/**
* Appelé pour donner une surprise.
*/
public final void surprise(final Player player) {
	player.sendMessage(ChatColor.GOLD + "Voici ta surprise !");
	player.getWorld().dropItem(player.getLocation(), new ItemStack(Material.CAKE));
}

 

 

 

Modifié par Skyost

Partager ce message


Lien à poster
Partager sur d’autres sites

Pas besoin d'utiliser de task.. Lorsque le joueur se connecte, tu set son field "firstJoin" en System.currentTimeMillis() (perso, j'ai une classe CustomPlayer pour chacun de mes joueurs mais tu peux aussi utiliser une Map<UUID, Long> firstJoins). Ensuite, tu vérifie si le long n'est pas null puis tu fais "long duration = System.currentTimeMillis() - start" d'après la règle "duration = end - start". Et pour finir, tu fais la conversion milliseconde en seconde et ton check de message.

1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

il y a 21 minutes, Zurbeyira a dit :

Pas besoin d'utiliser de task.. Lorsque le joueur se connecte, tu set son field "firstJoin" en System.currentTimeMillis() (perso, j'ai une classe CustomPlayer pour chacun de mes joueurs mais tu peux aussi utiliser une Map<UUID, Long> firstJoins). Ensuite, tu vérifie si le long n'est pas null puis tu fais "long duration = System.currentTimeMillis() - start" d'après la règle "duration = end - start". Et pour finir, tu fais la conversion milliseconde en seconde et ton check de message.

Moui, tu peux aussi parler en français complet et pas mi-anglais mi-français ;)

Mais comme je l'ai dit, c'est une alternative à ce que proposait @Wisteca qui a la même solution que toi.

 

Modifié par Skyost
Mon ébauche d'amélioration était fausse :(
1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

Il y a 4 heures, Skyost a dit :

Moui, tu peux aussi parler en français complet et pas mi-anglais mi-français ;)

Mais comme je l'ai dit, c'est une alternative à ce que proposait @Wisteca qui a la même solution que toi.

 

 

J'ai pas trop compris l'utilité de ta première phrase, enfin, en informatique l'anglais est primordial. ;)

Ma solution est la meilleur, enfin créer des BukkitTask à chaque fois qu'on a besoin de faire une comparaison entre 2 date, tu verra vite que c'est pas la meilleure solution. xD

 

ÉDIT: Je n'avais pas vu la méthode de @Wisteca qui est très bonne (similaire à la mienne).

Modifié par Zurbeyira
1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

il y a 10 minutes, Zurbeyira a dit :

 

J'ai pas trop compris l'utilité de ta première phrase, enfin, en informatique l'anglais est primordial. ;)

Ma solution est la meilleur, enfin créer des BukkitTask à chaque fois qu'on a besoin de faire une comparaison entre 2 date, tu verra vite que c'est pas la meilleure solution. xD

L'anglais est primordial mais pas besoin de mélanger les deux.

 

Pour ne pas trop divaguer, oui ça dépend essentiellement de ton usage. Pour les gros serveurs par exemple, ma solution est la plus adaptée car elle permet d'effacer le contenu de la liste une fois celle-ci utilisée. Pour les plus petits, la tienne peut être plus adaptée car elle évite la création d'un objet BukkitTask à chaque login (et encore, si tu veux économiser quelques millisecondes... cela ressemble au débat du String.valueOf(entier) vs "" + entier : la première solution n'est pas forcément la plus rapide).

Mais au final ça se vaut, ça reste de la micro-optimisation, et la micro-optimisation n'est pas forcément bonne ;)

 

Modifié par Skyost
2 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

il y a une heure, Skyost a dit :

L'anglais est primordial mais pas besoin de mélanger les deux.

 

Pour ne pas trop divaguer, oui ça dépend essentiellement de ton usage. Pour les gros serveurs par exemple, ma solution est la plus adaptée car elle permet d'effacer le contenu de la liste une fois celle-ci utilisée. Pour les plus petits, la tienne peut être plus adaptée car elle évite la création d'un objet BukkitTask à chaque login (et encore, si tu veux économiser quelques millisecondes... cela ressemble au débat du String.valueOf(entier) vs "" + entier : la première solution n'est pas forcément la plus rapide).

Mais au final ça se vaut, ça reste de la micro-optimisation, et la micro-optimisation n'est pas forcément bonne ;)

 

 

Mais ce que tu dis est totalement faux lol. Je pense qu'il te manque quelque notions en Java. Enfin, je sais pas, c'est totalement logique mieux vaut utiliser un Long (Integer) que d'appeler un BukkitTask qui va aussi faire appel à de multiple méthodes. Enfin, un Long, c'est juste une série de chiffres, tu sais.

Modifié par Zurbeyira

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié)

Il y a 10 heures, Skyost a dit :
Il y a 10 heures, Skyost a dit :

L'anglais est primordial mais pas besoin de mélanger les deux.

 

Pour ne pas trop divaguer, oui ça dépend essentiellement de ton usage. Pour les gros serveurs par exemple, ma solution est la plus adaptée car elle permet d'effacer le contenu de la liste une fois celle-ci utilisée. Pour les plus petits, la tienne peut être plus adaptée car elle évite la création d'un objet BukkitTask à chaque login (et encore, si tu veux économiser quelques millisecondes... cela ressemble au débat du String.valueOf(entier) vs "" + entier : la première solution n'est pas forcément la plus rapide).

Mais au final ça se vaut, ça reste de la micro-optimisation, et la micro-optimisation n'est pas forcément bonne ;)

 

L'anglais est primordial mais pas besoin de mélanger les deux.

 

Pour ne pas trop divaguer, oui ça dépend essentiellement de ton usage. Pour les gros serveurs par exemple, ma solution est la plus adaptée car elle permet d'effacer le contenu de la liste une fois celle-ci utilisée. Pour les plus petits, la tienne peut être plus adaptée car elle évite la création d'un objet BukkitTask à chaque login (et encore, si tu veux économiser quelques millisecondes... cela ressemble au débat du String.valueOf(entier) vs "" + entier : la première solution n'est pas forcément la plus rapide).

Mais au final ça se vaut, ça reste de la micro-optimisation, et la micro-optimisation n'est pas forcément bonne ;)

 

Il ne sagit pas de micro-optimisation mais bel et bien d'optimisation normale :)

J'ai brièvement survolé ton code et je ne suis pas totalement sûr si il convient bien, à la base, est-qu'il ne faudrait pas donner un cadeau aux joueurs qui disent "bienvenue nomDeLaPersonne" ? Si c'est le cas ton code ne fonctionnera pas, sinon ça irait effectivement.

 

Mais dans tout les cas ça ne sert à rien d'utiliser des task (qui ont quand même un petit impact sur les performances puisqu'il s'agit quand même d'une tâche, et si je dis pas de bêtise d'un nouveau thread en asynchrone), alors que sauvegarder un temps sous forme de long dans une HashMap ne coûte rien si ce n'est quelques octets de mémoire ram et me paraît même plus simple, personnelement.

Modifié par Wisteca
3 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 01/07/2017 à 17:43, Skyost a dit :

Si le joueur joue pour la première fois sur ton serveur et que tu veux que lui donner une surprise dès lors qu'il dit un mot en ignorant la case (en un seul événement, pas besoin de plus) :

Contenu masqué

 

Et @Qeed, c'est bien sympa de vouloir aider les autres mais là tu le mets plus sur une fausse piste qu'autre chose. Je ne vois pas par quelle magie appeler toString() sur un PlayerJoinEvent renverrai le message du joueur.

Et admettons que ça marche, ce que ton code fait, c'est de tester si le "message" que tu obtiens quand le joueur se connecte contient le mot surprise mais seulement 5 secondes après...

 

Ouep sorry mais vu que je n'etait pas cher moi je lui est vraiment donné un truc vite fait même si j'ai bien préciser que sa allait pas marcher :)

1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 02/07/2017 à 03:55, Zurbeyira a dit :

Je pense qu'il te manque quelque notions en Java.

Oui bien-sûr ça doit être ça.

Le 02/07/2017 à 13:23, Wisteca a dit :

[...]

Ce qu'il voulait était juste un message contenant un certain mot je crois non ? Sinon j'ai encore mal lu mais je crois que c'est bien ce qu'il souhaitait.

 

Sinon, dans ce cas si tu veux économiser quelques octets de mémoire ou juste rendre le code plus lisible ça reste de la micro-optimisation. Mais effectivement, je n'ai jamais dit que mon alternative était la meilleure, au contraire, et c'est bien pour cela que c'est une alternative. J'admet totalement que l'utilisation d'une Map peut être moins coûteux et même plus simple.

Je souhaitais simplement lui proposer une autre manière de réaliser ce qu'il souhaitait et ça permet toujours de voir de nouvelles choses et de nouveaux concepts ;)

 

Je fais des études en maths, et il arrive très souvent qu'on nous montre plusieurs manières de procéder, avec parfois certaines méthodes plus simples que d'autres, c'est la même chose ici.

3 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

La méthode de @Wisteca est clairement la meilleur car:

- Elle permet de gérer plusieurs nouveaux joueurs en même temps.

- Elle est beaucoup plus optimisé car:

  - Déclarer une nouvelle tâche qui s’exécutera en parallèle pour ça est vraiment inutile.

  - Et en plus si tu veux gérer plusieurs nouveaux joueurs en même temps tu dois créer plusieurs tâches en parallèle et pour le coup sur des gros serveurs où il y a beaucoup de connectés ça peut devenir du grand n’importe quoi pour au final     une toute petite fonctionnalité.

Il y a 3 heures, Skyost a dit :

Je souhaitais simplement lui proposer une autre manière de réaliser ce qu'il souhaitait

Oui mais dans ce cas précis c'est clairement pas une bonne manière de faire car ça va plutôt l’inciter à déclarer de nouvelles tâches sans arrêt ce qui est quand même très dangereux quand on ne maitrise pas (tâches infinis qui remplissent la mémoire...).

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.