Advertisement
tensador125

L2J Auto Farm Mega For Rusacis

Jan 1st, 2024 (edited)
1,872
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 58.31 KB | Gaming | 0 0
  1. ### Eclipse Workspace Patch 1.0
  2. #P aCis_gameserver
  3. diff --git java/Base/AutoFarm/AutofarmConstants.java java/Base/AutoFarm/AutofarmConstants.java
  4. new file mode 100644
  5. index 0000000..70e4aef
  6. --- /dev/null
  7. +++ java/Base/AutoFarm/AutofarmConstants.java
  8. @@ -0,0 +1,11 @@
  9. +package Base.AutoFarm;
  10. +
  11. +import java.util.Arrays;
  12. +import java.util.List;
  13. +
  14. +public class AutofarmConstants
  15. +{
  16. +    public final static List<Integer> attackSlots = Arrays.asList(0, 1, 2, 3);
  17. +    public final static List<Integer> chanceSlots = Arrays.asList(4, 5, 6, 7);
  18. +    public final static List<Integer> lowLifeSlots = Arrays.asList(8, 9, 10, 11);
  19. +}
  20. \ No newline at end of file
  21. diff --git java/Base/AutoFarm/AutofarmPlayerRoutine.java java/Base/AutoFarm/AutofarmPlayerRoutine.java
  22. index e69de29..bb24adb 100644
  23. --- java/Base/AutoFarm/AutofarmPlayerRoutine.java
  24. +++ java/Base/AutoFarm/AutofarmPlayerRoutine.java
  25. @@ -0,0 +1,669 @@
  26. +package Base.AutoFarm;
  27. +
  28. +import net.sf.l2j.Config;
  29. +
  30. +
  31. +import net.sf.l2j.commons.math.MathUtil;
  32. +import net.sf.l2j.commons.pool.ConnectionPool;
  33. +import net.sf.l2j.commons.pool.ThreadPool;
  34. +import net.sf.l2j.commons.random.Rnd;
  35. +
  36. +import net.sf.l2j.gameserver.enums.ShortcutType;
  37. +import net.sf.l2j.gameserver.enums.TeamType;
  38. +import net.sf.l2j.gameserver.enums.skills.SkillTargetType;
  39. +import net.sf.l2j.gameserver.enums.skills.SkillType;
  40. +import net.sf.l2j.gameserver.geoengine.GeoEngine;
  41. +import net.sf.l2j.gameserver.handler.IItemHandler;
  42. +import net.sf.l2j.gameserver.handler.ItemHandler;
  43. +import net.sf.l2j.gameserver.handler.voicedcommandhandlers.AutoFarm;
  44. +import net.sf.l2j.gameserver.model.Shortcut;
  45. +import net.sf.l2j.gameserver.model.WorldObject;
  46. +import net.sf.l2j.gameserver.model.WorldRegion;
  47. +
  48. +import net.sf.l2j.gameserver.model.actor.Creature;
  49. +import net.sf.l2j.gameserver.model.actor.Player;
  50. +import net.sf.l2j.gameserver.model.actor.Summon;
  51. +
  52. +import net.sf.l2j.gameserver.model.actor.instance.Chest;
  53. +import net.sf.l2j.gameserver.model.actor.instance.Monster;
  54. +import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
  55. +import net.sf.l2j.gameserver.network.SystemMessageId;
  56. +import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
  57. +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage;
  58. +import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
  59. +import net.sf.l2j.gameserver.skills.AbstractEffect;
  60. +import net.sf.l2j.gameserver.skills.L2Skill;
  61. +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS;
  62. +
  63. +import java.sql.Connection;
  64. +import java.sql.PreparedStatement;
  65. +import java.sql.ResultSet;
  66. +import java.sql.SQLException;
  67. +import java.util.ArrayList;
  68. +import java.util.Arrays;
  69. +import java.util.Collections;
  70. +import java.util.List;
  71. +import java.util.concurrent.ScheduledFuture;
  72. +import java.util.function.Function;
  73. +import java.util.stream.Collectors;
  74. +
  75. +public class AutofarmPlayerRoutine
  76. +{
  77. +   private final Player player;
  78. +   private ScheduledFuture<?> _task;
  79. +   private Creature committedTarget = null;
  80. +
  81. +   public AutofarmPlayerRoutine(Player player)
  82. +   {
  83. +       this.player = player;
  84. +   }
  85. +
  86. +   public void start()
  87. +   {
  88. +       if (_task == null)
  89. +       {
  90. +          
  91. +            
  92. +            if (isIpAllowed(player.getIP())) {
  93. +                player.sendMessage("Solo puedes usar Auto Farm con una IP a la vez.");
  94. +                return;
  95. +            }else {
  96. +               _task = ThreadPool.scheduleAtFixedRate(() -> executeRoutine(), 450, 450);
  97. +              
  98. +               player.sendPacket(new ExShowScreenMessage("Auto Farming Actived...", 5*1000, SMPOS.TOP_CENTER, false));
  99. +               player.sendPacket(new SystemMessage(SystemMessageId.AUTO_FARM_ACTIVATED));
  100. +               player.setTeam(player.isMageClass() ? TeamType.BLUE : TeamType.RED);
  101. +               insertIpEntry(player.getObjectId(), player.getIP());
  102. +               player.broadcastUserInfo();
  103. +            }
  104. +            
  105. +            
  106. +            
  107. +            
  108. +          
  109. +
  110. +      
  111. +       }
  112. +   }
  113. +  
  114. +   public void stop()
  115. +   {
  116. +       if (_task != null)
  117. +       {
  118. +          
  119. +           removeIpEntry(player.getObjectId());
  120. +           _task.cancel(false);
  121. +           _task = null;
  122. +          
  123. +           player.sendPacket(new ExShowScreenMessage("Auto Farming Deactivated...", 5*1000, SMPOS.TOP_CENTER, false));
  124. +           player.sendPacket(new SystemMessage(SystemMessageId.AUTO_FARM_DESACTIVATED));
  125. +           player.setTeam(TeamType.NONE);
  126. +           player.broadcastUserInfo();
  127. +          
  128. +       }
  129. +   }
  130. +  
  131. +  
  132. +    // Método para insertar la IP del jugador en la tabla Auto_Farm_Ip
  133. +    private void insertIpEntry(int charId, String ip) {
  134. +        try (Connection con = ConnectionPool.getConnection()) {
  135. +            String insertSql = "INSERT INTO Auto_Farm_Ip (char_id, ip) VALUES (?, ?)";
  136. +            try (PreparedStatement insertStatement = con.prepareStatement(insertSql)) {
  137. +                insertStatement.setInt(1, charId);
  138. +                insertStatement.setString(2, ip);
  139. +                insertStatement.executeUpdate();
  140. +            }
  141. +        } catch (SQLException e) {
  142. +            e.printStackTrace();
  143. +        }
  144. +    }
  145. +  
  146. +    public static boolean isIpAllowed( String ip) {
  147. +        try (Connection con = ConnectionPool.getConnection()) {
  148. +            String selectSql = "SELECT * FROM Auto_Farm_Ip WHERE ip = ?";
  149. +            try (PreparedStatement selectStatement = con.prepareStatement(selectSql)) {
  150. +              
  151. +                selectStatement.setString(1, ip);
  152. +                try (ResultSet result = selectStatement.executeQuery()) {
  153. +                    return result.next();
  154. +                }
  155. +            }
  156. +        } catch (SQLException e) {
  157. +            e.printStackTrace();
  158. +        }
  159. +        return false; // En caso de error o si no hay coincidencia
  160. +    }
  161. +
  162. +    // Método para eliminar la entrada del jugador en la tabla Auto_Farm_Ip
  163. +    public static void removeIpEntry(int charId) {
  164. +        try (Connection con = ConnectionPool.getConnection()) {
  165. +            String deleteSql = "DELETE FROM Auto_Farm_Ip WHERE char_id = ?";
  166. +            try (PreparedStatement deleteStatement = con.prepareStatement(deleteSql)) {
  167. +                deleteStatement.setInt(1, charId);
  168. +                deleteStatement.executeUpdate();
  169. +            }
  170. +        } catch (SQLException e) {
  171. +            e.printStackTrace();
  172. +        }
  173. +    }
  174. +  
  175. +  
  176. +  
  177. +   public void executeRoutine()
  178. +   {
  179. +       if (player.isNoBuffProtected() && player.getAllEffects().length <= 8)
  180. +       {
  181. +           player.sendMessage("You don't have buffs to use autofarm.");
  182. +           player.broadcastUserInfo();
  183. +           stop();
  184. +           player.setAutoFarm(false);
  185. +           AutoFarm.showAutoFarm(player);
  186. +           return;
  187. +       }
  188. +      
  189. +       calculatePotions();
  190. +       checkSpoil();
  191. +       targetEligibleCreature();
  192. +       if (player.isMageClass())
  193. +       {
  194. +           useAppropriateSpell(); // Prioriza el uso de hechizos para los magos
  195. +       }
  196. +       else if (shotcutsContainAttack())
  197. +       {
  198. +           attack(); // Si es una clase no maga y tiene la acción de ataque en los shortcuts
  199. +       }
  200. +       else
  201. +       {
  202. +           useAppropriateSpell(); // Si es una clase no maga y no tiene la acción de ataque, usa hechizos
  203. +       }
  204. +       checkSpoil();
  205. +       useAppropriateSpell();
  206. +   }
  207. +
  208. +   private void attack()
  209. +   {
  210. +       Boolean shortcutsContainAttack = shotcutsContainAttack();
  211. +      
  212. +       if (shortcutsContainAttack)
  213. +           physicalAttack();
  214. +   }
  215. +
  216. +   private void useAppropriateSpell()
  217. +   {
  218. +       L2Skill chanceSkill = nextAvailableSkill(getChanceSpells(), AutofarmSpellType.Chance);
  219. +
  220. +       if (chanceSkill != null)
  221. +       {
  222. +           doSkill(chanceSkill, false);
  223. +           return;
  224. +       }
  225. +
  226. +       L2Skill lowLifeSkill = nextAvailableSkill(getLowLifeSpells(), AutofarmSpellType.LowLife);
  227. +
  228. +       if (lowLifeSkill != null)
  229. +       {
  230. +           doSkill(lowLifeSkill, true);
  231. +           return;
  232. +       }
  233. +
  234. +       L2Skill attackSkill = nextAvailableSkill(getAttackSpells(), AutofarmSpellType.Attack);
  235. +
  236. +       if (attackSkill != null)
  237. +       {
  238. +           doSkill(attackSkill, false);
  239. +           return;
  240. +       }
  241. +   }
  242. +
  243. +   public L2Skill nextAvailableSkill(List<Integer> skillIds, AutofarmSpellType spellType)
  244. +   {
  245. +       for (Integer skillId : skillIds)
  246. +       {
  247. +           L2Skill skill = player.getSkill(skillId);
  248. +
  249. +           if (skill == null)
  250. +               continue;
  251. +          
  252. +           if (skill.getSkillType() == SkillType.SIGNET || skill.getSkillType() == SkillType.SIGNET_CASTTIME)
  253. +               continue;
  254. +
  255. +           if (player.isSkillDisabled(skill))
  256. +               continue;
  257. +
  258. +           if (isSpoil(skillId))
  259. +           {
  260. +               if (monsterIsAlreadySpoiled())
  261. +               {
  262. +                   continue;
  263. +               }
  264. +               return skill;
  265. +           }
  266. +          
  267. +           if (spellType == AutofarmSpellType.Chance && getMonsterTarget() != null)
  268. +           {
  269. +               if (getMonsterTarget().getFirstEffect(skillId) == null)
  270. +                   return skill;
  271. +               continue;
  272. +           }
  273. +
  274. +           if (spellType == AutofarmSpellType.LowLife && getHpPercentage() > player.getHealPercent())
  275. +               break;
  276. +
  277. +           return skill;
  278. +       }
  279. +
  280. +       return null;
  281. +   }
  282. +  
  283. +   private void checkSpoil()
  284. +   {
  285. +       if (canBeSweepedByMe() && getMonsterTarget().isDead())
  286. +       {
  287. +           L2Skill sweeper = player.getSkill(42);
  288. +           if (sweeper == null)
  289. +               return;
  290. +          
  291. +           doSkill(sweeper, false);
  292. +       }
  293. +   }
  294. +
  295. +   private Double getHpPercentage()
  296. +   {
  297. +       return player.getStatus().getHp() * 100.0f / player.getStatus().getMaxHp();
  298. +   }
  299. +
  300. +   private Double percentageMpIsLessThan()
  301. +   {
  302. +       return player.getStatus().getMp() * 100.0f / player.getStatus().getMaxMp();
  303. +   }
  304. +
  305. +   private Double percentageHpIsLessThan()
  306. +   {
  307. +       return player.getStatus().getHp() * 100.0f / player.getStatus().getMaxHp();
  308. +   }
  309. +
  310. +   private List<Integer> getAttackSpells()
  311. +   {
  312. +       return getSpellsInSlots(AutofarmConstants.attackSlots);
  313. +   }
  314. +
  315. +   private List<Integer> getSpellsInSlots(List<Integer> attackSlots)
  316. +   {
  317. +       return Arrays.stream(player.getShortcutList().getShortcuts()).filter(shortcut -> shortcut.getPage() == player.getPage() && shortcut.getType() == ShortcutType.SKILL && attackSlots.contains(shortcut.getSlot())).map(Shortcut::getId).collect(Collectors.toList());
  318. +   }
  319. +
  320. +   private List<Integer> getChanceSpells()
  321. +   {
  322. +       return getSpellsInSlots(AutofarmConstants.chanceSlots);
  323. +   }
  324. +
  325. +   private List<Integer> getLowLifeSpells()
  326. +   {
  327. +       return getSpellsInSlots(AutofarmConstants.lowLifeSlots);
  328. +   }
  329. +
  330. +   private boolean shotcutsContainAttack()
  331. +   {
  332. +       return Arrays.stream(player.getShortcutList().getShortcuts()).anyMatch(shortcut -> shortcut.getPage() == player.getPage() && shortcut.getType() == ShortcutType.ACTION && (shortcut.getId() == 2 || player.isSummonAttack() && shortcut.getId() == 22));
  333. +   }
  334. +  
  335. +  
  336. +  
  337. +  
  338. +   private boolean monsterIsAlreadySpoiled()
  339. +   {
  340. +       return getMonsterTarget() != null && getMonsterTarget().getSpoilState().isSpoiled();
  341. +   }
  342. +  
  343. +   private static boolean isSpoil(Integer skillId)
  344. +   {
  345. +       return skillId == 254 || skillId == 302;
  346. +   }
  347. +  
  348. +   private boolean canBeSweepedByMe()
  349. +   {
  350. +       return getMonsterTarget() != null && getMonsterTarget().isDead() && getMonsterTarget().getSpoilState().isSweepable();
  351. +   }
  352. +  
  353. +
  354. +  
  355. +       private void doSkill(L2Skill skill, boolean isSelfSkill)
  356. +       {
  357. +           final WorldObject target = player.getTarget();
  358. +           if (skill == null || !(target instanceof Creature))
  359. +               return;
  360. +          
  361. +           if (skill.getSkillType() == SkillType.RECALL && !Config.KARMA_PLAYER_CAN_TELEPORT && player.getKarma() > 0)
  362. +           {
  363. +               player.sendPacket(ActionFailed.STATIC_PACKET);
  364. +               return;
  365. +           }
  366. +
  367. +           if (skill.isToggle() && player.isMounted())
  368. +           {
  369. +               player.sendPacket(ActionFailed.STATIC_PACKET);
  370. +               return;
  371. +           }
  372. +
  373. +           if (player.isOutOfControl())
  374. +           {
  375. +               player.sendPacket(ActionFailed.STATIC_PACKET);
  376. +               return;
  377. +           }
  378. +          
  379. +          
  380. +          
  381. +          
  382. +          
  383. +           if (isNecessarySkill(skill))
  384. +               player.getAI().tryToCast(isSelfSkill ? player : (Creature) target, skill);
  385. +       }
  386. +  
  387. +  
  388. +       private boolean isNecessarySkill(L2Skill skill)
  389. +       {
  390. +           if (skill == null)
  391. +               return false;
  392. +          
  393. +           final WorldObject target = player.getTarget();
  394. +           if (target instanceof Monster)
  395. +           {
  396. +               final Monster monster = (Monster) target;
  397. +               if (skill.getSkillType() == SkillType.SPOIL && monster.getSpoilState().isSpoiled())
  398. +                   return false;
  399. +              
  400. +               List<AbstractEffect> effects = Arrays.stream(monster.getAllEffects()).filter(e -> e.getSkill().isDebuff()).collect(Collectors.toList());
  401. +               if (effects != null && !effects.isEmpty() && effects.stream().anyMatch(e -> e.getSkill().getId() == skill.getId()))
  402. +                   return false;
  403. +              
  404. +               if (!monster.isDead() && skill.getTargetType() == SkillTargetType.CORPSE_MOB)
  405. +                   return false;
  406. +              
  407. +               return true;
  408. +           }
  409. +           return false;
  410. +       }
  411. +
  412. +   private void physicalAttack()
  413. +   {
  414. +       if (!(player.getTarget() instanceof Monster))
  415. +           return;
  416. +
  417. +       Monster target = (Monster) player.getTarget();
  418. +
  419. +       if (!player.isMageClass())
  420. +       {
  421. +           if (target.canAutoAttack(player) && GeoEngine.getInstance().canSeeTarget(player, target))
  422. +           {
  423. +               if (GeoEngine.getInstance().canSeeTarget(player, target))
  424. +               {
  425. +                   player.getAI().tryToAttack(target);
  426. +                   player.onActionRequest();
  427. +
  428. +                   if (player.isSummonAttack() && player.getSummon() != null)
  429. +                   {
  430. +                       // Siege Golem's
  431. +                       if (player.getSummon().getNpcId() >= 14702 && player.getSummon().getNpcId() <= 14798 || player.getSummon().getNpcId() >= 14839 && player.getSummon().getNpcId() <= 14869)
  432. +                           return;
  433. +
  434. +                       Summon activeSummon = player.getSummon();
  435. +                       activeSummon.setTarget(target);
  436. +                       activeSummon.getAI().tryToAttack(target);
  437. +
  438. +                       int[] summonAttackSkills = {4261, 4068, 4137, 4260, 4708, 4709, 4710, 4712, 5135, 5138, 5141, 5442, 5444, 6095, 6096, 6041, 6044};
  439. +                       if (Rnd.get(100) < player.getSummonSkillPercent())
  440. +                       {
  441. +                           for (int skillId : summonAttackSkills)
  442. +                           {
  443. +                               useMagicSkillBySummon(skillId, target);
  444. +                           }
  445. +                       }
  446. +                   }
  447. +               }
  448. +           }
  449. +           else
  450. +           {
  451. +               if (target.canAutoAttack(player) && GeoEngine.getInstance().canSeeTarget(player, target))
  452. +               if (GeoEngine.getInstance().canSeeTarget(player, target))
  453. +                   player.getAI().tryToFollow(target, false);
  454. +           }
  455. +       }
  456. +       else
  457. +       {
  458. +           if (player.isSummonAttack() && player.getSummon() != null)
  459. +           {
  460. +               // Siege Golem's
  461. +               if (player.getSummon().getNpcId() >= 14702 && player.getSummon().getNpcId() <= 14798 || player.getSummon().getNpcId() >= 14839 && player.getSummon().getNpcId() <= 14869)
  462. +                   return;
  463. +
  464. +               Summon activeSummon = player.getSummon();
  465. +               activeSummon.setTarget(target);
  466. +               activeSummon.getAI().tryToAttack(target);
  467. +
  468. +               int[] summonAttackSkills = {4261, 4068, 4137, 4260, 4708, 4709, 4710, 4712, 5135, 5138, 5141, 5442, 5444, 6095, 6096, 6041, 6044};
  469. +               if (Rnd.get(100) < player.getSummonSkillPercent())
  470. +               {
  471. +                   for (int skillId : summonAttackSkills)
  472. +                   {
  473. +                       useMagicSkillBySummon(skillId, target);
  474. +                   }
  475. +               }
  476. +           }
  477. +       }
  478. +   }
  479. +
  480. +   private void useMagicSkillBySummon(int skillId, WorldObject target)
  481. +   {
  482. +       // No owner, or owner in shop mode.
  483. +       if (player == null || player.isInStoreMode())
  484. +           return;
  485. +      
  486. +       final Summon activeSummon = player.getSummon();
  487. +       if (activeSummon == null)
  488. +           return;
  489. +      
  490. +       // Pet which is 20 levels higher than owner.
  491. +       if (activeSummon instanceof Pet && activeSummon.getStatus().getLevel() - player.getStatus().getLevel() > 20)
  492. +       {
  493. +           player.sendPacket(SystemMessageId.PET_TOO_HIGH_TO_CONTROL);
  494. +           return;
  495. +       }
  496. +      
  497. +       // Out of control pet.
  498. +       if (activeSummon.isOutOfControl())
  499. +       {
  500. +           player.sendPacket(SystemMessageId.PET_REFUSING_ORDER);
  501. +           return;
  502. +       }
  503. +      
  504. +       // Verify if the launched skill is mastered by the summon.
  505. +       final L2Skill skill = activeSummon.getSkill(skillId);
  506. +       if (skill == null)
  507. +           return;
  508. +      
  509. +       // Can't launch offensive skills on owner.
  510. +       if (skill.isOffensive() && player == target)
  511. +           return;
  512. +      
  513. +       activeSummon.setTarget(target);
  514. +       activeSummon.getAI().tryToCast(committedTarget, skill);
  515. +   }
  516. +
  517. +
  518. +
  519. +   public void targetEligibleCreature() {
  520. +       if (player.getTarget() == null) {
  521. +           selectNewTarget(); // Llamada a selectNewTarget si el jugador no tiene un objetivo
  522. +           return;
  523. +       }
  524. +
  525. +       if (committedTarget != null) {
  526. +           if (/*!isSameInstance(player, committedTarget) ||*/ (committedTarget.isDead() && GeoEngine.getInstance().canSeeTarget(player, committedTarget))) {
  527. +               committedTarget = null;
  528. +               selectNewTarget(); // Llamada a selectNewTarget después de que el objetivo actual muere o es de otra instancia
  529. +               return;
  530. +           } else if (!committedTarget.isDead() && GeoEngine.getInstance().canSeeTarget(player, committedTarget)) {
  531. +               attack();
  532. +               return;
  533. +           } else if (!GeoEngine.getInstance().canSeeTarget(player, committedTarget)) {
  534. +               committedTarget = null;
  535. +               selectNewTarget(); // Buscar otro objetivo si el jugador no puede ver al objetivo actual
  536. +               return;
  537. +           }
  538. +           player.getAI().tryToFollow(committedTarget, false);
  539. +           committedTarget = null;
  540. +           player.setTarget(null);
  541. +       }
  542. +      
  543. +       if (committedTarget instanceof Summon)
  544. +           return;
  545. +          
  546. +       List<Monster> targets = getKnownMonstersInRadius(player, player.getRadius(), creature -> GeoEngine.getInstance().canMoveToTarget(player.getX(), player.getY(), player.getZ(), creature.getX(), creature.getY(), creature.getZ()) && !player.ignoredMonsterContain(creature.getNpcId()) && !creature.isRaidRelated() && !creature.isRaidBoss() && !creature.isDead() && !(creature instanceof Chest) && !(player.isAntiKsProtected() && creature.getTarget() != null && creature.getTarget() != player && creature.getTarget() != player.getSummon()) /*&& isSameInstance(player, creature)*/);
  547. +
  548. +       if (targets.isEmpty())
  549. +           return;
  550. +
  551. +       Monster closestTarget = targets.stream().min((o1, o2) -> Integer.compare((int) Math.sqrt(player.distance2D(o1)), (int) Math.sqrt(player.distance2D(o2)))).get();
  552. +
  553. +       committedTarget = closestTarget;
  554. +       player.setTarget(closestTarget);
  555. +   }
  556. +
  557. +
  558. +   // Función para verificar si dos objetos pertenecen a la misma instancia
  559. +/* private static boolean isSameInstance(WorldObject obj1, WorldObject obj2)
  560. +   {
  561. +       return obj1.getInstanceId2() == obj2.getInstanceId2();
  562. +   }*/
  563. +
  564. +   // Función para seleccionar un nuevo objetivo
  565. +   private void selectNewTarget()
  566. +   {
  567. +       List<Monster> targets = getKnownMonstersInRadius(player, player.getRadius(), creature -> GeoEngine.getInstance().canMoveToTarget(player.getX(), player.getY(), player.getZ(), creature.getX(), creature.getY(), creature.getZ()) && !player.ignoredMonsterContain(creature.getNpcId()) && !creature.isRaidRelated() && !creature.isRaidBoss() && !creature.isDead() && !(creature instanceof Chest) && !(player.isAntiKsProtected() && creature.getTarget() != null && creature.getTarget() != player && creature.getTarget() != player.getSummon()) /*&& isSameInstance(player, creature)*/);
  568. +
  569. +       if (targets.isEmpty())
  570. +           return;
  571. +
  572. +       Monster closestTarget = targets.stream().min((o1, o2) -> Integer.compare((int) Math.sqrt(player.distance2D(o1)), (int) Math.sqrt(player.distance2D(o2)))).get();
  573. +
  574. +       committedTarget = closestTarget;
  575. +       player.setTarget(closestTarget);
  576. +   }
  577. +
  578. +
  579. +
  580. +
  581. +   public final static List<Monster> getKnownMonstersInRadius(Player player, int radius, Function<Monster, Boolean> condition)
  582. +   {
  583. +       final WorldRegion region = player.getRegion();
  584. +       if (region == null)
  585. +           return Collections.emptyList();
  586. +
  587. +       final List<Monster> result = new ArrayList<>();
  588. +
  589. +       for (WorldRegion reg : region.getSurroundingRegions())
  590. +       {
  591. +           for (WorldObject obj : reg.getObjects())
  592. +           {
  593. +               if (!(obj instanceof Monster) || !MathUtil.checkIfInRange(radius, player, obj, true) || !condition.apply((Monster) obj))
  594. +                   continue;
  595. +
  596. +               result.add((Monster) obj);
  597. +           }
  598. +       }
  599. +
  600. +       return result;
  601. +   }
  602. +
  603. +   public Monster getMonsterTarget()
  604. +   {
  605. +       if(!(player.getTarget() instanceof Monster))
  606. +       {
  607. +           return null;
  608. +       }
  609. +
  610. +       return (Monster)player.getTarget();
  611. +   }
  612. +
  613. +  
  614. +
  615. +   private void calculatePotions()
  616. +   {
  617. +       if (percentageHpIsLessThan() < player.getHpPotionPercentage())
  618. +           forceUseItem(1539);
  619. +
  620. +       if (percentageMpIsLessThan() < player.getMpPotionPercentage())
  621. +           forceUseItem(728);
  622. +   }  
  623. +
  624. +   private void forceUseItem(int itemId)
  625. +   {
  626. +       final ItemInstance potion = player.getInventory().getItemByItemId(itemId);
  627. +       if (potion == null)
  628. +           return;
  629. +
  630. +       final IItemHandler handler = ItemHandler.getInstance().getHandler(potion.getEtcItem());
  631. +       if (handler != null)
  632. +           handler.useItem(player, potion, false);
  633. +   }  
  634. +}
  635. \ No newline at end of file
  636. diff --git java/Base/AutoFarm/AutofarmSpell.java java/Base/AutoFarm/AutofarmSpell.java
  637. new file mode 100644
  638. index 0000000..beefc8d
  639. --- /dev/null
  640. +++ java/Base/AutoFarm/AutofarmSpell.java
  641. @@ -0,0 +1,20 @@
  642. +package Base.AutoFarm;
  643. +
  644. +public class AutofarmSpell {
  645. +   private final Integer _skillId;
  646. +   private final AutofarmSpellType _spellType;
  647. +  
  648. +   public AutofarmSpell(Integer skillId, AutofarmSpellType spellType){
  649. +      
  650. +       _skillId = skillId;
  651. +       _spellType = spellType;
  652. +   }
  653. +  
  654. +   public Integer getSkillId() {
  655. +       return _skillId;
  656. +   }
  657. +  
  658. +   public AutofarmSpellType getSpellType() {
  659. +       return _spellType;
  660. +   }
  661. +}
  662. \ No newline at end of file
  663. diff --git java/Base/AutoFarm/AutofarmSpellType.java java/Base/AutoFarm/AutofarmSpellType.java
  664. new file mode 100644
  665. index 0000000..2ec3039
  666. --- /dev/null
  667. +++ java/Base/AutoFarm/AutofarmSpellType.java
  668. @@ -0,0 +1,8 @@
  669. +package Base.AutoFarm;
  670. +
  671. +public enum AutofarmSpellType
  672. +{
  673. +    Attack,
  674. +    Chance,
  675. +    LowLife    
  676. +}
  677. \ No newline at end of file
  678. diff --git java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java
  679. index 6e1e2ac..7dc1b59 100644
  680. --- java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java
  681. +++ java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java
  682. @@ -3,6 +3,7 @@
  683.  import java.util.HashMap;
  684.  import java.util.Map;
  685.  
  686. +import net.sf.l2j.gameserver.handler.voicedcommandhandlers.AutoFarm;
  687.  import net.sf.l2j.gameserver.handler.voicedcommandhandlers.Epic;
  688.  import net.sf.l2j.gameserver.handler.voicedcommandhandlers.EventCommand;
  689.  import net.sf.l2j.gameserver.handler.voicedcommandhandlers.Menu;
  690. @@ -18,6 +19,7 @@
  691.    
  692.     protected VoicedCommandHandler()
  693.     {
  694. +       registerHandler(new AutoFarm());
  695.         registerHandler(new Epic());
  696.         registerHandler(new Online());
  697.         registerHandler(new Menu());
  698. diff --git java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/AutoFarm.java java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/AutoFarm.java
  699. new file mode 100644
  700. index 0000000..3e10933
  701. --- /dev/null
  702. +++ java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/AutoFarm.java
  703. @@ -0,0 +1,324 @@
  704. +package net.sf.l2j.gameserver.handler.voicedcommandhandlers;
  705. +
  706. +import java.util.StringTokenizer;
  707. +
  708. +import net.sf.l2j.commons.lang.StringUtil;
  709. +
  710. +import net.sf.l2j.gameserver.handler.IVoicedCommandHandler;
  711. +import net.sf.l2j.gameserver.model.WorldObject;
  712. +import net.sf.l2j.gameserver.model.actor.Player;
  713. +import net.sf.l2j.gameserver.model.actor.instance.Monster;
  714. +
  715. +import net.sf.l2j.gameserver.network.SystemMessageId;
  716. +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage;
  717. +import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
  718. +import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
  719. +
  720. +import Base.AutoFarm.AutofarmPlayerRoutine;
  721. +
  722. +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS;
  723. +
  724. +public class AutoFarm implements IVoicedCommandHandler
  725. +{
  726. +    private final String[] VOICED_COMMANDS =
  727. +    {
  728. +       "autofarm",
  729. +       "enableAutoFarm",
  730. +       "radiusAutoFarm",
  731. +       "pageAutoFarm",
  732. +       "enableBuffProtect",
  733. +       "healAutoFarm",
  734. +       "hpAutoFarm",
  735. +       "mpAutoFarm",
  736. +       "enableAntiKs",
  737. +       "enableSummonAttack",
  738. +       "summonSkillAutoFarm",
  739. +       "ignoreMonster",
  740. +       "activeMonster"
  741. +    };
  742. +
  743. +    @Override
  744. +    public boolean useVoicedCommand(final String command, final Player activeChar, final String args)
  745. +    {
  746. +       final AutofarmPlayerRoutine bot = activeChar.getBot();
  747. +      
  748. +       if (command.startsWith("autofarm"))
  749. +           showAutoFarm(activeChar);
  750. +      
  751. +       if (command.startsWith("radiusAutoFarm"))
  752. +       {
  753. +           StringTokenizer st = new StringTokenizer(command, " ");
  754. +           st.nextToken();
  755. +           try
  756. +           {
  757. +               String param = st.nextToken();
  758. +
  759. +               if (param.startsWith("inc_radius"))
  760. +               {
  761. +                   activeChar.setRadius(activeChar.getRadius() + 200);
  762. +                   showAutoFarm(activeChar);
  763. +               }
  764. +               else if (param.startsWith("dec_radius"))
  765. +               {
  766. +                   activeChar.setRadius(activeChar.getRadius() - 200);
  767. +                   showAutoFarm(activeChar);
  768. +               }
  769. +               activeChar.saveAutoFarmSettings();
  770. +           }
  771. +           catch (Exception e)
  772. +           {
  773. +               e.printStackTrace();
  774. +           }
  775. +       }
  776. +      
  777. +       if (command.startsWith("pageAutoFarm"))
  778. +       {
  779. +           StringTokenizer st = new StringTokenizer(command, " ");
  780. +           st.nextToken();
  781. +           try
  782. +           {
  783. +               String param = st.nextToken();
  784. +
  785. +               if (param.startsWith("inc_page"))
  786. +               {
  787. +                   activeChar.setPage(activeChar.getPage() + 1);
  788. +                   showAutoFarm(activeChar);
  789. +               }
  790. +               else if (param.startsWith("dec_page"))
  791. +               {
  792. +                   activeChar.setPage(activeChar.getPage() - 1);
  793. +                   showAutoFarm(activeChar);
  794. +               }
  795. +               activeChar.saveAutoFarmSettings();
  796. +           }
  797. +           catch (Exception e)
  798. +           {
  799. +               e.printStackTrace();
  800. +           }
  801. +       }
  802. +      
  803. +       if (command.startsWith("healAutoFarm"))
  804. +       {
  805. +           StringTokenizer st = new StringTokenizer(command, " ");
  806. +           st.nextToken();
  807. +           try
  808. +           {
  809. +               String param = st.nextToken();
  810. +
  811. +               if (param.startsWith("inc_heal"))
  812. +               {
  813. +                   activeChar.setHealPercent(activeChar.getHealPercent() + 10);
  814. +                   showAutoFarm(activeChar);
  815. +               }
  816. +               else if (param.startsWith("dec_heal"))
  817. +               {
  818. +                   activeChar.setHealPercent(activeChar.getHealPercent() - 10);
  819. +                   showAutoFarm(activeChar);
  820. +               }
  821. +               activeChar.saveAutoFarmSettings();
  822. +           }
  823. +           catch (Exception e)
  824. +           {
  825. +               e.printStackTrace();
  826. +           }
  827. +       }
  828. +      
  829. +       if (command.startsWith("hpAutoFarm"))
  830. +       {
  831. +           StringTokenizer st = new StringTokenizer(command, " ");
  832. +           st.nextToken();
  833. +           try
  834. +           {
  835. +               String param = st.nextToken();
  836. +
  837. +               if (param.contains("inc_hp_pot"))
  838. +               {
  839. +                   activeChar.setHpPotionPercentage(activeChar.getHpPotionPercentage() + 5);
  840. +                   showAutoFarm(activeChar);
  841. +               }
  842. +               else if (param.contains("dec_hp_pot"))
  843. +               {
  844. +                   activeChar.setHpPotionPercentage(activeChar.getHpPotionPercentage() - 5);
  845. +                   showAutoFarm(activeChar);
  846. +               }
  847. +               activeChar.saveAutoFarmSettings();
  848. +           }
  849. +           catch (Exception e)
  850. +           {
  851. +               e.printStackTrace();
  852. +           }
  853. +       }
  854. +      
  855. +       if (command.startsWith("mpAutoFarm"))
  856. +       {
  857. +           StringTokenizer st = new StringTokenizer(command, " ");
  858. +           st.nextToken();
  859. +           try
  860. +           {
  861. +               String param = st.nextToken();
  862. +
  863. +               if (param.contains("inc_mp_pot"))
  864. +               {
  865. +                   activeChar.setMpPotionPercentage(activeChar.getMpPotionPercentage() + 5);
  866. +                   showAutoFarm(activeChar);
  867. +               }
  868. +               else if (param.contains("dec_mp_pot"))
  869. +               {
  870. +                   activeChar.setMpPotionPercentage(activeChar.getMpPotionPercentage() - 5);
  871. +                   showAutoFarm(activeChar);
  872. +               }
  873. +               activeChar.saveAutoFarmSettings();
  874. +           }
  875. +           catch (Exception e)
  876. +           {
  877. +               e.printStackTrace();
  878. +           }
  879. +       }
  880. +      
  881. +       if (command.startsWith("enableAutoFarm"))
  882. +       {
  883. +           if (activeChar.isAutoFarm())
  884. +           {
  885. +               bot.stop();
  886. +               activeChar.setAutoFarm(false);
  887. +           }
  888. +           else
  889. +           {
  890. +               bot.start();
  891. +               activeChar.setAutoFarm(true);
  892. +           }
  893. +
  894. +           showAutoFarm(activeChar);
  895. +       }
  896. +      
  897. +       if (command.startsWith("enableBuffProtect"))
  898. +       {
  899. +           activeChar.setNoBuffProtection(!activeChar.isNoBuffProtected());
  900. +           showAutoFarm(activeChar);
  901. +           activeChar.saveAutoFarmSettings();
  902. +       }
  903. +      
  904. +       if (command.startsWith("enableAntiKs"))
  905. +       {
  906. +           activeChar.setAntiKsProtection(!activeChar.isAntiKsProtected());
  907. +          
  908. +           if(activeChar.isAntiKsProtected()) {
  909. +               activeChar.sendPacket(new SystemMessage(SystemMessageId.ACTIVATE_RESPECT_HUNT));
  910. +               activeChar.sendPacket(new ExShowScreenMessage("Respct Hunt On" , 3*1000, SMPOS.TOP_CENTER, false));
  911. +           }else {
  912. +               activeChar.sendPacket(new SystemMessage(SystemMessageId.DESACTIVATE_RESPECT_HUNT));
  913. +               activeChar.sendPacket(new ExShowScreenMessage("Respct Hunt Off" , 3*1000, SMPOS.TOP_CENTER, false));
  914. +           }
  915. +          
  916. +           activeChar.saveAutoFarmSettings();
  917. +           showAutoFarm(activeChar);
  918. +       }
  919. +      
  920. +       if (command.startsWith("enableSummonAttack"))
  921. +       {
  922. +           activeChar.setSummonAttack(!activeChar.isSummonAttack());
  923. +           if(activeChar.isSummonAttack()) {
  924. +               activeChar.sendPacket(new SystemMessage(SystemMessageId.ACTIVATE_SUMMON_ACTACK));
  925. +               activeChar.sendPacket(new ExShowScreenMessage("Auto Farm Summon Attack On" , 3*1000, SMPOS.TOP_CENTER, false));
  926. +           }else {
  927. +               activeChar.sendPacket(new SystemMessage(SystemMessageId.DESACTIVATE_SUMMON_ACTACK));
  928. +               activeChar.sendPacket(new ExShowScreenMessage("Auto Farm Summon Attack Off" , 3*1000, SMPOS.TOP_CENTER, false));
  929. +           }
  930. +           activeChar.saveAutoFarmSettings();
  931. +           showAutoFarm(activeChar);
  932. +       }
  933. +      
  934. +       if (command.startsWith("summonSkillAutoFarm"))
  935. +       {
  936. +           StringTokenizer st = new StringTokenizer(command, " ");
  937. +           st.nextToken();
  938. +           try
  939. +           {
  940. +               String param = st.nextToken();
  941. +
  942. +               if (param.startsWith("inc_summonSkill"))
  943. +               {
  944. +                   activeChar.setSummonSkillPercent(activeChar.getSummonSkillPercent() + 10);
  945. +                   showAutoFarm(activeChar);
  946. +               }
  947. +               else if (param.startsWith("dec_summonSkill"))
  948. +               {
  949. +                   activeChar.setSummonSkillPercent(activeChar.getSummonSkillPercent() - 10);
  950. +                   showAutoFarm(activeChar);
  951. +               }
  952. +               activeChar.saveAutoFarmSettings();
  953. +           }
  954. +           catch (Exception e)
  955. +           {
  956. +               e.printStackTrace();
  957. +           }
  958. +       }
  959. +      
  960. +       if (command.startsWith("ignoreMonster"))
  961. +       {
  962. +           int monsterId = 0;
  963. +           WorldObject target = activeChar.getTarget();
  964. +           if (target instanceof Monster)
  965. +               monsterId = ((Monster) target).getNpcId();
  966. +          
  967. +           if (target == null)
  968. +           {
  969. +               activeChar.sendMessage("You dont have a target");
  970. +               return false;
  971. +           }
  972. +          
  973. +           activeChar.sendMessage(target.getName() + " has been added to the ignore list.");
  974. +           activeChar.ignoredMonster(monsterId);
  975. +       }
  976. +      
  977. +       if (command.startsWith("activeMonster"))
  978. +       {
  979. +           int monsterId = 0;
  980. +           WorldObject target = activeChar.getTarget();
  981. +           if (target instanceof Monster)
  982. +               monsterId = ((Monster) target).getNpcId();
  983. +          
  984. +           if (target == null)
  985. +           {
  986. +               activeChar.sendMessage("You dont have a target");
  987. +               return false;
  988. +           }
  989. +          
  990. +           activeChar.sendMessage(target.getName() + " has been removed from the ignore list.");
  991. +           activeChar.activeMonster(monsterId);
  992. +       }
  993. +      
  994. +        return false;
  995. +    }
  996. +    
  997. +   private static final String ACTIVED = "<font color=00FF00>STARTED</font>";
  998. +   private static final String DESATIVED = "<font color=FF0000>STOPPED</font>";
  999. +   private static final String STOP = "STOP";
  1000. +   private static final String START = "START";
  1001. +  
  1002. +   public static void showAutoFarm(Player activeChar)
  1003. +   {
  1004. +       NpcHtmlMessage html = new NpcHtmlMessage(0);
  1005. +      
  1006. +       html.setFile(activeChar.getLocale(), "html/mods/menu/AutoFarm.htm");
  1007. +       html.replace("%player%", activeChar.getName());
  1008. +       html.replace("%page%", StringUtil.formatNumber(activeChar.getPage() + 1));
  1009. +       html.replace("%heal%", StringUtil.formatNumber(activeChar.getHealPercent()));
  1010. +       html.replace("%radius%", StringUtil.formatNumber(activeChar.getRadius()));
  1011. +       html.replace("%summonSkill%", StringUtil.formatNumber(activeChar.getSummonSkillPercent()));
  1012. +       html.replace("%hpPotion%", StringUtil.formatNumber(activeChar.getHpPotionPercentage()));
  1013. +       html.replace("%mpPotion%", StringUtil.formatNumber(activeChar.getMpPotionPercentage()));
  1014. +       html.replace("%noBuff%", activeChar.isNoBuffProtected() ? "back=L2UI.CheckBox_checked fore=L2UI.CheckBox_checked" : "back=L2UI.CheckBox fore=L2UI.CheckBox");
  1015. +       html.replace("%summonAtk%", activeChar.isSummonAttack() ? "back=L2UI.CheckBox_checked fore=L2UI.CheckBox_checked" : "back=L2UI.CheckBox fore=L2UI.CheckBox");
  1016. +       html.replace("%antiKs%", activeChar.isAntiKsProtected() ? "back=L2UI.CheckBox_checked fore=L2UI.CheckBox_checked" : "back=L2UI.CheckBox fore=L2UI.CheckBox");
  1017. +       html.replace("%autofarm%", activeChar.isAutoFarm() ? ACTIVED : DESATIVED);
  1018. +       html.replace("%button%", activeChar.isAutoFarm() ? STOP : START);
  1019. +       activeChar.sendPacket(html);
  1020. +   }
  1021. +
  1022. +    @Override
  1023. +    public String[] getVoicedCommandList()
  1024. +    {
  1025. +        return VOICED_COMMANDS;
  1026. +    }
  1027. +}
  1028. \ No newline at end of file
  1029. diff --git java/net/sf/l2j/gameserver/model/actor/Npc.java java/net/sf/l2j/gameserver/model/actor/Npc.java
  1030. index 75120d5..40051ec 100644
  1031. --- java/net/sf/l2j/gameserver/model/actor/Npc.java
  1032. +++ java/net/sf/l2j/gameserver/model/actor/Npc.java
  1033. @@ -81,6 +81,8 @@
  1034.  import net.sf.l2j.gameserver.taskmanager.AiTaskManager;
  1035.  import net.sf.l2j.gameserver.taskmanager.DecayTaskManager;
  1036.  
  1037. +import Base.AutoFarm.AutofarmPlayerRoutine;
  1038. +
  1039.  /**
  1040.   * An instance type extending {@link Creature}, which represents a Non Playable Character (or NPC) in the world.
  1041.   */
  1042. @@ -1366,7 +1368,7 @@
  1043.     {
  1044.         if (!isTeleportAllowed(player))
  1045.             return;
  1046. -      
  1047. +       final AutofarmPlayerRoutine bot = player.getBot();
  1048.         final List<Location> teleports = InstantTeleportData.getInstance().getTeleports(getNpcId());
  1049.         if (teleports == null || index > teleports.size())
  1050.             return;
  1051. @@ -1376,6 +1378,11 @@
  1052.             return;
  1053.        
  1054.         player.teleportTo(teleport, 20);
  1055. +       if (player.isAutoFarm())
  1056. +        {
  1057. +            bot.stop();
  1058. +            player.setAutoFarm(false);
  1059. +        }
  1060.     }
  1061.    
  1062.     /**
  1063. @@ -1398,6 +1405,9 @@
  1064.         if (teleport == null)
  1065.             return;
  1066.        
  1067. +      
  1068. +       final AutofarmPlayerRoutine bot = player.getBot();
  1069. +      
  1070.         if (teleport.getCastleId() > 0)
  1071.         {
  1072.             final Castle castle = CastleManager.getInstance().getCastleById(teleport.getCastleId());
  1073. @@ -1411,6 +1421,12 @@
  1074.         if (Config.FREE_TELEPORT && player.getStatus().getLevel() <= Config.LVL_FREE_TELEPORT || teleport.getPriceCount() == 0 || player.destroyItemByItemId("InstantTeleport", teleport.getPriceId(), teleport.getCalculatedPriceCount(player), this, true))
  1075.             player.teleportTo(teleport, 20);
  1076.        
  1077. +       if (player.isAutoFarm())
  1078. +                      {
  1079. +                          bot.stop();
  1080. +                          player.setAutoFarm(false);
  1081. +                      }
  1082. +      
  1083.         player.sendPacket(ActionFailed.STATIC_PACKET);
  1084.     }
  1085.    
  1086. diff --git java/net/sf/l2j/gameserver/model/actor/Player.java java/net/sf/l2j/gameserver/model/actor/Player.java
  1087. index df09dcb..ddfcb84 100644
  1088. --- java/net/sf/l2j/gameserver/model/actor/Player.java
  1089. +++ java/net/sf/l2j/gameserver/model/actor/Player.java
  1090. @@ -34,7 +34,9 @@
  1091.  import net.sf.l2j.commons.util.ArraysUtil;
  1092.  
  1093.  import net.sf.l2j.Config;
  1094. +
  1095.  import net.sf.l2j.gameserver.LoginServerThread;
  1096. +
  1097.  import net.sf.l2j.gameserver.communitybbs.CommunityBoard;
  1098.  import net.sf.l2j.gameserver.communitybbs.model.Forum;
  1099.  import net.sf.l2j.gameserver.data.SkillTable;
  1100. @@ -240,6 +242,8 @@
  1101.  import net.sf.l2j.gameserver.taskmanager.ShadowItemTaskManager;
  1102.  import net.sf.l2j.gameserver.taskmanager.WaterTaskManager;
  1103.  
  1104. +import Base.AutoFarm.AutofarmPlayerRoutine;
  1105. +
  1106.  /**
  1107.   * This class represents a player in the world.<br>
  1108.   * There is always a client-thread connected to this (except if a player-store is activated upon logout).
  1109. @@ -6386,6 +6390,8 @@
  1110.     {
  1111.         super.deleteMe();
  1112.        
  1113. +        _bot.stop();
  1114. +      
  1115.         if (getMountType() == 2 && isInsideZone(ZoneId.NO_LANDING))
  1116.             teleportTo(RestartType.TOWN);
  1117.        
  1118. @@ -6457,6 +6463,8 @@
  1119.             // Remove the Player from the world
  1120.             decayMe();
  1121.            
  1122. +           _bot.stop();
  1123. +          
  1124.             // If a party is in progress, leave it
  1125.             if (_party != null)
  1126.                 _party.removePartyMember(this, MessageType.DISCONNECTED);
  1127. @@ -7738,4 +7746,228 @@
  1128.     {
  1129.         return _selectedBlocksList;
  1130.     }
  1131. +
  1132. +  
  1133. +   // ------------
  1134. +   // Autofarm
  1135. +   // ------------
  1136. +
  1137. +   private boolean _autoFarm;
  1138. +  
  1139. +   public void setAutoFarm(boolean comm)
  1140. +   {
  1141. +       _autoFarm = comm;
  1142. +   }
  1143. +
  1144. +   public boolean isAutoFarm()
  1145. +   {
  1146. +       return _autoFarm;
  1147. +   }
  1148. +  
  1149. +   private int autoFarmRadius = 1200;
  1150. +  
  1151. +   public void setRadius(int value)
  1152. +   {
  1153. +       autoFarmRadius = MathUtil.limit(value, 200, 3000);
  1154. +   }
  1155. +  
  1156. +   public int getRadius()
  1157. +   {
  1158. +       return autoFarmRadius;
  1159. +   }
  1160. +  
  1161. +   private int autoFarmShortCut = 9;
  1162. +  
  1163. +   public void setPage(int value)
  1164. +   {
  1165. +       autoFarmShortCut = MathUtil.limit(value, 0, 9);
  1166. +   }
  1167. +  
  1168. +   public int getPage()
  1169. +   {
  1170. +       return autoFarmShortCut;
  1171. +   }
  1172. +  
  1173. +   private int autoFarmHealPercente = 30;
  1174. +  
  1175. +   public void setHealPercent(int value)
  1176. +   {
  1177. +       autoFarmHealPercente = MathUtil.limit(value, 20, 90);
  1178. +   }
  1179. +  
  1180. +   public int getHealPercent()
  1181. +   {
  1182. +       return autoFarmHealPercente;
  1183. +   }
  1184. +  
  1185. +   private boolean autoFarmBuffProtection = false;
  1186. +  
  1187. +   public void setNoBuffProtection(boolean val)
  1188. +   {
  1189. +       autoFarmBuffProtection = val;
  1190. +   }
  1191. +  
  1192. +   public boolean isNoBuffProtected()
  1193. +   {
  1194. +       return autoFarmBuffProtection;
  1195. +   }
  1196. +  
  1197. +   private boolean autoAntiKsProtection = false;
  1198. +  
  1199. +   public void setAntiKsProtection(boolean val)
  1200. +   {
  1201. +       autoAntiKsProtection = val;
  1202. +   }
  1203. +  
  1204. +   public boolean isAntiKsProtected()
  1205. +   {
  1206. +       return autoAntiKsProtection;
  1207. +   }
  1208. +  
  1209. +   private boolean autoFarmSummonAttack = false;
  1210. +  
  1211. +   public void setSummonAttack(boolean val)
  1212. +   {
  1213. +       autoFarmSummonAttack = val;
  1214. +   }
  1215. +  
  1216. +   public boolean isSummonAttack()
  1217. +   {
  1218. +       return autoFarmSummonAttack;
  1219. +   }
  1220. +  
  1221. +   private int autoFarmSummonSkillPercente = 0;
  1222. +  
  1223. +   public void setSummonSkillPercent(int value)
  1224. +   {
  1225. +       autoFarmSummonSkillPercente = MathUtil.limit(value, 0, 90);
  1226. +   }
  1227. +  
  1228. +   public int getSummonSkillPercent()
  1229. +   {
  1230. +       return autoFarmSummonSkillPercente;
  1231. +   }
  1232. +
  1233. +   private int hpPotionPercent = 60;
  1234. +   private int mpPotionPercent = 60;
  1235. +
  1236. +   public void setHpPotionPercentage(int value)
  1237. +   {
  1238. +       hpPotionPercent = MathUtil.limit(value, 0, 100);
  1239. +   }
  1240. +
  1241. +   public int getHpPotionPercentage()
  1242. +   {
  1243. +       return hpPotionPercent;
  1244. +   }
  1245. +
  1246. +   public void setMpPotionPercentage(int value)
  1247. +   {
  1248. +       mpPotionPercent = MathUtil.limit(value, 0, 100);
  1249. +   }
  1250. +
  1251. +   public int getMpPotionPercentage()
  1252. +   {
  1253. +       return mpPotionPercent;
  1254. +   }
  1255. +
  1256. +   private List<Integer> _ignoredMonster = new ArrayList<>();
  1257. +
  1258. +   public void ignoredMonster(Integer npcId)
  1259. +   {
  1260. +       _ignoredMonster.add(npcId);
  1261. +   }
  1262. +
  1263. +   public void activeMonster(Integer npcId)
  1264. +   {
  1265. +       if (_ignoredMonster.contains(npcId))
  1266. +           _ignoredMonster.remove(npcId);
  1267. +   }
  1268. +
  1269. +   public boolean ignoredMonsterContain(int npcId)
  1270. +   {
  1271. +       return _ignoredMonster.contains(npcId);
  1272. +   }
  1273. +
  1274. +   private AutofarmPlayerRoutine _bot = new AutofarmPlayerRoutine(this);
  1275. +  
  1276. +   public AutofarmPlayerRoutine getBot()
  1277. +   {
  1278. +       if (_bot == null)
  1279. +           _bot = new AutofarmPlayerRoutine(this);
  1280. +      
  1281. +       return _bot;
  1282. +   }
  1283. +  
  1284. +  
  1285. +   public String getIP()
  1286. +   {
  1287. +       if (getClient().getConnection() == null)
  1288. +           return "N/A IP";
  1289. +       return getClient().getConnection().getInetAddress().getHostAddress();
  1290. +   }
  1291. +  
  1292. +  
  1293. +  
  1294. +    // Función para guardar los valores del autofarm en la base de datos
  1295. +    public void saveAutoFarmSettings() {
  1296. +        try (Connection con = ConnectionPool.getConnection()) {
  1297. +            String updateSql = "REPLACE INTO character_autofarm (char_id, char_name,  radius, short_cut, heal_percent, buff_protection, anti_ks_protection, summon_attack, summon_skill_percent, hp_potion_percent, mp_potion_percent) VALUES (?, ?, ?,  ?, ?, ?, ?, ?, ?, ?, ?)";
  1298. +            try (PreparedStatement updateStatement = con.prepareStatement(updateSql)) {
  1299. +                updateStatement.setInt(1, getObjectId()); // char_id
  1300. +                updateStatement.setString(2, getName()); // char_name
  1301. +              
  1302. +                updateStatement.setInt(3, autoFarmRadius);
  1303. +                updateStatement.setInt(4, autoFarmShortCut);
  1304. +                updateStatement.setInt(5, autoFarmHealPercente);
  1305. +                updateStatement.setBoolean(6, autoFarmBuffProtection);
  1306. +                updateStatement.setBoolean(7, autoAntiKsProtection);
  1307. +                updateStatement.setBoolean(8, autoFarmSummonAttack);
  1308. +                updateStatement.setInt(9, autoFarmSummonSkillPercente);
  1309. +                updateStatement.setInt(10, hpPotionPercent);
  1310. +                updateStatement.setInt(11, mpPotionPercent);
  1311. +                updateStatement.executeUpdate();
  1312. +            }
  1313. +        } catch (SQLException e) {
  1314. +            e.printStackTrace();
  1315. +        }
  1316. +    }
  1317. +
  1318. +    public void loadAutoFarmSettings() {
  1319. +        try (Connection con = ConnectionPool.getConnection()) {
  1320. +            String selectSql = "SELECT * FROM character_autofarm WHERE char_id = ?";
  1321. +            try (PreparedStatement selectStatement = con.prepareStatement(selectSql)) {
  1322. +                selectStatement.setInt(1, getObjectId()); // char_id
  1323. +                try (ResultSet resultSet = selectStatement.executeQuery()) {
  1324. +                    if (resultSet.next()) {
  1325. +                      
  1326. +                        autoFarmRadius = resultSet.getInt("radius");
  1327. +                        autoFarmShortCut = resultSet.getInt("short_cut");
  1328. +                        autoFarmHealPercente = resultSet.getInt("heal_percent");
  1329. +                        autoFarmBuffProtection = resultSet.getBoolean("buff_protection");
  1330. +                        autoAntiKsProtection = resultSet.getBoolean("anti_ks_protection");
  1331. +                        autoFarmSummonAttack = resultSet.getBoolean("summon_attack");
  1332. +                        autoFarmSummonSkillPercente = resultSet.getInt("summon_skill_percent");
  1333. +                        hpPotionPercent = resultSet.getInt("hp_potion_percent");
  1334. +                        mpPotionPercent = resultSet.getInt("mp_potion_percent");
  1335. +                    } else {
  1336. +                        // Si no se encontraron registros, cargar valores predeterminados
  1337. +                      
  1338. +                        autoFarmRadius = 1200;
  1339. +                        autoFarmShortCut = 9;
  1340. +                        autoFarmHealPercente = 30;
  1341. +                        autoFarmBuffProtection = false;
  1342. +                        autoAntiKsProtection = false;
  1343. +                        autoFarmSummonAttack = false;
  1344. +                        autoFarmSummonSkillPercente = 0;
  1345. +                        hpPotionPercent = 60;
  1346. +                        mpPotionPercent = 60;
  1347. +                    }
  1348. +                }
  1349. +            }
  1350. +        } catch (SQLException e) {
  1351. +            e.printStackTrace();
  1352. +        }
  1353. +    }
  1354. +
  1355.  }
  1356. \ No newline at end of file
  1357. diff --git java/net/sf/l2j/gameserver/network/SystemMessageId.java java/net/sf/l2j/gameserver/network/SystemMessageId.java
  1358. index 3e0e45e..12cf8b2 100644
  1359. --- java/net/sf/l2j/gameserver/network/SystemMessageId.java
  1360. +++ java/net/sf/l2j/gameserver/network/SystemMessageId.java
  1361. @@ -11796,6 +11796,17 @@
  1362.      */
  1363.     public static final SystemMessageId PLEASE_WAIT_A_MOMENT;
  1364.    
  1365. +   public static final SystemMessageId DESACTIVATE_SUMMON_ACTACK; 
  1366. +   public static final SystemMessageId ACTIVATE_RESPECT_HUNT;
  1367. +   public static final SystemMessageId DESACTIVATE_RESPECT_HUNT;
  1368. +   public static final SystemMessageId ACTIVATE_SUMMON_ACTACK;
  1369. +   public static final SystemMessageId AUTO_FARM_DESACTIVATED;
  1370. +   public static final SystemMessageId AUTO_FARM_ACTIVATED;
  1371. +  
  1372. +  
  1373. +  
  1374. +  
  1375. +  
  1376.     /**
  1377.      * Array containing all SystemMessageIds<br>
  1378.      * Important: Always initialize with a length of the highest SystemMessageId + 1!!!
  1379. @@ -13766,6 +13777,13 @@
  1380.         CURRENTLY_LOGGING_IN = new SystemMessageId(2030);
  1381.         PLEASE_WAIT_A_MOMENT = new SystemMessageId(2031);
  1382.        
  1383. +       AUTO_FARM_DESACTIVATED = new SystemMessageId(2155);
  1384. +       ACTIVATE_SUMMON_ACTACK = new SystemMessageId(2156);
  1385. +       DESACTIVATE_SUMMON_ACTACK = new SystemMessageId(2157);     
  1386. +       ACTIVATE_RESPECT_HUNT = new SystemMessageId(2158);
  1387. +       DESACTIVATE_RESPECT_HUNT = new SystemMessageId(2159);
  1388. +       AUTO_FARM_ACTIVATED = new SystemMessageId(2160);
  1389. +      
  1390.         buildFastLookupTable();
  1391.     }
  1392.    
  1393. diff --git java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java
  1394. index 10b5aa1..c16bd46 100644
  1395. --- java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java
  1396. +++ java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java
  1397. @@ -64,6 +64,8 @@
  1398.  import net.sf.l2j.gameserver.skills.L2Skill;
  1399.  import net.sf.l2j.gameserver.taskmanager.GameTimeTaskManager;
  1400.  
  1401. +import Base.AutoFarm.AutofarmPlayerRoutine;
  1402. +
  1403.  public class EnterWorld extends L2GameClientPacket
  1404.  {
  1405.     @Override
  1406. @@ -257,6 +259,18 @@
  1407.         LMEvent.onLogin(player);
  1408.         TvTEvent.onLogin(player);
  1409.        
  1410. +      
  1411. +      
  1412. +           if(AutofarmPlayerRoutine.isIpAllowed(player.getIP())) {
  1413. +               AutofarmPlayerRoutine.removeIpEntry(player.getObjectId());
  1414. +           }
  1415. +          
  1416. +            
  1417. +                       player.loadAutoFarmSettings();
  1418. +
  1419. +                  if(player.isSummonAttack()) {
  1420. +                      player.sendPacket(new SystemMessage(SystemMessageId.ACTIVATE_SUMMON_ACTACK));
  1421. +                      
  1422. +                  }
  1423. +                  
  1424. +                  if(player.isAntiKsProtected()) {
  1425. +                      player.sendPacket(new SystemMessage(SystemMessageId.ACTIVATE_RESPECT_HUNT));
  1426. +                  }  
  1427. +      
  1428. +      
  1429.         // If the Player is a Dark Elf, check for Shadow Sense at night.
  1430.         if (player.getRace() == ClassRace.DARK_ELF && player.hasSkill(L2Skill.SKILL_SHADOW_SENSE))
  1431.             player.sendPacket(SystemMessage.getSystemMessage((GameTimeTaskManager.getInstance().isNight()) ? SystemMessageId.NIGHT_S1_EFFECT_APPLIES : SystemMessageId.DAY_S1_EFFECT_DISAPPEARS).addSkillName(L2Skill.SKILL_SHADOW_SENSE));
  1432. diff --git java/net/sf/l2j/gameserver/network/clientpackets/Logout.java java/net/sf/l2j/gameserver/network/clientpackets/Logout.java
  1433. index fc35889..7e45882 100644
  1434. --- java/net/sf/l2j/gameserver/network/clientpackets/Logout.java
  1435. +++ java/net/sf/l2j/gameserver/network/clientpackets/Logout.java
  1436. @@ -12,6 +12,8 @@
  1437.  import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
  1438.  import net.sf.l2j.gameserver.taskmanager.AttackStanceTaskManager;
  1439.  
  1440. +import Base.AutoFarm.AutofarmPlayerRoutine;
  1441. +
  1442.  public final class Logout extends L2GameClientPacket
  1443.  {
  1444.     @Override
  1445. @@ -39,6 +41,9 @@
  1446.             return;
  1447.         }
  1448.        
  1449. +      
  1450. +      
  1451. +      
  1452.         if (AttackStanceTaskManager.getInstance().isInAttackStance(player) && !player.isGM())
  1453.         {
  1454.             player.sendPacket(SystemMessageId.CANT_LOGOUT_WHILE_FIGHTING);
  1455. @@ -59,6 +64,17 @@
  1456.         LMEvent.onLogout(player);
  1457.         TvTEvent.onLogout(player);
  1458.        
  1459. +        if (player.isAutoFarm())
  1460. +        {
  1461. +           if(AutofarmPlayerRoutine.isIpAllowed(player.getIP())) {
  1462. +               AutofarmPlayerRoutine.removeIpEntry(player.getObjectId());
  1463. +           }
  1464. +          
  1465. +            
  1466. +        }
  1467. +      
  1468. +      
  1469. +      
  1470.         player.removeFromBossZone();
  1471.         AntiFeedManager.getInstance().onDisconnect(player.getClient());
  1472.         player.logout(true);
  1473. diff --git java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
  1474. index 5f8debc..78fa84c 100644
  1475. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
  1476. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
  1477. @@ -45,11 +45,16 @@
  1478.  import net.sf.l2j.gameserver.model.spawn.ASpawn;
  1479.  import net.sf.l2j.gameserver.network.SystemMessageId;
  1480.  import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
  1481. +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage;
  1482. +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS;
  1483.  import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
  1484. +import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
  1485.  import net.sf.l2j.gameserver.scripting.QuestState;
  1486.  import net.sf.l2j.gameserver.skills.AbstractEffect;
  1487.  import net.sf.l2j.gameserver.skills.L2Skill;
  1488.  
  1489. +import Base.AutoFarm.AutofarmPlayerRoutine;
  1490. +
  1491.  public final class RequestBypassToServer extends L2GameClientPacket
  1492.  {
  1493.     private static final Logger GMAUDIT_LOG = Logger.getLogger("gmaudit");
  1494. @@ -75,9 +80,11 @@
  1495.             return;
  1496.        
  1497.         final Player player = getClient().getPlayer();
  1498. +      
  1499. +      
  1500.         if (player == null)
  1501.             return;
  1502. -      
  1503. +       final AutofarmPlayerRoutine bot = player.getBot();
  1504.         if (_command.startsWith("admin_"))
  1505.         {
  1506.             String command = _command.split(" ")[0];
  1507. @@ -130,6 +137,119 @@
  1508.             html.disableValidation();
  1509.             player.sendPacket(html);
  1510.         }
  1511. +      
  1512. +      
  1513. +      
  1514. +        else if (_command.startsWith("_infosettings"))
  1515. +        {
  1516. +            showAutoFarm(player);
  1517. +        }
  1518. +
  1519. +        
  1520. +        
  1521. +        else if (_command.startsWith("_autofarm"))
  1522. +        {
  1523. +            if (player.isAutoFarm())
  1524. +            {
  1525. +                bot.stop();
  1526. +                player.setAutoFarm(false);
  1527. +            }
  1528. +            else
  1529. +            {
  1530. +                bot.start();
  1531. +                player.setAutoFarm(true);
  1532. +            }
  1533. +            
  1534. +        }
  1535. +        
  1536. +        if (_command.startsWith("_pageAutoFarm"))
  1537. +        {
  1538. +            StringTokenizer st = new StringTokenizer(_command, " ");
  1539. +            st.nextToken();
  1540. +            try
  1541. +            {
  1542. +                String param = st.nextToken();
  1543. +                
  1544. +                if (param.startsWith("inc_page") || param.startsWith("dec_page"))
  1545. +                {
  1546. +                    int newPage;
  1547. +                    
  1548. +                    if (param.startsWith("inc_page"))
  1549. +                    {
  1550. +                        newPage = player.getPage() + 1;
  1551. +                    }
  1552. +                    else
  1553. +                    {
  1554. +                        newPage = player.getPage() - 1;
  1555. +                    }
  1556. +                    
  1557. +                    if (newPage >= 0 && newPage <= 9)
  1558. +                    {
  1559. +                        String[] pageStrings =
  1560. +                        {
  1561. +                            "F1",
  1562. +                            "F2",
  1563. +                            "F3",
  1564. +                            "F4",
  1565. +                            "F5",
  1566. +                            "F6",
  1567. +                            "F7",
  1568. +                            "F8",
  1569. +                            "F9",
  1570. +                            "F10"
  1571. +                        };
  1572. +                        
  1573. +                        player.setPage(newPage);
  1574. +                        player.sendPacket(new ExShowScreenMessage("Auto Farm Skill Bar " + pageStrings[newPage], 3 * 1000, SMPOS.TOP_CENTER, false));
  1575. +                        player.saveAutoFarmSettings();
  1576. +                        
  1577. +                    }
  1578. +                    
  1579. +                }
  1580. +                
  1581. +            }
  1582. +            catch (Exception e)
  1583. +            {
  1584. +                e.printStackTrace();
  1585. +            }
  1586. +        }
  1587. +        
  1588. +        if (_command.startsWith("_enableBuffProtect"))
  1589. +        {
  1590. +            player.setNoBuffProtection(!player.isNoBuffProtected());
  1591. +            if (player.isNoBuffProtected())
  1592. +            {
  1593. +                player.sendPacket(new ExShowScreenMessage("Auto Farm Buff Protect On", 3 * 1000, SMPOS.TOP_CENTER, false));
  1594. +            }
  1595. +            else
  1596. +            {
  1597. +                player.sendPacket(new ExShowScreenMessage("Auto Farm Buff Protect Off", 3 * 1000, SMPOS.TOP_CENTER, false));
  1598. +            }
  1599. +            player.saveAutoFarmSettings();
  1600. +        }
  1601. +        if (_command.startsWith("_enableSummonAttack"))
  1602. +        {
  1603. +            player.setSummonAttack(!player.isSummonAttack());
  1604. +            if (player.isSummonAttack())
  1605. +            {
  1606. +                player.sendPacket(new SystemMessage(SystemMessageId.ACTIVATE_SUMMON_ACTACK));
  1607. +                player.sendPacket(new ExShowScreenMessage("Auto Farm Summon Attack On", 3 * 1000, SMPOS.TOP_CENTER, false));
  1608. +            }
  1609. +            else
  1610. +            {
  1611. +                player.sendPacket(new SystemMessage(SystemMessageId.DESACTIVATE_SUMMON_ACTACK));
  1612. +                player.sendPacket(new ExShowScreenMessage("Auto Farm Summon Attack Off", 3 * 1000, SMPOS.TOP_CENTER, false));
  1613. +            }
  1614. +            player.saveAutoFarmSettings();
  1615. +        }
  1616. +        
  1617. +        
  1618. +          
  1619. +      
  1620. +               if (_command.startsWith("_enableRespectHunt"))
  1621. +       {
  1622. +          
  1623. +           player.setAntiKsProtection(!player.isAntiKsProtected());
  1624. +           if (player.isAntiKsProtected())
  1625. +           {
  1626. +               player.sendPacket(new SystemMessage(SystemMessageId.ACTIVATE_RESPECT_HUNT));
  1627. +               player.sendPacket(new ExShowScreenMessage("Respct Hunt On", 3 * 1000, SMPOS.TOP_CENTER, false));
  1628. +           }
  1629. +           else
  1630. +           {
  1631. +               player.sendPacket(new SystemMessage(SystemMessageId.DESACTIVATE_RESPECT_HUNT));
  1632. +               player.sendPacket(new ExShowScreenMessage("Respct Hunt Off", 3 * 1000, SMPOS.TOP_CENTER, false));
  1633. +           }
  1634. +           player.saveAutoFarmSettings();
  1635. +          
  1636. +       }
  1637. +      
  1638. +      
  1639. +       if (_command.startsWith("_radiusAutoFarm"))
  1640. +       {
  1641. +           StringTokenizer st = new StringTokenizer(_command, " ");
  1642. +           st.nextToken();
  1643. +           try
  1644. +           {
  1645. +               String param = st.nextToken();
  1646. +              
  1647. +               if (param.startsWith("inc_radius"))
  1648. +               {
  1649. +                   player.setRadius(player.getRadius() + 200);
  1650. +                   player.sendPacket(new ExShowScreenMessage("Auto Farm Range: " + player.getRadius(), 3 * 1000, SMPOS.TOP_CENTER, false));
  1651. +                  
  1652. +               }
  1653. +               else if (param.startsWith("dec_radius"))
  1654. +               {
  1655. +                   player.setRadius(player.getRadius() - 200);
  1656. +                   player.sendPacket(new ExShowScreenMessage("Auto Farm Range: " + player.getRadius(), 3 * 1000, SMPOS.TOP_CENTER, false));
  1657. +                  
  1658. +               }
  1659. +               player.saveAutoFarmSettings();
  1660. +           }
  1661. +           catch (Exception e)
  1662. +           {
  1663. +               e.printStackTrace();
  1664. +           }
  1665. +       }
  1666. +      
  1667. +      
  1668. +      
  1669.         else if (_command.startsWith("npc_"))
  1670.         {
  1671.             if (!player.validateBypass(_command))
  1672. @@ -582,4 +702,33 @@
  1673.        
  1674.         html.replace("%content%", sb.toString());
  1675.     }
  1676. +  
  1677. +  
  1678. +  
  1679. +     private static final String ACTIVED = "<font color=00FF00>STARTED</font>";
  1680. +     private static final String DESATIVED = "<font color=FF0000>STOPPED</font>";
  1681. +     private static final String STOP = "STOP";
  1682. +     private static final String START = "START";
  1683. +    
  1684. +     public static void showAutoFarm(Player activeChar)
  1685. +     {
  1686. +         NpcHtmlMessage html = new NpcHtmlMessage(0);
  1687. +         html.setFile(activeChar.getLocale(),"html/mods/menu/AutoFarm.htm");
  1688. +         html.replace("%player%", activeChar.getName());
  1689. +         html.replace("%page%", StringUtil.formatNumber(activeChar.getPage() + 1));
  1690. +         html.replace("%heal%", StringUtil.formatNumber(activeChar.getHealPercent()));
  1691. +         html.replace("%radius%", StringUtil.formatNumber(activeChar.getRadius()));
  1692. +         html.replace("%summonSkill%", StringUtil.formatNumber(activeChar.getSummonSkillPercent()));
  1693. +         html.replace("%hpPotion%", StringUtil.formatNumber(activeChar.getHpPotionPercentage()));
  1694. +         html.replace("%mpPotion%", StringUtil.formatNumber(activeChar.getMpPotionPercentage()));
  1695. +         html.replace("%noBuff%", activeChar.isNoBuffProtected() ? "back=L2UI.CheckBox_checked fore=L2UI.CheckBox_checked" : "back=L2UI.CheckBox fore=L2UI.CheckBox");
  1696. +         html.replace("%summonAtk%", activeChar.isSummonAttack() ? "back=L2UI.CheckBox_checked fore=L2UI.CheckBox_checked" : "back=L2UI.CheckBox fore=L2UI.CheckBox");
  1697. +         html.replace("%antiKs%", activeChar.isAntiKsProtected() ? "back=L2UI.CheckBox_checked fore=L2UI.CheckBox_checked" : "back=L2UI.CheckBox fore=L2UI.CheckBox");
  1698. +         html.replace("%autofarm%", activeChar.isAutoFarm() ? ACTIVED : DESATIVED);
  1699. +         html.replace("%button%", activeChar.isAutoFarm() ? STOP : START);
  1700. +         activeChar.sendPacket(html);
  1701. +     }
  1702. +
  1703. +  
  1704. +  
  1705.  }
  1706. \ No newline at end of file
  1707. diff --git java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java
  1708. index 00a37d4..e95b67d 100644
  1709. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java
  1710. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java
  1711. @@ -11,6 +11,8 @@
  1712.  import net.sf.l2j.gameserver.network.serverpackets.RestartResponse;
  1713.  import net.sf.l2j.gameserver.taskmanager.AttackStanceTaskManager;
  1714.  
  1715. +import Base.AutoFarm.AutofarmPlayerRoutine;
  1716. +
  1717.  public final class RequestRestart extends L2GameClientPacket
  1718.  {
  1719.     @Override
  1720. @@ -38,6 +40,16 @@
  1721.             return;
  1722.         }
  1723.        
  1724. +        if (player.isAutoFarm())
  1725. +        {
  1726. +           if(AutofarmPlayerRoutine.isIpAllowed(player.getIP())) {
  1727. +               AutofarmPlayerRoutine.removeIpEntry(player.getObjectId());
  1728. +           }
  1729. +          
  1730. +            
  1731. +        }
  1732. +      
  1733. +      
  1734.         if (AttackStanceTaskManager.getInstance().isInAttackStance(player) && !player.isGM())
  1735.         {
  1736.             player.sendPacket(SystemMessageId.CANT_RESTART_WHILE_FIGHTING);
  1737. diff --git java/net/sf/l2j/gameserver/network/serverpackets/Die.java java/net/sf/l2j/gameserver/network/serverpackets/Die.java
  1738. index b332215..b1d2328 100644
  1739. --- java/net/sf/l2j/gameserver/network/serverpackets/Die.java
  1740. +++ java/net/sf/l2j/gameserver/network/serverpackets/Die.java
  1741. @@ -14,6 +14,8 @@
  1742.  import net.sf.l2j.gameserver.model.residence.castle.Siege;
  1743.  import net.sf.l2j.gameserver.model.residence.clanhall.ClanHallSiege;
  1744.  
  1745. +import Base.AutoFarm.AutofarmPlayerRoutine;
  1746. +
  1747.  public class Die extends L2GameServerPacket
  1748.  {
  1749.     private final Creature _creature;
  1750. @@ -34,9 +36,16 @@
  1751.        
  1752.         if (creature instanceof Player player)
  1753.         {
  1754. +            final AutofarmPlayerRoutine bot = player.getBot();
  1755.             _allowFixedRes = player.getAccessLevel().allowFixedRes();
  1756.             _clan = player.getClan();
  1757.            
  1758. +                     if (player.isAutoFarm())
  1759. +                          {
  1760. +                              bot.stop();
  1761. +                              player.setAutoFarm(false);
  1762. +                          }
  1763. +          
  1764.         }
  1765.         else if (creature instanceof Monster monster)
  1766.             _sweepable = monster.getSpoilState().isSweepable();
  1767. diff --git java/net/sf/l2j/gameserver/network/serverpackets/SystemMessage.java java/net/sf/l2j/gameserver/network/serverpackets/SystemMessage.java
  1768. index 19bebb0..6760dfb 100644
  1769. --- java/net/sf/l2j/gameserver/network/serverpackets/SystemMessage.java
  1770. +++ java/net/sf/l2j/gameserver/network/serverpackets/SystemMessage.java
  1771. @@ -29,7 +29,7 @@
  1772.     private SMParam[] _params;
  1773.     private int _paramIndex;
  1774.    
  1775. -   private SystemMessage(final SystemMessageId smId)
  1776. +   public SystemMessage(final SystemMessageId smId)
  1777.     {
  1778.         final int paramCount = smId.getParamCount();
  1779.         _smId = smId;
  1780.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement