Advertisement
Guest User

Untitled

a guest
Jul 28th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.16 KB | None | 0 0
  1. /*
  2.  * To change this license header, choose License Headers in Project Properties.
  3.  * To change this template file, choose Tools | Templates
  4.  * and open the template in the editor.
  5.  */
  6. package me.jortpepe.core.player;
  7.  
  8. import com.mongodb.client.MongoDatabase;
  9. import me.jortpepe.core.SpleefCore;
  10. import me.jortpepe.core.events.GeneralPlayerLoadedEvent;
  11. import me.jortpepe.core.io.EntityBuilder;
  12. import me.jortpepe.core.plugin.CorePlugin;
  13. import me.jortpepe.core.utils.DatabaseConnection;
  14. import org.bson.Document;
  15. import org.bukkit.Bukkit;
  16. import org.bukkit.entity.Player;
  17. import org.bukkit.event.Event;
  18. import org.bukkit.event.EventHandler;
  19. import org.bukkit.event.EventPriority;
  20. import org.bukkit.event.Listener;
  21. import org.bukkit.event.player.PlayerJoinEvent;
  22. import org.bukkit.event.player.PlayerQuitEvent;
  23.  
  24. import java.util.ArrayList;
  25. import java.util.Collection;
  26. import java.util.List;
  27. import java.util.UUID;
  28. import java.util.concurrent.ConcurrentHashMap;
  29. import java.util.logging.Level;
  30. import java.util.logging.Logger;
  31.  
  32. /**
  33.  *
  34.  * @author Jonas
  35.  * @param <G>
  36.  */
  37. public class PlayerManager<G extends GeneralPlayer> implements Listener {
  38.  
  39.     private final ConcurrentHashMap<UUID, G> map;
  40.     private final MongoDatabase db;
  41.     private final Class<G> playerClass;
  42.  
  43.     public PlayerManager(CorePlugin plugin, Class<G> playerClass) {
  44.         this.map = new ConcurrentHashMap<>();
  45.         this.db = plugin.getPluginDB();
  46.         this.playerClass = playerClass;
  47.  
  48.         Bukkit.getScheduler().runTaskTimer(SpleefCore.getInstance(), () -> {
  49.             List<G> ghostPlayers = new ArrayList<>();
  50.             map.values().stream().filter((G g) -> Bukkit.getPlayer(g.getUniqueId()) == null).forEach(ghostPlayers::add);
  51.             if (ghostPlayers.isEmpty()) {
  52.                 return;
  53.             }
  54.             SpleefCore.getInstance().getLogger().severe("[!!] Ghost instances found!");
  55.             SpleefCore.getInstance().getLogger().severe("[!!] Names:");
  56.             ghostPlayers.forEach((G g) -> SpleefCore.getInstance().getLogger().severe("[!!] " + g.getName() + " (created at MS: " + g.getCreated() + ")."));
  57.             SpleefCore.getInstance().getLogger().severe("[!!] Removing them now.");
  58.             ghostPlayers.forEach((G g) -> {
  59.                 try {
  60.                     this.map.remove(g.getUniqueId());
  61.                 } catch (Exception e) {
  62.                     this.map.values().remove(g);
  63.                 }
  64.             });
  65.         }, 1200, 1200);
  66.  
  67.         Bukkit.getOnlinePlayers().stream().forEach((player) -> {
  68.             load(player);
  69.         });
  70.         Bukkit.getPluginManager().registerEvents(this, plugin);
  71.     }
  72.  
  73.     public Class<G> getPlayerClass() {
  74.         return playerClass;
  75.     }
  76.  
  77.     public G get(String username) {
  78.         Player p = Bukkit.getPlayer(username);
  79.         return p != null ? get(p) : null;
  80.     }
  81.  
  82.     public G get(Player player) {
  83.         return player != null ? get(player.getUniqueId()) : null;
  84.     }
  85.  
  86.     public G get(UUID uuid) {
  87.         return map.get(uuid);
  88.     }
  89.  
  90.     public Collection<G> getAll() {
  91.         return map.values();
  92.     }
  93.    
  94.     public G loadFake(Document query) {
  95.         return load(query);
  96.     }
  97.  
  98.     public G loadFake(String name) {
  99.         return load(new Document("username", name));
  100.     }
  101.  
  102.     public G loadFake(UUID uuid) {
  103.         return load(new Document("uuid", uuid.toString()));
  104.     }
  105.  
  106.     private G load(Document query) {
  107.         Document doc = db.getCollection("Players").find(query).first();
  108.         if (doc == null) {
  109.             return null;
  110.         } else {
  111.             return EntityBuilder.load(doc, getPlayerClass());
  112.         }
  113.     }
  114.  
  115.     private void load(final Player player) {
  116.         DatabaseConnection.find(db.getCollection("Players"), new Document("uuid", player.getUniqueId().toString()), (result) -> {
  117.             Document doc = result.first();
  118.             Bukkit.getScheduler().runTask(SpleefCore.getInstance(), () -> {
  119.                 try {
  120.                     G generalPlayer;
  121.                     if (doc == null) {
  122.                         generalPlayer = getPlayerClass().newInstance();
  123.                         generalPlayer.setName(player.getName());
  124.                         generalPlayer.setUUID(player.getUniqueId());
  125.                         generalPlayer.setDefaults();
  126.                         Bukkit.getScheduler().runTaskAsynchronously(SpleefCore.getInstance(), () -> {
  127.                             EntityBuilder.save(generalPlayer, db.getCollection("Players"));
  128.                         });
  129.                     } else {
  130.                         generalPlayer = EntityBuilder.load(doc, getPlayerClass());
  131.                         generalPlayer.setName(player.getName());
  132.                     }
  133.                     map.put(player.getUniqueId(), generalPlayer);
  134.                     callEvent(generalPlayer, doc == null);
  135.  
  136.                 } catch (InstantiationException | IllegalAccessException ex) {
  137.                     Logger.getLogger(PlayerManager.class.getName()).log(Level.SEVERE, null, ex);
  138.                 }
  139.             });
  140.         });
  141.     }
  142.  
  143.     public void saveAll() {
  144.         getAll().stream().forEach((gp) -> {
  145.             save(gp);
  146.         });
  147.     }
  148.  
  149.     public void save(G g) {
  150.         EntityBuilder.save(g, db.getCollection("Players"));
  151.     }
  152.  
  153.     @EventHandler
  154.     public void onJoin(final PlayerJoinEvent event) {
  155.         Bukkit.getScheduler().runTaskAsynchronously(SpleefCore.getInstance(), () -> load(event.getPlayer()));
  156.     }
  157.  
  158.     @EventHandler(priority = EventPriority.MONITOR) //Misleading, has to be called last
  159.     public void onQuit(PlayerQuitEvent event) {
  160.         final G gp = get(event.getPlayer());
  161.         try {
  162.             this.map.remove(event.getPlayer().getUniqueId());
  163.         } catch (Exception e) {
  164.             this.map.values().remove(gp);
  165.         }
  166.         Bukkit.getScheduler().runTaskAsynchronously(SpleefCore.getInstance(), () -> {
  167.             save(gp);
  168.         });
  169.     }
  170.  
  171.     private void callEvent(GeneralPlayer generalPlayer, boolean firstJoin) {
  172.         Event e = new GeneralPlayerLoadedEvent(generalPlayer, firstJoin);
  173.         Bukkit.getPluginManager().callEvent(e);
  174.     }
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement