Advertisement
Guest User

Untitled

a guest
Feb 28th, 2020
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.45 KB | None | 0 0
  1. package net.sf.l2j.gameserver.instancemanager;
  2.  
  3. import java.io.File;
  4. import java.io.RandomAccessFile;
  5. import java.sql.Connection;
  6. import java.sql.PreparedStatement;
  7. import java.sql.SQLException;
  8. import java.util.ArrayList;
  9. import java.util.Calendar;
  10. import java.util.HashMap;
  11. import java.util.List;
  12. import java.util.Map;
  13. import java.util.Random;
  14. import java.util.concurrent.Future;
  15.  
  16. import net.sf.l2j.Config;
  17. import net.sf.l2j.L2DatabaseFactory;
  18. import net.sf.l2j.commons.lang.StringUtil;
  19. import net.sf.l2j.commons.concurrent.ThreadPool;
  20. import net.sf.l2j.gameserver.data.xml.MapRegionData;
  21. import net.sf.l2j.gameserver.model.actor.Creature;
  22. import net.sf.l2j.gameserver.model.actor.instance.Monster;
  23. import net.sf.l2j.gameserver.model.actor.Player;
  24. import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
  25. import net.sf.l2j.gameserver.network.serverpackets.PledgeCrest;
  26.  
  27. public class BotsPreventionManager
  28. {
  29. private class PlayerData
  30. {
  31. public PlayerData()
  32. {
  33. firstWindow = true;
  34. }
  35.  
  36. public int mainpattern;
  37. public List<Integer> options = new ArrayList<>();
  38. public boolean firstWindow;
  39. public int patternid;
  40. }
  41.  
  42. protected Random _randomize;
  43. protected static Map<Integer, Integer> _monsterscounter;
  44. protected static Map<Integer, Future<?>> _beginvalidation;
  45. protected static Map<Integer, PlayerData> _validation;
  46. protected static Map<Integer, byte[]> _images;
  47. protected int WINDOW_DELAY = 3; //delay used to generate new window if previous have been closed.
  48. protected int VALIDATION_TIME = Config.VALIDATION_TIME * 1000;
  49.  
  50. public static final BotsPreventionManager getInstance()
  51. {
  52. return SingletonHolder._instance;
  53. }
  54.  
  55. BotsPreventionManager()
  56. {
  57. _randomize = new Random();
  58. _monsterscounter = new HashMap<>();
  59. _beginvalidation = new HashMap<>();
  60. _validation = new HashMap<>();
  61. _images = new HashMap<>();
  62. _beginvalidation = new HashMap<>();
  63.  
  64. getimages();
  65. }
  66.  
  67. public void updatecounter(Creature player, Creature monster)
  68. {
  69. if ((player instanceof Player) && (monster instanceof Monster))
  70. {
  71. Player killer = (Player) player;
  72.  
  73. if (_validation.get(killer.getObjectId()) != null)
  74. {
  75. return;
  76. }
  77.  
  78. int count = 1;
  79. if (_monsterscounter.get(killer.getObjectId()) != null)
  80. {
  81. count = _monsterscounter.get(killer.getObjectId()) + 1;
  82. }
  83.  
  84. int next = _randomize.nextInt(Config.KILLS_COUNTER_RANDOMIZATION);
  85. if (Config.KILLS_COUNTER + next < count)
  86. {
  87. validationtasks(killer);
  88. _monsterscounter.remove(killer.getObjectId());
  89. }
  90. else
  91. {
  92. _monsterscounter.put(killer.getObjectId(), count);
  93. }
  94. }
  95. }
  96.  
  97. private static void getimages()
  98. {
  99. String CRESTS_DIR = "data/html/mods/prevention";
  100.  
  101. final File directory = new File(CRESTS_DIR);
  102. directory.mkdirs();
  103.  
  104. int i = 0;
  105. for (File file : directory.listFiles())
  106. {
  107. if (!file.getName().endsWith(".dds"))
  108. continue;
  109.  
  110. byte[] data;
  111.  
  112. try (RandomAccessFile f = new RandomAccessFile(file, "r"))
  113. {
  114. data = new byte[(int) f.length()];
  115. f.readFully(data);
  116. }
  117. catch (Exception e)
  118. {
  119. continue;
  120. }
  121. _images.put(i, data);
  122. i++;
  123. }
  124. }
  125.  
  126. public void prevalidationwindow(Player player)
  127. {
  128. NpcHtmlMessage html = new NpcHtmlMessage(1);
  129. StringBuilder tb = new StringBuilder();
  130. StringUtil.append(tb, "<html>");
  131. StringUtil.append(tb, "<title>Bots prevention</title>");
  132. StringUtil.append(tb, "<body><center><br><br><img src=\"L2UI_CH3.herotower_deco\" width=\"256\" height=\"32\">");
  133. StringUtil.append(tb, "<br><br><font color=\"a2a0a2\">if such window appears it means server suspect,<br1>that you may using cheating software.</font>");
  134. StringUtil.append(tb, "<br><br><font color=\"b09979\">if given answer results are incorrect or no action is made<br1>server is going to punish character instantly.</font>");
  135. StringUtil.append(tb, "<br><br><button value=\"CONTINUE\" action=\"bypass report_continue\" width=\"75\" height=\"21\" back=\"L2UI_CH3.Btn1_normal\" fore=\"L2UI_CH3.Btn1_normal\">");
  136. StringUtil.append(tb, "</center></body>");
  137. StringUtil.append(tb, "</html>");
  138. html.setHtml(tb.toString());
  139. player.sendPacket(html);
  140. }
  141.  
  142. private static void validationwindow(Player player)
  143. {
  144. PlayerData container = _validation.get(player.getObjectId());
  145. NpcHtmlMessage html = new NpcHtmlMessage(1);
  146.  
  147. StringBuilder tb = new StringBuilder();
  148. StringUtil.append(tb, "<html>");
  149. StringUtil.append(tb, "<title>Bots prevention</title>");
  150. StringUtil.append(tb, "<body><center><br><br><img src=\"L2UI_CH3.herotower_deco\" width=\"256\" height=\"32\">");
  151. StringUtil.append(tb, "<br><br><font color=\"a2a0a2\">in order to prove you are a human being<br1>you've to</font> <font color=\"b09979\">match colours within generated pattern:</font>");
  152.  
  153. // generated main pattern.
  154. StringUtil.append(tb, "<br><br><img src=\"Crest.crest_" + Config.SERVER_ID + "_" + (_validation.get(player.getObjectId()).patternid) + "\" width=\"32\" height=\"32\"></td></tr>");
  155. StringUtil.append(tb, "<br><br><font color=b09979>click-on pattern of your choice beneath:</font>");
  156.  
  157. // generate random colours.
  158. StringUtil.append(tb, "<table><tr>");
  159. for (int i = 0; i < container.options.size(); i++)
  160. {
  161. StringUtil.append(tb, "<td><button action=\"bypass -h report_" + i + "\" width=32 height=32 back=\"Crest.crest_" + Config.SERVER_ID + "_" + (container.options.get(i) + 1500) + "\" fore=\"Crest.crest_" + Config.SERVER_ID + "_" + (container.options.get(i) + 1500) + "\"></td>");
  162. }
  163. StringUtil.append(tb, "</tr></table>");
  164. StringUtil.append(tb, "</center></body>");
  165. StringUtil.append(tb, "</html>");
  166.  
  167. html.setHtml(tb.toString());
  168. player.sendPacket(html);
  169. }
  170.  
  171. public void punishmentnwindow(Player player)
  172. {
  173. NpcHtmlMessage html = new NpcHtmlMessage(1);
  174. StringBuilder tb = new StringBuilder();
  175. StringUtil.append(tb, "<html>");
  176. StringUtil.append(tb, "<title>Bots prevention</title>");
  177. StringUtil.append(tb, "<body><center><br><br><img src=\"L2UI_CH3.herotower_deco\" width=\"256\" height=\"32\">");
  178. StringUtil.append(tb, "<br><br><font color=\"a2a0a2\">if such window appears, it means character haven't<br1>passed through prevention system.");
  179. StringUtil.append(tb, "<br><br><font color=\"b09979\">in such case character get moved to nearest town.</font>");
  180. StringUtil.append(tb, "</center></body>");
  181. StringUtil.append(tb, "</html>");
  182. html.setHtml(tb.toString());
  183. player.sendPacket(html);
  184. }
  185.  
  186. public void validationtasks(Player player)
  187. {
  188. PlayerData container = new PlayerData();
  189. randomizeimages(container, player);
  190.  
  191. for (int i = 0; i < container.options.size(); i++)
  192. {
  193. PledgeCrest packet = new PledgeCrest((container.options.get(i) + 1500), _images.get(container.options.get(i)));
  194. player.sendPacket(packet);
  195.  
  196. }
  197.  
  198. PledgeCrest packet = new PledgeCrest(container.patternid, _images.get(container.options.get(container.mainpattern)));
  199. player.sendPacket(packet);
  200.  
  201. _validation.put(player.getObjectId(), container);
  202.  
  203. Future<?> newTask = ThreadPool.getInstance().scheduleGeneral(new ReportCheckTask(player), VALIDATION_TIME);
  204. ThreadPool.getInstance().scheduleGeneral(new countdown(player, VALIDATION_TIME / 1000), 0);
  205. _beginvalidation.put(player.getObjectId(), newTask);
  206. }
  207.  
  208. protected void randomizeimages(PlayerData container,Player player)
  209. {
  210. int buttonscount = 4;
  211. int imagescount = _images.size();
  212.  
  213. for (int i = 0; i < buttonscount; i++)
  214. {
  215. int next = _randomize.nextInt(imagescount);
  216. while (container.options.indexOf(next) > -1)
  217. {
  218. next = _randomize.nextInt(imagescount);
  219. }
  220. container.options.add(next);
  221. }
  222.  
  223. int mainIndex = _randomize.nextInt(buttonscount);
  224. container.mainpattern = mainIndex;
  225.  
  226. Calendar token = Calendar.getInstance();
  227. String uniquetoken = Integer.toString(token.get(Calendar.DAY_OF_MONTH))+Integer.toString(token.get(Calendar.HOUR_OF_DAY))+Integer.toString(token.get(Calendar.MINUTE))+Integer.toString(token.get(Calendar.SECOND))+Integer.toString(token.get(Calendar.MILLISECOND)/100);
  228. container.patternid = Integer.parseInt(uniquetoken);
  229. }
  230.  
  231. protected void banpunishment(Player player)
  232. {
  233. _validation.remove(player.getObjectId());
  234. _beginvalidation.get(player.getObjectId()).cancel(true);
  235. _beginvalidation.remove(player.getObjectId());
  236.  
  237. switch (Config.PUNISHMENT)
  238. {
  239. // 0 = move character to the closest village.
  240. // 1 = kick characters from the server.
  241. // 2 = put character to jail.
  242. // 3 = ban character from the server.
  243. case 0:
  244. player.stopMove(null);
  245. player.teleToLocation(MapRegionData.TeleportWhereType.Town);
  246. punishmentnwindow(player);
  247. break;
  248. case 1:
  249. if (player.isOnline())
  250. {
  251. player.logout(true);
  252. }
  253. break;
  254. case 2:
  255. jailpunishment(player, Config.PUNISHMENT_TIME * 60);
  256. break;
  257. case 3:
  258. //player.setAccessLevel(-100);
  259. changeaccesslevel(player, -100);
  260. break;
  261. }
  262.  
  263. player.sendMessage("Unfortunately, colours doesn't match.");
  264. }
  265.  
  266. private static void changeaccesslevel(Player targetPlayer, int lvl)
  267. {
  268. if (targetPlayer.isOnline())
  269. {
  270. targetPlayer.setAccessLevel(lvl);
  271. targetPlayer.logout();
  272. }
  273. else
  274. {
  275. try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  276. {
  277. PreparedStatement statement = con.prepareStatement("UPDATE characters SET accesslevel=? WHERE obj_id=?");
  278. statement.setInt(1, lvl);
  279. statement.setInt(2, targetPlayer.getObjectId());
  280. statement.execute();
  281. statement.close();
  282. }
  283. catch (SQLException se)
  284. {
  285. if (Config.DEBUG)
  286. se.printStackTrace();
  287. }
  288. }
  289. }
  290.  
  291. private static void jailpunishment(Player activeChar, int delay)
  292. {
  293. if (activeChar.isOnline())
  294. {
  295. activeChar.setPunishLevel(Player.PunishLevel.JAIL, Config.PUNISHMENT_TIME);
  296. }
  297. else
  298. {
  299. try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  300. {
  301. PreparedStatement statement = con.prepareStatement("UPDATE characters SET x=?, y=?, z=?, punish_level=?, punish_timer=? WHERE obj_id=?");
  302. statement.setInt(1, -114356);
  303. statement.setInt(2, -249645);
  304. statement.setInt(3, -2984);
  305. statement.setInt(4, Player.PunishLevel.JAIL.value());
  306. statement.setLong(5, (delay > 0 ? delay * Config.PUNISHMENT_TIME * 100 : 0));
  307. statement.setInt(6, activeChar.getObjectId());
  308.  
  309. statement.execute();
  310. statement.close();
  311. }
  312. catch (SQLException se)
  313. {
  314. activeChar.sendMessage("SQLException while jailing player");
  315. if (Config.DEBUG)
  316. se.printStackTrace();
  317. }
  318. }
  319. }
  320.  
  321. public void AnalyseBypass(String command, Player player)
  322. {
  323. if (!_validation.containsKey(player.getObjectId()))
  324. return;
  325.  
  326. String params = command.substring(command.indexOf("_") + 1);
  327.  
  328. if (params.startsWith("continue"))
  329. {
  330. validationwindow(player);
  331. _validation.get(player.getObjectId()).firstWindow = false;
  332. return;
  333. }
  334.  
  335. int choosenoption = -1;
  336. if (tryParseInt(params))
  337. {
  338. choosenoption = Integer.parseInt(params);
  339. }
  340.  
  341. if (choosenoption > -1)
  342. {
  343. PlayerData playerData = _validation.get(player.getObjectId());
  344. if (choosenoption != playerData.mainpattern)
  345. {
  346. banpunishment(player);
  347. }
  348. else
  349. {
  350. player.sendMessage("Congratulations, colours match!");
  351. _validation.remove(player.getObjectId());
  352. _beginvalidation.get(player.getObjectId()).cancel(true);
  353. _beginvalidation.remove(player.getObjectId());
  354. }
  355. }
  356. }
  357.  
  358. protected class countdown implements Runnable
  359. {
  360. private final Player _player;
  361. private int _time;
  362.  
  363. public countdown(Player player, int time)
  364. {
  365. _time = time;
  366. _player = player;
  367. }
  368.  
  369. @Override
  370. public void run()
  371. {
  372. if (_player.isOnline())
  373. {
  374. if (_validation.containsKey(_player.getObjectId()) && _validation.get(_player.getObjectId()).firstWindow)
  375. {
  376. if (_time % WINDOW_DELAY == 0)
  377. {
  378. prevalidationwindow(_player);
  379. }
  380. }
  381.  
  382. switch (_time)
  383. {
  384. case 300:
  385. case 240:
  386. case 180:
  387. case 120:
  388. case 60:
  389. _player.sendMessage(_time / 60 + " minute(s) to match colors.");
  390. break;
  391. case 30:
  392. case 10:
  393. case 5:
  394. case 4:
  395. case 3:
  396. case 2:
  397. case 1:
  398. _player.sendMessage(_time + " second(s) to match colors!");
  399. break;
  400. }
  401. if (_time > 1 && _validation.containsKey(_player.getObjectId()))
  402. {
  403. ThreadPool.getInstance().scheduleGeneral(new countdown(_player, _time - 1), 1000);
  404. }
  405. }
  406. }
  407. }
  408.  
  409. protected boolean tryParseInt(String value)
  410. {
  411. try
  412. {
  413. Integer.parseInt(value);
  414. return true;
  415. }
  416.  
  417. catch (NumberFormatException e)
  418. {
  419. return false;
  420. }
  421. }
  422.  
  423. public void CaptchaSuccessfull(Player player)
  424. {
  425. if (_validation.get(player.getObjectId()) != null)
  426. {
  427. _validation.remove(player.getObjectId());
  428. }
  429. }
  430.  
  431. public Boolean IsAlredyInReportMode(Player player)
  432. {
  433. if (_validation.get(player.getObjectId()) != null)
  434. {
  435. return true;
  436. }
  437. return false;
  438. }
  439.  
  440. private class ReportCheckTask implements Runnable
  441. {
  442. private final Player _player;
  443.  
  444. public ReportCheckTask(Player player)
  445. {
  446. _player = player;
  447. }
  448.  
  449. @Override
  450. public void run()
  451. {
  452. if (_validation.get(_player.getObjectId()) != null)
  453. {
  454. banpunishment(_player);
  455. }
  456. }
  457. }
  458.  
  459. private static class SingletonHolder
  460. {
  461. protected static final BotsPreventionManager _instance = new BotsPreventionManager();
  462. }
  463. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement