Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 27.17 KB | None | 0 0
  1. package net.badlion.gcheat;
  2.  
  3. import net.badlion.common.libraries.exceptions.HTTPRequestFailException;
  4. import net.badlion.gberry.Gberry;
  5. import net.badlion.gcheat.listeners.AutoClickerListener;
  6. import net.badlion.gcheat.listeners.BlockGlitchListener;
  7. import net.badlion.gcheat.listeners.BungeeCordListener;
  8. import net.badlion.gcheat.listeners.FoodFixListener;
  9. import net.badlion.gcheat.listeners.GSyncListener;
  10. import net.badlion.gcheat.listeners.InventoryTweakListener;
  11. import net.badlion.gcheat.listeners.MovementListener;
  12. import net.badlion.gcheat.listeners.ReducedKnockbackListener;
  13. import net.badlion.gcheat.listeners.RegenListener;
  14. import net.badlion.gcheat.listeners.SwingListener;
  15. import net.badlion.gcheat.listeners.VapeListener;
  16. import org.apache.logging.log4j.LogManager;
  17. import org.apache.logging.log4j.Logger;
  18. import org.apache.logging.log4j.Marker;
  19. import org.apache.logging.log4j.MarkerManager;
  20. import org.bukkit.Bukkit;
  21. import org.bukkit.Server;
  22. import org.bukkit.entity.Player;
  23. import org.bukkit.event.EventHandler;
  24. import org.bukkit.event.Listener;
  25. import org.bukkit.event.player.GCheatEvent;
  26. import org.bukkit.plugin.java.JavaPlugin;
  27. import org.bukkit.scheduler.BukkitRunnable;
  28. import org.joda.time.DateTime;
  29. import org.joda.time.DateTimeZone;
  30. import org.json.simple.JSONArray;
  31. import org.json.simple.JSONObject;
  32.  
  33. import java.sql.Connection;
  34. import java.sql.PreparedStatement;
  35. import java.sql.SQLException;
  36. import java.sql.Timestamp;
  37. import java.util.ArrayList;
  38. import java.util.HashMap;
  39. import java.util.HashSet;
  40. import java.util.Iterator;
  41. import java.util.List;
  42. import java.util.Map;
  43. import java.util.Queue;
  44. import java.util.Random;
  45. import java.util.Set;
  46. import java.util.UUID;
  47. import java.util.concurrent.ConcurrentLinkedQueue;
  48.  
  49. public class GCheat extends JavaPlugin implements Listener {
  50.  
  51. public static GCheat plugin;
  52.  
  53. public static final Random random = new Random();
  54.  
  55. // Logger stuff
  56. private Logger chatLogger;
  57. private Marker marker;
  58. private boolean logMessages = false;
  59. private String serverName;
  60.  
  61. private Queue<GCheatRecord> records = new ConcurrentLinkedQueue<>();
  62. private Queue<SwingListener.SwingTracker> swingRecords = new ConcurrentLinkedQueue<>();
  63.  
  64. public static Set<String> disabledPlayers = new HashSet<>();
  65. public static Set<String> ignoredPlayers = new HashSet<>();
  66. public static Set<UUID> bannedUUIDS = new HashSet<>(); // Stop double bans
  67.  
  68. @Override
  69. public void onEnable() {
  70. GCheat.plugin = this;
  71.  
  72. this.saveDefaultConfig();
  73. this.logMessages = this.getConfig().getBoolean("log-messages", false);
  74. this.serverName = Gberry.serverName;
  75.  
  76. // Setup log4j2 logger
  77. this.chatLogger = LogManager.getLogger(GCheat.class.getName());
  78. this.marker = MarkerManager.getMarker("GCHEAT");
  79.  
  80. this.getServer().getPluginManager().registerEvents(this, this);
  81. this.getServer().getPluginManager().registerEvents(new AutoClickerListener(this), this);
  82. this.getServer().getPluginManager().registerEvents(new GSyncListener(), this);
  83. this.getServer().getPluginManager().registerEvents(new InventoryTweakListener(this), this);
  84. this.getServer().getPluginManager().registerEvents(new FoodFixListener(), this);
  85. this.getServer().getPluginManager().registerEvents(new MovementListener(), this);
  86. this.getServer().getPluginManager().registerEvents(new RegenListener(), this);
  87. this.getServer().getPluginManager().registerEvents(new SwingListener(), this);
  88. this.getServer().getPluginManager().registerEvents(new BlockGlitchListener(), this);
  89. this.getServer().getPluginManager().registerEvents(new ReducedKnockbackListener(), this);
  90. //this.getServer().getPluginManager().registerEvents(new NoFallListener(), this);
  91.  
  92. BungeeCordListener bungeeCordListener = new BungeeCordListener();
  93. this.getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", bungeeCordListener);
  94. this.getServer().getPluginManager().registerEvents(bungeeCordListener, this);
  95.  
  96. VapeListener vapeListener = new VapeListener();
  97. this.getServer().getMessenger().registerIncomingPluginChannel(this, "LOLIMAHCKER", vapeListener);
  98. this.getServer().getPluginManager().registerEvents(vapeListener, this);
  99.  
  100. new BukkitRunnable() {
  101.  
  102. @Override
  103. public void run() {
  104. GCheat.this.insertGCheatRecords();
  105. GCheat.this.insertGCheatSwingRecords();
  106. }
  107.  
  108. }.runTaskTimerAsynchronously(this, 20 * 5, 20 * 5);
  109.  
  110. this.getCommand("dgcheat").setExecutor(new DisableGCheatCommand());
  111.  
  112. }
  113.  
  114. @Override
  115. public void onDisable() {
  116. this.insertGCheatRecords();
  117. }
  118.  
  119. @EventHandler(ignoreCancelled=true)
  120. public void gCheatLogEventNew(final GCheatEvent event) {
  121. if (!disabledPlayers.contains(event.getPlayer().getName().toLowerCase())) {
  122. Gberry.plugin.getServer().getScheduler().runTask(Gberry.plugin, new Runnable() {
  123. @Override
  124. public void run() {
  125. Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "ad " + event.getMsg());
  126. }
  127. });
  128. if (ignoredPlayers.contains(event.getPlayer().getName().toLowerCase())) {
  129. return;
  130. }
  131.  
  132. //if (event.getLevel().ordinal() >= GCheatEvent.Level.ADMIN.ordinal()) {
  133. //} else if (event.getLevel().ordinal() >= GCheatEvent.Level.MOD.ordinal()) {
  134. // Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mc " + event.getMsg());
  135. //}
  136.  
  137. // Automatic Ban handler
  138. this.handleAutomaticBans(event);
  139.  
  140. this.logMessage(event.getPlayer(), event.getMsg());
  141. } else {
  142. Bukkit.getLogger().info(event.getMsg());
  143. }
  144. }
  145.  
  146. private static Map<UUID, List<Long>> killAuraViolationsTypeC = new HashMap<>();
  147.  
  148. private static Map<UUID, Long> ignoreHI = new HashMap<>();
  149. private static Map<UUID, List<Long>> killAuraViolationsTypeHShort = new HashMap<>();
  150. private static Map<UUID, List<Long>> killAuraViolationsTypeHLong = new HashMap<>();
  151. private static Map<UUID, List<Long>> killAuraViolationsTypeIShort = new HashMap<>();
  152. private static Map<UUID, List<Long>> killAuraViolationsTypeILong = new HashMap<>();
  153. private static Map<UUID, List<Long>> killAuraViolationsTypeS = new HashMap<>();
  154. private static Map<UUID, List<Long>> killAuraViolationsTypeT8 = new HashMap<>();
  155. private static Map<UUID, List<Long>> killAuraViolationsTypeT9 = new HashMap<>();
  156. private static Map<UUID, List<Long>> criticalsTypeB = new HashMap<>();
  157. private static Map<UUID, List<Long>> badPacketsTypeA = new HashMap<>();
  158.  
  159. public void handleAutomaticBans(final GCheatEvent event) {
  160. if (event.getType() == GCheatEvent.Type.KILL_AURA) {
  161. if (event.getMsg().contains("Type C")) {
  162. int lvl = Integer.parseInt(event.getMsg().substring(event.getMsg().length() - 1));
  163. if (lvl <= 7) {
  164. List<Long> times = killAuraViolationsTypeC.get(event.getPlayer().getUniqueId());
  165. if (times == null) {
  166. times = new ArrayList<>();
  167. killAuraViolationsTypeC.put(event.getPlayer().getUniqueId(), times);
  168. }
  169.  
  170. int violations = 0;
  171. Long currentTime = System.currentTimeMillis();
  172. times.add(currentTime);
  173. for (Iterator<Long> iterator = times.iterator(); iterator.hasNext();) {
  174. Long time = iterator.next();
  175. if (time + 60 * 5 * 1000 >= currentTime) {
  176. ++violations;
  177. } else {
  178. iterator.remove();
  179. }
  180. }
  181.  
  182. if (((lvl == 1 || (lvl >= 4 && lvl <= 7)) && violations == 5) || ((lvl == 2 || lvl == 3) && violations == 10)) {
  183. if (event.getPlayer().getName().equals("GCheat")) {
  184. return;
  185. }
  186.  
  187. if (Bukkit.getSpigotJarVersion() == Server.SERVER_VERSION.V1_9) return; // Tmp
  188. if (!GCheat.bannedUUIDS.contains(event.getPlayer().getUniqueId())) {
  189. GCheat.bannedUUIDS.add(event.getPlayer().getUniqueId());
  190. Gberry.plugin.getServer().getScheduler().runTask(Gberry.plugin, new Runnable() {
  191. @Override
  192. public void run() {
  193. Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + event.getPlayer().getName() + " [GCheat] Unfair Advantage");
  194. }
  195. });
  196. }
  197. }
  198. }
  199. } else if (event.getMsg().contains("Type E2")) {
  200. GCheat.delayedBan(event.getPlayer());
  201. } else if (event.getMsg().contains("Type H")) {
  202. // Old style of messages
  203. if (event.getMsg().contains("Type H (Experimental) 1") || event.getMsg().contains("Type H (Experimental) 2")) {
  204. Long ts = ignoreHI.get(event.getPlayer().getUniqueId());
  205. if (ts == null || ts + 5000 < System.currentTimeMillis()) {
  206. if (!GCheat.handleTimeDetectionWithSkips(killAuraViolationsTypeHShort, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 60 * 10 * 1000, 10, event.getMsg())) {
  207. GCheat.handleTimeDetectionWithSkips(killAuraViolationsTypeHLong, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 60 * 60 * 1000, 30, event.getMsg());
  208. }
  209. }
  210. } else if (event.getMsg().contains("Type H | ")) { // New style of messages
  211. String[] parts = event.getMsg().split(" \\| ");
  212. parts = parts[1].split(" ");
  213. for (String part : parts) {
  214. int val = Integer.parseInt(part.replace(" ", ""));
  215.  
  216. // Verify they aren't lagging
  217. if (val > 2) {
  218. killAuraViolationsTypeHShort.remove(event.getPlayer().getUniqueId());
  219. killAuraViolationsTypeHLong.remove(event.getPlayer().getUniqueId());
  220. ignoreHI.put(event.getPlayer().getUniqueId(), System.currentTimeMillis());
  221. } else {
  222. // Check that they weren't lagging recently
  223. Long ts = ignoreHI.get(event.getPlayer().getUniqueId());
  224. if (ts == null || ts + 5000 < System.currentTimeMillis()) {
  225. if (!GCheat.handleTimeDetectionWithSkips(killAuraViolationsTypeHShort, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 60 * 10 * 1000, 10, event.getMsg())) {
  226. GCheat.handleTimeDetectionWithSkips(killAuraViolationsTypeHLong, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 60 * 60 * 1000, 30, event.getMsg());
  227. }
  228. }
  229. }
  230. }
  231. } else {
  232. killAuraViolationsTypeHShort.remove(event.getPlayer().getUniqueId());
  233. killAuraViolationsTypeHLong.remove(event.getPlayer().getUniqueId());
  234. ignoreHI.put(event.getPlayer().getUniqueId(), System.currentTimeMillis());
  235. }
  236. } else if (event.getMsg().contains("Type I")) {
  237. if (event.getMsg().contains("Type I (Experimental) 1") || event.getMsg().contains("Type I (Experimental) 2")) {
  238. Long ts = ignoreHI.get(event.getPlayer().getUniqueId());
  239. if (ts == null || ts + 5000 < System.currentTimeMillis()) {
  240. if (!GCheat.handleTimeDetectionWithSkips(killAuraViolationsTypeIShort, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 60 * 10 * 1000, 10, event.getMsg())) {
  241. GCheat.handleTimeDetectionWithSkips(killAuraViolationsTypeILong, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 60 * 60 * 1000, 30, event.getMsg());
  242. }
  243. }
  244. } else if (event.getMsg().contains(("Type I | "))) { // New style of messages
  245. String[] parts = event.getMsg().split(" \\| ");
  246. parts = parts[1].split(" ");
  247. for (String part : parts) {
  248. int val = Integer.parseInt(part.replace(" ", ""));
  249.  
  250. // Verify they aren't lagging
  251. if (val > 2) {
  252. killAuraViolationsTypeIShort.remove(event.getPlayer().getUniqueId());
  253. killAuraViolationsTypeILong.remove(event.getPlayer().getUniqueId());
  254. ignoreHI.put(event.getPlayer().getUniqueId(), System.currentTimeMillis());
  255. } else {
  256. // Check that they weren't lagging recently
  257. Long ts = ignoreHI.get(event.getPlayer().getUniqueId());
  258. if (ts == null || ts + 5000 < System.currentTimeMillis()) {
  259. if (!GCheat.handleTimeDetectionWithSkips(killAuraViolationsTypeIShort, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 60 * 10 * 1000, 10, event.getMsg())) {
  260. GCheat.handleTimeDetectionWithSkips(killAuraViolationsTypeILong, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 60 * 60 * 1000, 30, event.getMsg());
  261. }
  262. }
  263. }
  264. }
  265. } else {
  266. killAuraViolationsTypeIShort.remove(event.getPlayer().getUniqueId());
  267. killAuraViolationsTypeILong.remove(event.getPlayer().getUniqueId());
  268. ignoreHI.put(event.getPlayer().getUniqueId(), System.currentTimeMillis());
  269. }
  270. } else if (event.getMsg().contains("Type J") || event.getMsg().contains("Type K")) {
  271. // Remove logs
  272. long currentTime = System.currentTimeMillis() / 1000;
  273. GCheat.removeLogs(killAuraViolationsTypeHShort, event.getPlayer().getUniqueId(), currentTime);
  274. GCheat.removeLogs(killAuraViolationsTypeHLong, event.getPlayer().getUniqueId(), currentTime);
  275. GCheat.removeLogs(killAuraViolationsTypeIShort, event.getPlayer().getUniqueId(), currentTime);
  276. GCheat.removeLogs(killAuraViolationsTypeILong, event.getPlayer().getUniqueId(), currentTime);
  277. } else if (event.getMsg().contains("Type U")) {
  278. GCheat.handleTimeDetection(killAuraViolationsTypeS, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 60 * 1000, 3);
  279. } else if (event.getMsg().contains("Type T (8)")) {
  280. GCheat.handleTimeDetection(killAuraViolationsTypeT8, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 10 * 60 * 1000, 10);
  281. } else if (event.getMsg().contains("Type T (9)")) {
  282. GCheat.handleTimeDetection(killAuraViolationsTypeT9, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 10 * 60 * 1000, 5);
  283. }
  284. } else if (event.getType() == GCheatEvent.Type.REGEN) {
  285. if (event.getMsg().contains("Regen Type B")) {
  286. GCheat.delayedBan(event.getPlayer());
  287. }
  288. } else if (event.getType() == GCheatEvent.Type.CRIT) {
  289. if (event.getMsg().contains("Criticals Type B")) {
  290. GCheat.handleTimeDetection(criticalsTypeB, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 60000, 10);
  291. }
  292. } else if (event.getType() == GCheatEvent.Type.UNKNOWN) {
  293. if (event.getMsg().contains("Bad Packets Type A")) {
  294. if (event.getMsg().endsWith("(PacketPlayInArmAnimation)") || event.getMsg().endsWith("(PacketPlayInEntityAction)") || event.getMsg().endsWith("(PacketPlayInUseEntity)")) {
  295. GCheat.handleTimeDetection(badPacketsTypeA, event.getPlayer().getUniqueId(), event.getPlayer().getName(), 60 * 1000, 2);
  296. }
  297. }
  298. }
  299. }
  300.  
  301.  
  302. public void logMessage(Player player, String message) {
  303. message = "[MC-" + player.getVersion() + "]" + message;
  304. if (this.logMessages) {
  305. this.chatLogger.info(this.marker, message);
  306. } else {
  307. this.records.add(new GCheatRecord(player, message));
  308. }
  309. }
  310.  
  311. public class GCheatRecord {
  312.  
  313. private Player player;
  314. private String msg;
  315. private long ts;
  316.  
  317. public GCheatRecord(Player player, String msg) {
  318. this.player = player;
  319. this.msg = msg;
  320. this.ts = new DateTime(DateTimeZone.UTC).getMillis();
  321. }
  322.  
  323. public Player getPlayer() {
  324. return player;
  325. }
  326.  
  327. public String getMsg() {
  328. return msg;
  329. }
  330.  
  331. public long getTs() {
  332. return ts;
  333. }
  334. }
  335.  
  336. public void insertGCheatRecords() {
  337. StringBuilder builder = new StringBuilder();
  338. builder.append("INSERT INTO gcheat_logs (server, msg, username, uuid, log_time) VALUES ");
  339.  
  340. List<GCheatRecord> records = new ArrayList<>();
  341. Iterator<GCheatRecord> iterator = this.records.iterator();
  342. while (iterator.hasNext()) {
  343. records.add(iterator.next());
  344. iterator.remove();
  345.  
  346. builder.append("(?, ?, ?, ?, ?), ");
  347. }
  348.  
  349. if (records.size() == 0) {
  350. return;
  351. }
  352.  
  353. String query = builder.substring(0, builder.length() - 2) + ";";
  354.  
  355. Connection connection = null;
  356. PreparedStatement ps = null;
  357.  
  358. try {
  359. connection = Gberry.getConnection();
  360. ps = connection.prepareStatement(query);
  361.  
  362. int i = 1;
  363.  
  364. for (GCheatRecord record : records) {
  365. ps.setString(i++, this.serverName);
  366. ps.setString(i++, record.getMsg());
  367. ps.setString(i++, record.getPlayer().getName());
  368. ps.setString(i++, record.getPlayer().getUniqueId().toString());
  369. ps.setTimestamp(i++, new Timestamp(record.getTs()));
  370. }
  371.  
  372. Gberry.executeUpdate(connection, ps);
  373. } catch (SQLException e) {
  374. e.printStackTrace();
  375. } finally {
  376. Gberry.closeComponents(ps, connection);
  377. }
  378. }
  379.  
  380. public void insertGCheatSwingRecords() {
  381. // POSTGRES
  382. StringBuilder builder = new StringBuilder();
  383. // 9.5 builder.append("INSERT INTO gcheat_swing_logs (server, uuid, swings, hits, swing_hit_percentage) VALUES ");
  384.  
  385. List<SwingListener.SwingTracker> swingRecords = new ArrayList<>();
  386. Iterator<SwingListener.SwingTracker> iterator = this.swingRecords.iterator();
  387. while (iterator.hasNext()) {
  388. swingRecords.add(iterator.next());
  389. iterator.remove();
  390.  
  391. // 9.5 builder.append("(?, ?, ?, ?, ?) ON CONFLICT (server, uuid) DO UPDATE SET swings = swings + ?, hits = hits + ?, swing_hit_percentage = ? ");
  392.  
  393. // TODO: Division by zero error 'swing_hit_percentage = hits * 100.0 / swings', can't do in single query
  394. builder.append("UPDATE gcheat_swing_logs SET swings = swings + ?, hits = hits + ? WHERE server = ? AND uuid = ?;");
  395. builder.append("UPDATE gcheat_swing_logs SET swing_hit_percentage = hits * 100.0 / swings WHERE server = ? AND uuid = ? AND swings != 0;");
  396. builder.append("INSERT INTO gcheat_swing_logs (server, uuid, swings, hits, swing_hit_percentage) SELECT ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT 1 FROM gcheat_swing_logs WHERE server = ? AND uuid = ?);");
  397. }
  398.  
  399. if (swingRecords.size() == 0) {
  400. return;
  401. }
  402.  
  403. String query = builder.toString();
  404.  
  405. Connection connection = null;
  406. PreparedStatement ps = null;
  407.  
  408. try {
  409. connection = Gberry.getConnection();
  410. ps = connection.prepareStatement(query);
  411.  
  412. int i = 1;
  413.  
  414. for (SwingListener.SwingTracker swingTracker : swingRecords) {
  415. ps.setInt(i++, swingTracker.getSwings());
  416. ps.setInt(i++, swingTracker.getHits());
  417. ps.setString(i++, Gberry.serverType.getInternalName());
  418. ps.setString(i++, swingTracker.getUniqueId().toString());
  419.  
  420. ps.setString(i++, Gberry.serverType.getInternalName());
  421. ps.setString(i++, swingTracker.getUniqueId().toString());
  422.  
  423. ps.setString(i++, Gberry.serverType.getInternalName());
  424. ps.setString(i++, swingTracker.getUniqueId().toString());
  425. ps.setInt(i++, swingTracker.getSwings());
  426. ps.setInt(i++, swingTracker.getHits());
  427. ps.setDouble(i++, swingTracker.getSwingHitPercentage());
  428.  
  429. ps.setString(i++, Gberry.serverType.getInternalName());
  430. ps.setString(i++, swingTracker.getUniqueId().toString());
  431. }
  432.  
  433. Gberry.executeUpdate(connection, ps);
  434. } catch (SQLException e) {
  435. e.printStackTrace();
  436. } finally {
  437. Gberry.closeComponents(ps, connection);
  438. }
  439.  
  440. // COUCHDB
  441. JSONObject matchDataBulk = new JSONObject();
  442. JSONArray matchDataDocs = new JSONArray();
  443.  
  444. for (SwingListener.SwingTracker swingTracker : swingRecords) {
  445. JSONObject matchData = new JSONObject();
  446. matchData.put("swings", swingTracker.getSwings());
  447. matchData.put("hits", swingTracker.getHits());
  448. matchData.put("swing_hit_percentage", swingTracker.getSwingHitPercentage());
  449.  
  450. // Add custom data from the match
  451. if (swingTracker.getData() != null) {
  452. for (String key : swingTracker.getData().keySet()) {
  453. matchData.put(key, swingTracker.getData().get(key));
  454. }
  455. }
  456.  
  457. matchDataDocs.add(matchData);
  458. }
  459.  
  460. matchDataBulk.put("docs", matchDataDocs);
  461.  
  462. // We don't care about the result in this case (not modifying further)
  463. try {
  464. Gberry.executeCouchDBBulkPostQuery(matchDataBulk, "gcheat");
  465. } catch (HTTPRequestFailException e) {
  466. GCheat.plugin.getLogger().info(matchDataBulk.toJSONString());
  467. GCheat.plugin.getLogger().info("Failed HTTP match-player request with error " + e.getResponseCode());
  468. GCheat.plugin.getLogger().info(e.getResponse());
  469. }
  470. }
  471.  
  472. public static boolean handleTimeDetection(Map<UUID, List<Long>> map, UUID uuid, String name, int length, int violationCount) {
  473. return handleTimeDetection(map, uuid, name, length, violationCount, " [GCheat] Unfair Advantage");
  474. }
  475.  
  476. public static boolean handleTimeDetection(Map<UUID, List<Long>> map, UUID uuid, final String name, int length, int violationCount, final String banReason) {
  477. List<Long> times = map.get(uuid);
  478. if (times == null) {
  479. times = new ArrayList<>();
  480. times.add(System.currentTimeMillis());
  481. map.put(uuid, times);
  482. } else {
  483. long currentTime = System.currentTimeMillis();
  484. int violations = 0;
  485. times.add(currentTime);
  486.  
  487. for (Iterator<Long> iterator = times.iterator(); iterator.hasNext();) {
  488. Long time = iterator.next();
  489. if (time + length >= currentTime) {
  490. ++violations;
  491. } else {
  492. iterator.remove();
  493. }
  494. }
  495.  
  496. if (Bukkit.getSpigotJarVersion() == Server.SERVER_VERSION.V1_9) return false; // Tmp
  497.  
  498. // They hit 5 of the exact same packets in 3 seconds...seems very fishy
  499. if (violations >= violationCount) {
  500. if (!disabledPlayers.contains(name.toLowerCase())) {
  501. if (!GCheat.bannedUUIDS.contains(uuid)) {
  502. GCheat.bannedUUIDS.add(uuid);
  503. Gberry.plugin.getServer().getScheduler().runTask(Gberry.plugin, new Runnable() {
  504. @Override
  505. public void run() {
  506. Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + name + banReason);
  507. }
  508. });
  509. }
  510. }
  511. return true;
  512. }
  513. }
  514.  
  515. return false;
  516. }
  517.  
  518. public static void removeLogs(Map<UUID, List<Long>> map, UUID uuid, long time) {
  519. List<Long> times = map.get(uuid);
  520. if (times != null) {
  521. times.remove(time);
  522. }
  523. }
  524.  
  525. // Skip timestamps that we already have
  526. public static boolean handleTimeDetectionWithSkips(Map<UUID, List<Long>> map, UUID uuid, final String name, int length, int violationCount, String msg) {
  527. List<Long> times = map.get(uuid);
  528. if (times == null) {
  529. times = new ArrayList<>();
  530. times.add(System.currentTimeMillis() / 1000);
  531. map.put(uuid, times);
  532. } else {
  533. long currentTime = System.currentTimeMillis() / 1000;
  534.  
  535. // Don't allow duplicates
  536. if (times.contains(currentTime)) {
  537. return false;
  538. }
  539.  
  540. int violations = 0;
  541. times.add(currentTime);
  542.  
  543. for (Iterator<Long> iterator = times.iterator(); iterator.hasNext();) {
  544. Long time = iterator.next();
  545. if (time + (length / 1000) >= currentTime) {
  546. ++violations;
  547. } else {
  548. iterator.remove();
  549. }
  550. }
  551.  
  552. if (Bukkit.getSpigotJarVersion() == Server.SERVER_VERSION.V1_9) return false; // Tmp
  553.  
  554. // They hit 5 of the exact same packets in 3 seconds...seems very fishy
  555. if (violations >= violationCount) {
  556. if (!disabledPlayers.contains(name.toLowerCase())) {
  557. if (!GCheat.bannedUUIDS.contains(uuid)) {
  558. GCheat.bannedUUIDS.add(uuid);
  559. Gberry.plugin.getServer().getScheduler().runTask(Gberry.plugin, new Runnable() {
  560. @Override
  561. public void run() {
  562. Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + name + " [GCheat] Unfair Advantage");
  563. }
  564. });
  565. }
  566. }
  567. return true;
  568. }
  569. }
  570.  
  571. return false;
  572. }
  573.  
  574. public static boolean isAntiCheatActivated() {
  575. double[] recentTPS = GCheat.plugin.getServer().getRecentTps();
  576.  
  577. int offSet = recentTPS.length == 4 ? 1 : 0;
  578.  
  579. return Bukkit.getGCheatActivation() && Gberry.getTPS(Gberry.Benchmark.ONE_MINUTE) > 19.0;
  580. }
  581.  
  582. public void addSwingRecord(SwingListener.SwingTracker swingTracker) {
  583. this.swingRecords.add(swingTracker);
  584. }
  585.  
  586. public static void delayedBan(final Player player) {
  587. Gberry.plugin.getServer().getScheduler().runTaskLater(Gberry.plugin, new Runnable() {
  588. @Override
  589. public void run() {
  590. if (GCheat.bannedUUIDS.add(player.getUniqueId())) {
  591. Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + player.getName() + " [GCheat] Unfair Advantage");
  592. }
  593. }
  594. }, 100 + random.nextInt(200));
  595. }
  596. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement