Advertisement
Guest User

MAC

a guest
Dec 7th, 2016
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.34 KB | None | 0 0
  1. package mineplex.core.antihack;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.HashSet;
  6. import java.util.Iterator;
  7. import java.util.Map.Entry;
  8.  
  9. import org.bukkit.Bukkit;
  10. import org.bukkit.ChatColor;
  11. import org.bukkit.GameMode;
  12. import org.bukkit.Material;
  13. import org.bukkit.Sound;
  14. import org.bukkit.entity.Player;
  15. import org.bukkit.event.EventHandler;
  16. import org.bukkit.event.player.PlayerMoveEvent;
  17. import org.bukkit.event.player.PlayerQuitEvent;
  18. import org.bukkit.event.player.PlayerTeleportEvent;
  19. import org.bukkit.event.player.PlayerVelocityEvent;
  20. import org.bukkit.event.server.ServerListPingEvent;
  21. import org.bukkit.plugin.java.JavaPlugin;
  22.  
  23. import mineplex.core.MiniPlugin;
  24. import mineplex.core.account.CoreClientManager;
  25. import mineplex.core.antihack.types.Fly;
  26. import mineplex.core.antihack.types.Idle;
  27. import mineplex.core.antihack.types.Reach;
  28. import mineplex.core.antihack.types.Speed;
  29. import mineplex.core.common.Rank;
  30. import mineplex.core.common.util.C;
  31. import mineplex.core.common.util.F;
  32. import mineplex.core.common.util.UtilEnt;
  33. import mineplex.core.common.util.UtilMath;
  34. import mineplex.core.common.util.UtilPlayer;
  35. import mineplex.core.common.util.UtilServer;
  36. import mineplex.core.common.util.UtilTime;
  37. import mineplex.core.portal.Portal;
  38. import mineplex.core.preferences.PreferencesManager;
  39. import mineplex.core.punish.Punish;
  40. import mineplex.core.updater.UpdateType;
  41. import mineplex.core.updater.event.UpdateEvent;
  42.  
  43. public class AntiHack extends MiniPlugin
  44. {
  45.     public static AntiHack Instance;
  46.  
  47.     private boolean _enabled = true;
  48.     private boolean _strict = false;
  49.     private boolean _kick = true;
  50.  
  51.     public Punish Punish;
  52.     public Portal Portal;
  53.     private PreferencesManager _preferences;
  54.     private CoreClientManager _clientManager;
  55.  
  56.     //Record Offenses
  57.     private HashMap<Player, HashMap<String, ArrayList<Long>>> _offense = new HashMap<Player, HashMap<String, ArrayList<Long>>>();
  58.  
  59.     //Ignore Player
  60.     private HashMap<Player, Long> _ignore = new HashMap<Player, Long>();
  61.  
  62.     //Player Info
  63.     private HashSet<Player> _velocityEvent = new HashSet<Player>();
  64.     private HashMap<Player, Long> _lastMoveEvent = new HashMap<Player, Long>();
  65.    
  66.     private HashSet<Player> _hubAttempted = new HashSet<Player>();
  67.  
  68.     //Hack Requirements
  69.     public int FloatHackTicks = 10;
  70.     public int HoverHackTicks = 4;
  71.     public int RiseHackTicks = 6;
  72.     public int SpeedHackTicks = 6;
  73.     public int IdleTime = 20000;
  74.  
  75.     public int KeepOffensesFor = 30000;
  76.  
  77.     //Other Times
  78.     public int FlightTriggerCancel = 2000;
  79.  
  80.     public ArrayList<Detector> _movementDetectors;
  81.     public ArrayList<Detector> _combatDetectors;
  82.    
  83.     private AntiHackRepository _repository;
  84.  
  85.     protected AntiHack(JavaPlugin plugin, Punish punish, Portal portal, PreferencesManager preferences, CoreClientManager clientManager)
  86.     {
  87.         super("AntiHack", plugin);
  88.  
  89.         Punish = punish;
  90.         Portal = portal;
  91.         _preferences = preferences;
  92.         _clientManager = clientManager;
  93.  
  94.         _repository = new AntiHackRepository(plugin.getConfig().getString("serverstatus.name"));
  95.         _repository.initialize();
  96.  
  97.         _movementDetectors = new ArrayList<Detector>();
  98.         _combatDetectors = new ArrayList<Detector>();
  99.  
  100.         _movementDetectors.add(new Fly(this));
  101.         _movementDetectors.add(new Idle(this));
  102.         _movementDetectors.add(new Speed(this));
  103.        
  104.         _combatDetectors.add(new Reach(this));
  105.     }
  106.  
  107.     public static void Initialize(JavaPlugin plugin, Punish punish, Portal portal, PreferencesManager preferences, CoreClientManager clientManager)
  108.     {
  109.         Instance = new AntiHack(plugin, punish, portal, preferences, clientManager);
  110.     }
  111.  
  112.     @EventHandler
  113.     public void playerMove(PlayerMoveEvent event)
  114.     {
  115.         if (!_enabled)
  116.             return;
  117.  
  118.         _lastMoveEvent.put(event.getPlayer(), System.currentTimeMillis());
  119.     }
  120.  
  121.     @EventHandler
  122.     public void playerTeleport(PlayerTeleportEvent event)
  123.     {
  124.         if (!_enabled)
  125.             return;
  126.  
  127.         setIgnore(event.getPlayer(), 2000);
  128.     }
  129.  
  130.     @EventHandler
  131.     public void playerVelocity(PlayerVelocityEvent event)
  132.     {
  133.         if (!_enabled)
  134.             return;
  135.  
  136.         _velocityEvent.add(event.getPlayer());
  137.     }
  138.  
  139.     @EventHandler
  140.     public void playerQuit(PlayerQuitEvent event)
  141.     {
  142.         if (!_enabled)
  143.             return;
  144.  
  145.         resetAll(event.getPlayer());
  146.     }
  147.  
  148.     @EventHandler
  149.     public void startIgnore(PlayerMoveEvent event)
  150.     {
  151.         if (!_enabled)
  152.             return;
  153.  
  154.         Player player = event.getPlayer();
  155.  
  156.         if (_velocityEvent.remove(player))
  157.         {
  158.             setIgnore(player, 2000);
  159.         }
  160.  
  161.         //Initial Move (or Lag) Ignore
  162.         if (_lastMoveEvent.containsKey(player))
  163.         {
  164.             long timeBetweenPackets = System.currentTimeMillis() - _lastMoveEvent.get(player);
  165.  
  166.             if (timeBetweenPackets > 500)
  167.             {
  168.                 setIgnore(player, Math.min(4000, timeBetweenPackets));
  169.             }
  170.         }
  171.     }
  172.  
  173.     public void setIgnore(Player player, long time)
  174.     {
  175.         //Wipe Detection
  176.         for (Detector detector : _movementDetectors)
  177.             detector.Reset(player);
  178.  
  179.         //Already ignoring for a longer period
  180.         if (_ignore.containsKey(player) && _ignore.get(player) > System.currentTimeMillis() + time)
  181.             return;
  182.  
  183.         //Add Ignore
  184.         _ignore.put(player, System.currentTimeMillis() + time);
  185.     }
  186.  
  187.     public boolean isValid(Player player, boolean groundValid)
  188.     {
  189.         //Near Other Player
  190.         for (Player other : UtilServer.getPlayers())
  191.         {
  192.             if (player.equals(other))
  193.                 continue;
  194.            
  195.             if (other.getGameMode() != GameMode.SURVIVAL || UtilPlayer.isSpectator(player))
  196.                 continue;
  197.            
  198.             if (other.getVehicle() != null)
  199.                 continue;
  200.            
  201.             if (UtilMath.offset(player, other) < 2)
  202.                 return true;
  203.         }
  204.        
  205.         if (player.isFlying() || player.isInsideVehicle() || player.getGameMode() != GameMode.SURVIVAL || UtilPlayer.isSpectator(player))
  206.         {
  207.             return true;
  208.         }
  209.  
  210.         //On Ground
  211.         if (groundValid)
  212.         {
  213.             if (UtilEnt.onBlock(player) || player.getLocation().getBlock().getType() != Material.AIR)
  214.             {
  215.                 return true;
  216.             }
  217.         }
  218.  
  219.         if ((_ignore.containsKey(player) && System.currentTimeMillis() < _ignore.get(player)))
  220.         {
  221.             return true;
  222.         }
  223.  
  224.         return false;
  225.     }
  226.  
  227.     public void addSuspicion(Player player, String type)
  228.     {
  229.         if (!_enabled)
  230.             return;
  231.  
  232.         System.out.println(C.cRed + C.Bold + player.getName() + " suspected for " + type + ".");
  233.  
  234.         //Add Offense
  235.         if (!_offense.containsKey(player))
  236.             _offense.put(player, new HashMap<String, ArrayList<Long>>());
  237.  
  238.         if (!_offense.get(player).containsKey(type))
  239.             _offense.get(player).put(type, new ArrayList<Long>());
  240.  
  241.         _offense.get(player).get(type).add(System.currentTimeMillis());
  242.  
  243.         //Cull & Count
  244.         int total = 0;
  245.         for (String curType : _offense.get(player).keySet())
  246.         {
  247.             //Remove Old Offenses
  248.             Iterator<Long> offenseIterator = _offense.get(player).get(curType).iterator();
  249.             while (offenseIterator.hasNext())
  250.             {
  251.                 if (UtilTime.elapsed(offenseIterator.next(), KeepOffensesFor))
  252.                     offenseIterator.remove();
  253.             }
  254.  
  255.             //Count
  256.             total += _offense.get(player).get(curType).size();
  257.         }
  258.  
  259.  
  260.         //Inform
  261.         for (Player admin : UtilServer.getPlayers())
  262.             if (_clientManager.Get(admin).GetRank().Has(Rank.MODERATOR) && _preferences.Get(admin).ShowMacReports)
  263.             {
  264.                 UtilPlayer.message(admin, "#" + total + ": " + C.cRed + C.Bold + player.getName() + " suspected for " + type + ".");
  265.             }
  266.  
  267.         // Print (Debug)
  268.         System.out.println("[Offense] #" + total + ": "+ player.getName() + " received suspicion for " + type + ".");
  269.     }
  270.  
  271.     @EventHandler
  272.     public void generateReports(UpdateEvent event)
  273.     {
  274.         if (!_enabled)
  275.             return;
  276.  
  277.         if (event.getType() != UpdateType.SEC)
  278.             return;
  279.  
  280.         for (Iterator<Entry<Player, HashMap<String, ArrayList<Long>>>> playerIterator = _offense.entrySet().iterator(); playerIterator.hasNext();)
  281.         {
  282.             Entry<Player, HashMap<String, ArrayList<Long>>> entry = playerIterator.next();
  283.             Player player = entry.getKey();
  284.            
  285.             String out = "";
  286.             int total = 0;
  287.  
  288.             for (String type : entry.getValue().keySet())
  289.             {
  290.                 //Remove Old Offenses
  291.                 Iterator<Long> offenseIterator = entry.getValue().get(type).iterator();
  292.                 while (offenseIterator.hasNext())
  293.                 {
  294.                     long time = offenseIterator.next();
  295.  
  296.                     if (UtilTime.elapsed(time, KeepOffensesFor))
  297.                         offenseIterator.remove();
  298.                 }
  299.  
  300.                 //Count
  301.                 int count = entry.getValue().get(type).size();
  302.                 total += count;
  303.  
  304.                 out += count + " " + type + ", ";
  305.             }
  306.  
  307.             if (out.length() > 0)
  308.                 out = out.substring(0, out.length() - 2);
  309.  
  310.             String severity = "Low";
  311.            
  312.             if (total > (_strict ? 6 : 18))
  313.                 severity = "Extreme";
  314.             else if (total > (_strict ? 4 : 12))
  315.                 severity = "High";
  316.             else if (total > (_strict ? 2 : 6))
  317.                 severity = "Medium";
  318.  
  319.             //Send Report
  320.             sendReport(player, out, severity);
  321.            
  322.             if (severity.equalsIgnoreCase("Extreme"))
  323.             {
  324.                 playerIterator.remove();
  325.                 resetAll(player, false);
  326.             }
  327.         }
  328.     }
  329.  
  330.     public void sendReport(Player player, String report, String severity)
  331.     {
  332.         if (severity.equals("Extreme"))
  333.         {
  334.             //Staff
  335.             boolean handled = false;
  336.             for (Player staff : UtilServer.getPlayers())
  337.             {
  338.                 if (_clientManager.Get(staff).GetRank().Has(Rank.MODERATOR))
  339.                 {
  340.                     UtilPlayer.message(staff, C.cAqua + C.Scramble + "A" + ChatColor.RESET + C.cRed + C.Bold + " MAC > " + ChatColor.RESET + C.cYellow + report);
  341.                     UtilPlayer.message(staff, C.cAqua + C.Scramble + "A" + ChatColor.RESET + C.cRed + C.Bold + " MAC > " + ChatColor.RESET + C.cGold + player.getName() + C.cYellow + " has extreme violation. Please investigate.");
  342.  
  343.                     handled = true;
  344.                 }
  345.             }
  346.  
  347.             //Auto-Kick
  348.             if (!handled && _clientManager.Get(player).GetRank() != Rank.YOUTUBE && _clientManager.Get(player).GetRank() != Rank.TWITCH)
  349.             {
  350.                 player.playSound(player.getLocation(), Sound.ENDERDRAGON_GROWL, 2f, 0.5f);
  351.  
  352.                 if (_kick || _hubAttempted.remove(player))
  353.                 {
  354.                     player.kickPlayer(
  355.                             C.cGold + "Mineplex Anti-Cheat" + "\n" +
  356.                                     C.cWhite + "You were kicked for suspicious movement." + "\n" +
  357.                                     C.cWhite + "Cheating may result in a " + C.cRed + "Permanent Ban" + C.cWhite + "." + "\n" +
  358.                                     C.cWhite + "If you were not cheating, you will not be banned."
  359.                             );
  360.                 }
  361.                 else
  362.                 {
  363.                     _hubAttempted.add(player);
  364.                    
  365.                     UtilPlayer.message(player,  C.cGold + C.Strike + "---------------------------------------------");
  366.                     UtilPlayer.message(player, "");
  367.                     UtilPlayer.message(player, C.cGold + "Mineplex Anti-Cheat");
  368.                     UtilPlayer.message(player, "");
  369.                     UtilPlayer.message(player, "You were kicked from the game for suspicious movement.");
  370.                     UtilPlayer.message(player, "Cheating may result in a " + C.cRed + "Permanent Ban" + C.cWhite + ".");
  371.                     UtilPlayer.message(player, "If you were not cheating, you will not be banned.");
  372.                     UtilPlayer.message(player, "");
  373.                     UtilPlayer.message(player,  C.cGold + C.Strike + "---------------------------------------------");
  374.                     Portal.sendPlayerToServer(player, "Lobby");
  375.                 }
  376.  
  377.                 UtilServer.broadcast(F.main("MAC", player.getName() + " was kicked for suspicious movement."));
  378.             }
  379.  
  380.             //Record
  381.             ServerListPingEvent event = new ServerListPingEvent(null, Bukkit.getServer().getMotd(), Bukkit.getServer().getOnlinePlayers().size(), Bukkit.getServer().getMaxPlayers());
  382.             getPluginManager().callEvent(event);
  383.  
  384.             String motd = event.getMotd();
  385.             String game = "N/A";
  386.             String map = "N/A";
  387.  
  388.             String[] args = motd.split("\\|");
  389.  
  390.             if (args.length > 0)
  391.                 motd = args[0];
  392.  
  393.             if (args.length > 2)
  394.                 game = args[2];
  395.  
  396.             if (args.length > 3)
  397.                 map = args[3];
  398.  
  399.             _repository.saveOffense(player, motd, game, map, report);
  400.         }
  401.     }
  402.  
  403.     private void reset()
  404.     {
  405.         for (Player player : UtilServer.getPlayers())
  406.             resetAll(player);
  407.     }
  408.  
  409.     private void resetAll(Player player)
  410.     {
  411.         resetAll(player, true);
  412.     }
  413.    
  414.     private void resetAll(Player player, boolean removeOffenses)
  415.     {
  416.         _ignore.remove(player);
  417.         _velocityEvent.remove(player);
  418.         _lastMoveEvent.remove(player);
  419.  
  420.         if (removeOffenses)
  421.             _offense.remove(player);
  422.  
  423.         for (Detector detector : _movementDetectors)
  424.             detector.Reset(player);
  425.        
  426.         for (Detector detector : _combatDetectors)
  427.             detector.Reset(player);
  428.     }
  429.  
  430.     @EventHandler
  431.     public void cleanupPlayers(UpdateEvent event)
  432.     {
  433.         if (!_enabled)
  434.             return;
  435.  
  436.         if (event.getType() != UpdateType.SLOW)
  437.             return;
  438.  
  439.         for (Iterator<Entry<Player, Long>> playerIterator = _ignore.entrySet().iterator(); playerIterator.hasNext();)
  440.         {
  441.             Player player = playerIterator.next().getKey();
  442.  
  443.             if (!player.isOnline() || player.isDead() || !player.isValid())
  444.             {  
  445.                 playerIterator.remove();
  446.  
  447.                 _velocityEvent.remove(player);
  448.                 _lastMoveEvent.remove(player);
  449.  
  450.                 _offense.remove(player);
  451.  
  452.                 for (Detector detector : _movementDetectors)
  453.                     detector.Reset(player);
  454.                
  455.                 for (Detector detector : _combatDetectors)
  456.                     detector.Reset(player);
  457.             }
  458.         }
  459.        
  460.  
  461.         for (Iterator<Player> playerIterator = _hubAttempted.iterator(); playerIterator.hasNext();)
  462.         {
  463.             Player player = playerIterator.next();
  464.  
  465.             if (!player.isOnline() || !player.isValid())
  466.             {  
  467.                 playerIterator.remove();
  468.             }
  469.         }
  470.     }
  471.  
  472.     public void setEnabled(boolean b)
  473.     {
  474.         _enabled = b;
  475.         System.out.println("MAC Enabled: " + b);
  476.     }
  477.  
  478.     public boolean isEnabled()
  479.     {
  480.         return _enabled;
  481.     }
  482.  
  483.     public void setStrict(boolean strict)
  484.     {
  485.         _strict = strict;
  486.  
  487.         reset();
  488.  
  489.         System.out.println("MAC Strict: " + strict);
  490.     }
  491.  
  492.     public boolean isStrict()
  493.     {
  494.         return _strict;
  495.     }
  496.    
  497.     public void setKick(boolean kick)
  498.     {
  499.         _kick = kick;
  500.  
  501.         System.out.println("MAC Kick: " + kick);
  502.     }
  503. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement