Advertisement
Guest User

Untitled

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