HashMap, time player played [1.7.10]

Discussion in 'Plugin Development' started by maliimaloo, Mar 3, 2019.

Thread Status:
Not open for further replies.
  1. Offline

    maliimaloo

    Hi, sorry about my English, which isn’t very good.

    So my problem is that I have created a HashMap<Player, BukkitRunnable> but when the player connects thanks to the event (PlayerJoinEvent), it increments well +1 second each time but when a new player connects it will increment +2ect..., only when the second player who connects that diconnects comes back to +1.


    Code:
    package fr.ellisys.Level.commands;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryClickEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.event.player.PlayerQuitEvent;
    import org.bukkit.inventory.Inventory;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.scheduler.BukkitRunnable;
    
    import fr.ellisys.Main;
    import fr.ellisys.API.Fichier;
    import fr.ellisys.API.Items;
    import fr.ellisys.Level.message.Fonction_Message;
    import fr.ellisys.manager.StatisticsPlayer;
    
    public class Cmd_Statistics implements CommandExecutor, Listener
    {
        private Fonction_Message f_msg = new Fonction_Message();
        private Fichier fichier = new Fichier();
        private StatisticsPlayer sp = new StatisticsPlayer();
    
        int heures, minutes, secondes;
        private Inventory inv_stats;
    
        private Map<Player, BukkitRunnable> timer_player_task = new HashMap<Player, BukkitRunnable>();
    
        public Cmd_Statistics(Main main) { }
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
        {
            if(!(sender instanceof Player))
            {
                System.out.println(f_msg.consol_sender);
                return false;
            }
        
            Player player_sender = (Player) sender;
            if(cmd.getName().equalsIgnoreCase("stats"))
            {
                switch (args.length)
                {
                    case 0:
                        this.item_inventory(player_sender.getName());
                        player_sender.openInventory(inv_stats);
                        break;
                    
                    case 1:
                        String player_name = args[0];
    
                        fichier.setPath("Statistics");
                        fichier.setFile_name(player_name);
                    
                        if(fichier.File_Exists())
                        {
                            this.item_inventory(player_name);
                            player_sender.openInventory(inv_stats);
                        }
                        else
                        {
                            player_sender.sendMessage(f_msg.statistics_target_notFound);
                        }
                        break;
    
                    default:
                        player_sender.sendMessage(f_msg.statistics_error_cmd);
                        break;
                }
            }
            return false;
        }
    
        private void item_inventory(String player_name)
        {
            sp.getStatsPlayer(player_name);
        
            inv_stats = Bukkit.createInventory(null, 9, ChatColor.GOLD + "Statistique de " + player_name);
            ArrayList<String> description_player_head = new ArrayList<String>();
            description_player_head.add(ChatColor.RED + "Rank: " + ChatColor.GOLD + sp.getRank());
            description_player_head.add(ChatColor.RED + "Familia: " + ChatColor.GOLD + sp.getFamilia_name());
            description_player_head.add(ChatColor.RED + "Niveau: " + ChatColor.GOLD + sp.getNiveau());
            description_player_head.add(" ");
            description_player_head.add(ChatColor.RED + "Temps jouer: " + ChatColor.GOLD + sp.getTemp_jouer_heures() + "h " + sp.getTemp_jouer_minutes() + "m " + sp.getTemp_jouer_secondes() + "s");
            description_player_head.add(ChatColor.RED + "Inscription: " + ChatColor.GOLD + sp.getInscription());
            description_player_head.add(ChatColor.RED + "Connexion: " + sp.getConnecter());
        
        
            Items item_head = new Items(ChatColor.RED + "Joueur: " + ChatColor.GOLD + player_name, Material.SKULL_ITEM, 1, description_player_head);
            inv_stats.setItem(2, item_head.create_item());
        
        
            ArrayList<String> description_player_papper = new ArrayList<String>();
            description_player_papper.add(ChatColor.RED + "Experience total: " + ChatColor.GOLD + sp.getExp_total());
            description_player_papper.add(ChatColor.RED + "Nombre de monstre tuer: " + ChatColor.GOLD + sp.getNb_monstre_kill());
            description_player_papper.add(ChatColor.RED + "Nombre de joueur tuer: " + ChatColor.GOLD + sp.getNb_joueur_kill());
        
            Items item_papper = new Items(ChatColor.RED + "[Information]", Material.PAPER, 1, description_player_papper);
            inv_stats.setItem(4, item_papper.create_item());
        
            ArrayList<String> description_player_book = new ArrayList<String>();
            description_player_book.add(ChatColor.GOLD + "[Comming-soon]");
        
            Items item_book = new Items(ChatColor.RED + "[Familia]", Material.BOOK_AND_QUILL, 1, description_player_book);
            inv_stats.setItem(6, item_book.create_item());
        
            for(int a = 0; a < inv_stats.getSize(); a++)
            {
                if(inv_stats.getItem(a) == null)
                {
                    inv_stats.setItem(a, new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)11));
                }
            }
        }
    
    
        @EventHandler
        public void invetoryClick(InventoryClickEvent e)
        {
            if(e.getInventory().getTitle().startsWith(ChatColor.GOLD + "Statistique"))
                e.setCancelled(true);
        }
    
        @EventHandler
        public void playerConnect(PlayerJoinEvent e)
        {
            this.connecter_modified(e.getPlayer(), true);
    
            this.secondes = sp.getTemp_jouer_secondes();
            this.minutes = sp.getTemp_jouer_minutes();
            this.heures = sp.getTemp_jouer_heures();
        
            this.timer_player_task.put(e.getPlayer(), new BukkitRunnable()
            {
                @Override
                public void run()
                {
                    secondes++;
    
                    if(secondes == 60)
                    {
                        minutes++;
                        secondes = 0;
                        
                        sp.getStatsPlayer(e.getPlayer().getName());
                        sp.setTemp_jouer_heures(heures);
                        sp.setTemp_jouer_minutes(minutes);
                        sp.setTemp_jouer_secondes(secondes);
                        sp.setStatsPlayer(e.getPlayer());
                    
                        if(minutes == 60)
                        {
                            heures++;
                            minutes = 0;
                        }
                    }
                
                    e.getPlayer().sendMessage("Vous jouez: " + heures + "h " + minutes + "m " + secondes + "s.");
                }
            });
            timer_player_task.get(e.getPlayer()).runTaskTimer(Main.getPlugin(Main.class), 0, 20);
        }
    
        @EventHandler
        public void playerLeave(PlayerQuitEvent e)
        {
            this.connecter_modified(e.getPlayer(), false);
        
            timer_player_task.get(e.getPlayer()).cancel();
            timer_player_task.remove(e.getPlayer());
        
            sp.getStatsPlayer(e.getPlayer().getName());
            sp.setTemp_jouer_heures(this.heures);
            sp.setTemp_jouer_minutes(this.minutes);
            sp.setTemp_jouer_secondes(this.secondes);
            sp.setStatsPlayer(e.getPlayer());
        }
    
        private void connecter_modified(Player p, Boolean result)
        {
            fichier.setPath("Statistics");
            fichier.setFile_name(p.getName());
        
            if(fichier.File_Exists())
            {
                sp.getStatsPlayer(p.getName());
                sp.setConnecter_hors_ligne(result);
                sp.setStatsPlayer(p);
            }
        }
    }
    
    But what I want to do is create a new BukkitRunnable for each player that is their own in order to save their time spent in play individually.​
     
  2. Online

    timtower Administrator Administrator Moderator

    @maliimaloo Use a Map<UUID, BukkitRunnable> instead.
    And the reason that it is buggy is because you have 1 set of time indications, not per player.
     
  3. Offline

    maliimaloo

    Problem is, my waiter accepts crack, too.

    Would you have an example of code?

    It’s okay I understood thanks here I modified:

    Code:
            this.timer_player_task.put(e.getPlayer(), new BukkitRunnable()
            {
                int secondes = sp.getTemp_jouer_secondes();
                int minutes = sp.getTemp_jouer_minutes();
                int heures = sp.getTemp_jouer_heures();
               
                int timer_save;
               
                @Override
                public void run()
                {   
                    secondes++;
                    timer_save++;
    
                    if(secondes == 60)
                    {
                        minutes++;
                        secondes = 0;
    
                       
                        if(minutes == 60)
                        {
                            heures++;
                            minutes = 0;
                        }
                    }
                   
                   
                    if(timer_save == 5)
                    {
                        timer_save =0;
    
                        sp.getStatsPlayer(e.getPlayer().getName());
                        sp.setTemp_jouer_heures(heures);
                        sp.setTemp_jouer_minutes(minutes);
                        sp.setTemp_jouer_secondes(secondes);
                        sp.setStatsPlayer(e.getPlayer());
                    }
                   
                    e.getPlayer().sendMessage("Vous jouez: " + heures + "h " + minutes + "m " + secondes + "s. Le timer save = " + timer_save);
                }
            });
            timer_player_task.get(e.getPlayer()).runTaskTimer(Main.getPlugin(Main.class), 0, 20);
     
    Last edited: Mar 3, 2019
  4. Online

    timtower Administrator Administrator Moderator

    Locked
    Offline mode is not supported by Bukkit
     
Thread Status:
Not open for further replies.

Share This Page