Sarada-L2

Auto Farm Acis 372

Oct 13th, 2021 (edited)
496
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. diff --git a/config/CustomMods/AutoFarm.properties b/config/CustomMods/AutoFarm.properties
  2. new file mode 100644
  3. index 0000000..aab9d76
  4. --- /dev/null
  5. +++ b/config/CustomMods/AutoFarm.properties
  6. @@ -0,0 +1,6 @@
  7. +# =================================================================
  8. +# Auto Farm
  9. +# =================================================================
  10. +AutoFarmRadius = 800
  11. +# 0 = barra 1, 1 = barra = 2 ... 9 = barra 10
  12. +AutoFarmBar = 0
  13. \ No newline at end of file
  14. diff --git a/java/Dev/AutoFarm/AutofarmCommand.java b/java/Dev/AutoFarm/AutofarmCommand.java
  15. new file mode 100644
  16. index 0000000..c14df73
  17. --- /dev/null
  18. +++ b/java/Dev/AutoFarm/AutofarmCommand.java
  19. @@ -0,0 +1,46 @@
  20. +package Dev.AutoFarm;
  21. +
  22. +
  23. +import net.sf.l2j.gameserver.handler.IVoicedCommandHandler;
  24. +import net.sf.l2j.gameserver.model.actor.instance.Player;
  25. +
  26. +
  27. +public class AutofarmCommand implements IVoicedCommandHandler
  28. +{
  29. +
  30. + @Override
  31. + public boolean useVoicedCommand(String command, Player activeChar, String params)
  32. + {
  33. + if (activeChar.getInstance().getId() != 0)
  34. + {
  35. + activeChar.sendMessage("You can't use this command inside a Instance!");
  36. + return false;
  37. + }
  38. + if (!activeChar.isVip())
  39. + {
  40. + activeChar.sendMessage("Auto farm is only for Vip Players!");
  41. + return false;
  42. + }
  43. +
  44. + switch (command)
  45. + {
  46. + case "farm":
  47. + AutofarmManager.INSTANCE.toggleFarm(activeChar);
  48. + break;
  49. + case "farmon":
  50. + AutofarmManager.INSTANCE.startFarm(activeChar);
  51. + break;
  52. + case "farmoff":
  53. + AutofarmManager.INSTANCE.stopFarm(activeChar);
  54. + break;
  55. + }
  56. + return false;
  57. + }
  58. +
  59. + @Override
  60. + public String[] getVoicedCommandList()
  61. + {
  62. + return new String[]
  63. + { "farm", "farmon", "farmoff" };
  64. + }
  65. +}
  66. diff --git a/java/Dev/AutoFarm/AutofarmConstants.java b/java/Dev/AutoFarm/AutofarmConstants.java
  67. new file mode 100644
  68. index 0000000..eb3c2b9
  69. --- /dev/null
  70. +++ b/java/Dev/AutoFarm/AutofarmConstants.java
  71. @@ -0,0 +1,23 @@
  72. +package Dev.AutoFarm;
  73. +
  74. +import java.util.Arrays;
  75. +import java.util.List;
  76. +
  77. +import net.sf.l2j.Config;
  78. +
  79. +public class AutofarmConstants
  80. +{
  81. + public static Integer shortcutsPageIndex = Config.AUTO_FARM_BAR;
  82. + public static Integer targetingRadius = Config.AUTO_FARM_RADIUS;
  83. + public static Integer lowLifePercentageThreshold = 30;
  84. + public static Integer useMpPotsPercentageThreshold = 30;
  85. + public static Integer useHpPotsPercentageThreshold = 30;
  86. + public static Integer mpPotItemId = 728;
  87. + public static Integer hpPotItemId = 1539;
  88. + public static Integer hpPotSkillId = 2037;
  89. +
  90. + public static List<Integer> attackSlots = Arrays.asList(0, 1, 2, 3);
  91. + public static List<Integer> chanceSlots = Arrays.asList(4, 5);
  92. + public static List<Integer> selfSlots = Arrays.asList(6, 7, 8, 9);
  93. + public static List<Integer> lowLifeSlots = Arrays.asList(10, 11);
  94. +}
  95. diff --git a/java/Dev/AutoFarm/AutofarmManager.java b/java/Dev/AutoFarm/AutofarmManager.java
  96. new file mode 100644
  97. index 0000000..9decb1a
  98. --- /dev/null
  99. +++ b/java/Dev/AutoFarm/AutofarmManager.java
  100. @@ -0,0 +1,84 @@
  101. +package Dev.AutoFarm;
  102. +
  103. +
  104. +import java.util.concurrent.ConcurrentHashMap;
  105. +import java.util.concurrent.ScheduledFuture;
  106. +
  107. +import net.sf.l2j.gameserver.ThreadPoolManager;
  108. +import net.sf.l2j.gameserver.handler.voicedcommandhandlers.VoicedMenu;
  109. +import net.sf.l2j.gameserver.model.actor.instance.Player;
  110. +
  111. +public enum AutofarmManager
  112. +{
  113. + INSTANCE;
  114. +
  115. + private final Long iterationSpeedMs = 450L;
  116. +
  117. + private final ConcurrentHashMap<Integer, AutofarmPlayerRoutine> activeFarmers = new ConcurrentHashMap<>();
  118. + private final ScheduledFuture<?> onUpdateTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(onUpdate(), 1000, iterationSpeedMs);
  119. +
  120. + private Runnable onUpdate()
  121. + {
  122. + return () -> activeFarmers.forEach((integer, autofarmPlayerRoutine) -> autofarmPlayerRoutine.executeRoutine());
  123. + }
  124. +
  125. + public void startFarm(Player player)
  126. + {
  127. + if (isAutofarming(player))
  128. + {
  129. + player.sendMessage("You are already autofarming");
  130. + return;
  131. + }
  132. +
  133. + activeFarmers.put(player.getObjectId(), new AutofarmPlayerRoutine(player));
  134. + player.sendMessage("Autofarming activated");
  135. + }
  136. +
  137. + public void stopFarm(Player player)
  138. + {
  139. + if (!isAutofarming(player))
  140. + {
  141. + player.sendMessage("You are not autofarming");
  142. + return;
  143. + }
  144. +
  145. + activeFarmers.remove(player.getObjectId());
  146. + player.sendMessage("Autofarming deactivated");
  147. + }
  148. +
  149. + public void toggleFarm(Player player)
  150. + {
  151. + if (isAutofarming(player))
  152. + {
  153. + stopFarm(player);
  154. + VoicedMenu.sendVipWindow(player);
  155. + return;
  156. + }
  157. +
  158. + startFarm(player);
  159. + VoicedMenu.sendVipWindow(player);
  160. + }
  161. +
  162. + public Boolean isAutofarming(Player player)
  163. + {
  164. + return activeFarmers.containsKey(player.getObjectId());
  165. + }
  166. +
  167. + public void onPlayerLogout(Player player)
  168. + {
  169. + stopFarm(player);
  170. + }
  171. +
  172. + public void onDeath(Player player)
  173. + {
  174. + if (isAutofarming(player))
  175. + {
  176. + activeFarmers.remove(player.getObjectId());
  177. + }
  178. + }
  179. +
  180. + public ScheduledFuture<?> getOnUpdateTask()
  181. + {
  182. + return onUpdateTask;
  183. + }
  184. +}
  185. \ No newline at end of file
  186. diff --git a/java/Dev/AutoFarm/AutofarmPlayerRoutine.java b/java/Dev/AutoFarm/AutofarmPlayerRoutine.java
  187. new file mode 100644
  188. index 0000000..1bea3cf
  189. --- /dev/null
  190. +++ b/java/Dev/AutoFarm/AutofarmPlayerRoutine.java
  191. @@ -0,0 +1,578 @@
  192. +package Dev.AutoFarm;
  193. +
  194. +
  195. +import java.util.ArrayList;
  196. +import java.util.Arrays;
  197. +import java.util.Collections;
  198. +import java.util.List;
  199. +import java.util.function.Function;
  200. +import java.util.stream.Collectors;
  201. +
  202. +import net.sf.l2j.commons.math.MathUtil;
  203. +
  204. +import net.sf.l2j.Config;
  205. +import net.sf.l2j.gameserver.ThreadPoolManager;
  206. +import net.sf.l2j.gameserver.data.SkillTable;
  207. +import net.sf.l2j.gameserver.geoengine.GeoEngine;
  208. +import net.sf.l2j.gameserver.handler.IItemHandler;
  209. +import net.sf.l2j.gameserver.handler.ItemHandler;
  210. +import net.sf.l2j.gameserver.model.L2ShortCut;
  211. +import net.sf.l2j.gameserver.model.L2Skill;
  212. +import net.sf.l2j.gameserver.model.WorldObject;
  213. +import net.sf.l2j.gameserver.model.WorldRegion;
  214. +import net.sf.l2j.gameserver.model.actor.Creature;
  215. +import net.sf.l2j.gameserver.model.actor.Summon;
  216. +import net.sf.l2j.gameserver.model.actor.ai.CtrlEvent;
  217. +import net.sf.l2j.gameserver.model.actor.ai.CtrlIntention;
  218. +import net.sf.l2j.gameserver.model.actor.ai.NextAction;
  219. +import net.sf.l2j.gameserver.model.actor.instance.Monster;
  220. +import net.sf.l2j.gameserver.model.actor.instance.Pet;
  221. +import net.sf.l2j.gameserver.model.actor.instance.Player;
  222. +import net.sf.l2j.gameserver.model.holder.IntIntHolder;
  223. +import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
  224. +import net.sf.l2j.gameserver.model.item.kind.Item;
  225. +import net.sf.l2j.gameserver.model.item.type.ActionType;
  226. +import net.sf.l2j.gameserver.model.item.type.EtcItemType;
  227. +import net.sf.l2j.gameserver.model.item.type.WeaponType;
  228. +import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
  229. +import net.sf.l2j.gameserver.network.SystemMessageId;
  230. +import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
  231. +import net.sf.l2j.gameserver.network.serverpackets.ItemList;
  232. +import net.sf.l2j.gameserver.network.serverpackets.PetItemList;
  233. +import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
  234. +import net.sf.l2j.gameserver.scripting.Quest;
  235. +import net.sf.l2j.gameserver.scripting.QuestState;
  236. +import net.sf.l2j.gameserver.templates.skills.L2SkillType;
  237. +
  238. +public class AutofarmPlayerRoutine
  239. +{
  240. + private final Player player;
  241. + private Creature committedTarget = null;
  242. +
  243. + public AutofarmPlayerRoutine(Player player)
  244. + {
  245. + this.player = player;
  246. + }
  247. +
  248. + public void executeRoutine()
  249. + {
  250. + checkSpoil();
  251. + targetEligibleCreature();
  252. + checkManaPots();
  253. + checkHealthPots();
  254. + attack();
  255. + checkSpoil();
  256. + }
  257. +
  258. + private void attack()
  259. + {
  260. + boolean shortcutsContainAttack = shotcutsContainAttack();
  261. + if (shortcutsContainAttack)
  262. + {
  263. + physicalAttack();
  264. + }
  265. +
  266. + useAppropriateSpell();
  267. +
  268. + if (shortcutsContainAttack)
  269. + {
  270. + physicalAttack();
  271. + }
  272. + }
  273. +
  274. + private void useAppropriateSpell()
  275. + {
  276. +
  277. + L2Skill chanceSkill = nextAvailableSkill(getChanceSpells(), AutofarmSpellType.Chance);
  278. +
  279. + if (chanceSkill != null)
  280. + {
  281. + useMagicSkill(chanceSkill, false);
  282. + return;
  283. + }
  284. +
  285. + L2Skill lowLifeSkill = nextAvailableSkill(getLowLifeSpells(), AutofarmSpellType.LowLife);
  286. +
  287. + if (lowLifeSkill != null)
  288. + {
  289. + useMagicSkill(lowLifeSkill, false);
  290. + return;
  291. + }
  292. +
  293. + L2Skill selfSkills = nextAvailableSkill(getSelfSpells(), AutofarmSpellType.Self);
  294. +
  295. + if (selfSkills != null)
  296. + {
  297. + useMagicSkill(selfSkills, true);
  298. + return;
  299. + }
  300. +
  301. + L2Skill attackSkill = nextAvailableSkill(getAttackSpells(), AutofarmSpellType.Attack);
  302. +
  303. + if (attackSkill != null)
  304. + {
  305. + useMagicSkill(attackSkill, false);
  306. + return;
  307. + }
  308. + }
  309. +
  310. + public L2Skill nextAvailableSkill(List<Integer> skillIds, AutofarmSpellType spellType)
  311. + {
  312. + for (Integer skillId : skillIds)
  313. + {
  314. + L2Skill skill = player.getSkill(skillId);
  315. +
  316. + if (skill == null)
  317. + continue;
  318. +
  319. + if (!player.checkDoCastConditions(skill))
  320. + continue;
  321. +
  322. + if (spellType == AutofarmSpellType.Chance && getMonsterTarget() != null)
  323. + {
  324. + if (isSpoil(skillId))
  325. + {
  326. + if (monsterIsAlreadySpoiled())
  327. + {
  328. + continue;
  329. + }
  330. + else
  331. + {
  332. + return skill;
  333. + }
  334. + }
  335. +
  336. + if (getMonsterTarget().getFirstEffect(skillId) == null)
  337. + {
  338. + return skill;
  339. + }
  340. + else
  341. + {
  342. + continue;
  343. + }
  344. + }
  345. +
  346. + if (spellType == AutofarmSpellType.LowLife && getMonsterTarget() != null && getHpPercentage() > AutofarmConstants.lowLifePercentageThreshold)
  347. + {
  348. + break;
  349. + }
  350. +
  351. + if (spellType == AutofarmSpellType.Self)
  352. + {
  353. + if (skill.isToggle() && player.getFirstEffect(skillId) == null)
  354. + return skill;
  355. +
  356. + if (player.getFirstEffect(skillId) == null)
  357. + {
  358. + return skill;
  359. + }
  360. +
  361. + continue;
  362. + }
  363. +
  364. + return skill;
  365. + }
  366. +
  367. + return null;
  368. + }
  369. +
  370. + private void checkHealthPots()
  371. + {
  372. + if (getHpPercentage() <= AutofarmConstants.useHpPotsPercentageThreshold)
  373. + {
  374. + if (player.getFirstEffect(AutofarmConstants.hpPotSkillId) != null)
  375. + {
  376. + return;
  377. + }
  378. +
  379. + ItemInstance hpPots = player.getInventory().getItemByItemId(AutofarmConstants.hpPotItemId);
  380. + if (hpPots != null)
  381. + {
  382. + useItem(hpPots);
  383. + }
  384. + }
  385. + }
  386. +
  387. + private void checkManaPots()
  388. + {
  389. +
  390. + if (getMpPercentage() <= AutofarmConstants.useMpPotsPercentageThreshold)
  391. + {
  392. + ItemInstance mpPots = player.getInventory().getItemByItemId(AutofarmConstants.mpPotItemId);
  393. + if (mpPots != null)
  394. + {
  395. + useItem(mpPots);
  396. + }
  397. + }
  398. + }
  399. +
  400. + private void checkSpoil()
  401. + {
  402. + if (canBeSweepedByMe() && getMonsterTarget().isDead())
  403. + {
  404. + L2Skill sweeper = player.getSkill(42);
  405. + if (sweeper == null)
  406. + return;
  407. +
  408. + useMagicSkill(sweeper, false);
  409. + }
  410. + }
  411. +
  412. + private Double getHpPercentage()
  413. + {
  414. + return player.getCurrentHp() * 100.0f / player.getMaxHp();
  415. + }
  416. +
  417. + private Double getMpPercentage()
  418. + {
  419. + return player.getCurrentMp() * 100.0f / player.getMaxMp();
  420. + }
  421. +
  422. + private boolean canBeSweepedByMe()
  423. + {
  424. + return getMonsterTarget() != null && getMonsterTarget().isDead() && getMonsterTarget().getSpoilerId() == player.getObjectId();
  425. + }
  426. +
  427. + private boolean monsterIsAlreadySpoiled()
  428. + {
  429. + return getMonsterTarget() != null && getMonsterTarget().getSpoilerId() != 0;
  430. + }
  431. +
  432. + private static boolean isSpoil(Integer skillId)
  433. + {
  434. + return skillId == 254 || skillId == 302;
  435. + }
  436. +
  437. + private List<Integer> getAttackSpells()
  438. + {
  439. + return getSpellsInSlots(AutofarmConstants.attackSlots);
  440. + }
  441. +
  442. +
  443. + private List<Integer> getSpellsInSlots(List<Integer> attackSlots)
  444. + {
  445. + return Arrays.stream(player.getAllShortCuts()).filter(shortcut -> shortcut.getPage() == AutofarmConstants.shortcutsPageIndex && shortcut.getType() == L2ShortCut.TYPE_SKILL && attackSlots.contains(shortcut.getSlot())).map(L2ShortCut::getId).collect(Collectors.toList());
  446. + }
  447. +
  448. + private List<Integer> getChanceSpells()
  449. + {
  450. + return getSpellsInSlots(AutofarmConstants.chanceSlots);
  451. + }
  452. +
  453. + private List<Integer> getSelfSpells()
  454. + {
  455. + return getSpellsInSlots(AutofarmConstants.selfSlots);
  456. + }
  457. +
  458. + private List<Integer> getLowLifeSpells()
  459. + {
  460. + return getSpellsInSlots(AutofarmConstants.lowLifeSlots);
  461. + }
  462. +
  463. + private boolean shotcutsContainAttack()
  464. + {
  465. + return Arrays.stream(player.getAllShortCuts()).anyMatch(shortcut ->
  466. + /* shortcut.getPage() == 0 && */shortcut.getType() == L2ShortCut.TYPE_ACTION && shortcut.getId() == 2);
  467. + }
  468. +
  469. + private void castSpellWithAppropriateTarget(L2Skill skill, Boolean forceOnSelf)
  470. + {
  471. + if (forceOnSelf)
  472. + {
  473. + WorldObject oldTarget = player.getTarget();
  474. + player.setTarget(player);
  475. + player.useMagic(skill, false, false);
  476. + player.setTarget(oldTarget);
  477. + return;
  478. + }
  479. +
  480. + player.useMagic(skill, false, false);
  481. + }
  482. +
  483. + private void physicalAttack()
  484. + {
  485. +
  486. + if (!(player.getTarget() instanceof Monster))
  487. + {
  488. + return;
  489. + }
  490. +
  491. + Creature target = (Monster) player.getTarget();
  492. +
  493. + if (target.isAutoAttackable(player))
  494. + {
  495. + if (GeoEngine.getInstance().canSeeTarget(player, target))
  496. + {
  497. + player.getAI().setIntention(CtrlIntention.ATTACK, target);
  498. + player.onActionRequest();
  499. + }
  500. + }
  501. + else
  502. + {
  503. + player.sendPacket(ActionFailed.STATIC_PACKET);
  504. +
  505. + if (GeoEngine.getInstance().canSeeTarget(player, target))
  506. + player.getAI().setIntention(CtrlIntention.FOLLOW, target);
  507. + }
  508. + }
  509. +
  510. + public void targetEligibleCreature()
  511. + {
  512. + if (committedTarget != null)
  513. + {
  514. + if (!committedTarget.isDead() && GeoEngine.getInstance().canSeeTarget(player, committedTarget)/* && !player.isMoving() */)
  515. + {
  516. + return;
  517. + }
  518. + committedTarget = null;
  519. + player.setTarget(null);
  520. + }
  521. +
  522. + List<Monster> targets = getKnownMonstersInRadius(player, Config.AUTO_FARM_RADIUS, creature -> GeoEngine.getInstance().canMoveToTarget(player.getX(), player.getY(), player.getZ(), creature.getX(), creature.getY(), creature.getZ()) && !creature.isDead());
  523. +
  524. + if (targets.isEmpty())
  525. + {
  526. + return;
  527. + }
  528. +
  529. + Creature closestTarget = targets.stream().min((o1, o2) -> (int) MathUtil.calculateDistance(o1, o2, false)).get();
  530. + // CreatuL2Character = targets.get(Rnd.get(targets.size()));
  531. + committedTarget = closestTarget;
  532. + player.setTarget(closestTarget);
  533. + }
  534. +
  535. + @SuppressWarnings("static-method")
  536. + public final List<Monster> getKnownMonstersInRadius(Player player, int radius, Function<Monster, Boolean> condition)
  537. + {
  538. + final WorldRegion region = player.getRegion();
  539. + if (region == null)
  540. + return Collections.emptyList();
  541. +
  542. + final List<Monster> result = new ArrayList<>();
  543. +
  544. + for (WorldRegion reg : region.getSurroundingRegions())
  545. + {
  546. + for (WorldObject obj : reg.getObjects())
  547. + {
  548. + if (!(obj instanceof Monster) || !MathUtil.checkIfInRange(radius, player, obj, true) || !condition.apply((Monster) obj))
  549. + continue;
  550. +
  551. + result.add((Monster) obj);
  552. + }
  553. + }
  554. +
  555. + return result;
  556. + }
  557. +
  558. + public Monster getMonsterTarget()
  559. + {
  560. + if (!(player.getTarget() instanceof Monster))
  561. + {
  562. + return null;
  563. + }
  564. +
  565. + return (Monster) player.getTarget();
  566. + }
  567. +
  568. + private void useMagicSkill(L2Skill skill, Boolean forceOnSelf)
  569. + {
  570. + if (skill.getSkillType() == L2SkillType.RECALL && !Config.KARMA_PLAYER_CAN_TELEPORT && player.getKarma() > 0)
  571. + {
  572. + player.sendPacket(ActionFailed.STATIC_PACKET);
  573. + return;
  574. + }
  575. +
  576. + if (skill.isToggle() && player.isMounted())
  577. + {
  578. + player.sendPacket(ActionFailed.STATIC_PACKET);
  579. + return;
  580. + }
  581. +
  582. + if (player.isOutOfControl())
  583. + {
  584. + player.sendPacket(ActionFailed.STATIC_PACKET);
  585. + return;
  586. + }
  587. +
  588. + if (player.isAttackingNow())
  589. + player.getAI().setNextAction(new NextAction(CtrlEvent.EVT_READY_TO_ACT, CtrlIntention.CAST, () -> castSpellWithAppropriateTarget(skill, forceOnSelf)));
  590. + else
  591. + {
  592. + castSpellWithAppropriateTarget(skill, forceOnSelf);
  593. + }
  594. + }
  595. +
  596. + public void useItem(ItemInstance item)
  597. + {
  598. + if (player.isInStoreMode())
  599. + {
  600. + player.sendPacket(SystemMessageId.ITEMS_UNAVAILABLE_FOR_STORE_MANUFACTURE);
  601. + return;
  602. + }
  603. +
  604. + if (player.getActiveTradeList() != null)
  605. + {
  606. + player.sendPacket(SystemMessageId.CANNOT_PICKUP_OR_USE_ITEM_WHILE_TRADING);
  607. + return;
  608. + }
  609. +
  610. + if (item == null)
  611. + return;
  612. +
  613. + if (item.getItem().getType2() == Item.TYPE2_QUEST)
  614. + {
  615. + player.sendPacket(SystemMessageId.CANNOT_USE_QUEST_ITEMS);
  616. + return;
  617. + }
  618. +
  619. + if (player.isAlikeDead() || player.isStunned() || player.isSleeping() || player.isParalyzed() || player.isAfraid())
  620. + return;
  621. +
  622. + if (!Config.KARMA_PLAYER_CAN_TELEPORT && player.getKarma() > 0)
  623. + {
  624. + final IntIntHolder[] sHolders = item.getItem().getSkills();
  625. + if (sHolders != null)
  626. + {
  627. + for (IntIntHolder sHolder : sHolders)
  628. + {
  629. + final L2Skill skill = sHolder.getSkill();
  630. + if (skill != null && (skill.getSkillType() == L2SkillType.TELEPORT || skill.getSkillType() == L2SkillType.RECALL))
  631. + return;
  632. + }
  633. + }
  634. + }
  635. +
  636. + if (player.isFishing() && item.getItem().getDefaultAction() != ActionType.fishingshot)
  637. + {
  638. + player.sendPacket(SystemMessageId.CANNOT_DO_WHILE_FISHING_3);
  639. + return;
  640. + }
  641. +
  642. + if (item.isPetItem())
  643. + {
  644. + if (!player.hasPet())
  645. + {
  646. + player.sendPacket(SystemMessageId.CANNOT_EQUIP_PET_ITEM);
  647. + return;
  648. + }
  649. +
  650. + final Summon pet = (player.getPet());
  651. +
  652. + /*if (!pet.canWear(item.getItem()))
  653. + {
  654. + player.sendPacket(SystemMessageId.PET_CANNOT_USE_ITEM);
  655. + return;
  656. + }*/
  657. +
  658. + if (pet.isDead())
  659. + {
  660. + player.sendPacket(SystemMessageId.CANNOT_GIVE_ITEMS_TO_DEAD_PET);
  661. + return;
  662. + }
  663. +
  664. + if (!pet.getInventory().validateCapacity(item))
  665. + {
  666. + player.sendPacket(SystemMessageId.YOUR_PET_CANNOT_CARRY_ANY_MORE_ITEMS);
  667. + return;
  668. + }
  669. +
  670. + if (!pet.getInventory().validateWeight(item, 1))
  671. + {
  672. + player.sendPacket(SystemMessageId.UNABLE_TO_PLACE_ITEM_YOUR_PET_IS_TOO_ENCUMBERED);
  673. + return;
  674. + }
  675. +
  676. + player.transferItem("Transfer", item.getObjectId(), 1, pet.getInventory(), pet);
  677. +
  678. + if (item.isEquipped())
  679. + {
  680. + pet.getInventory().unEquipItemInSlot(item.getLocationSlot());
  681. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.PET_TOOK_OFF_S1).addItemName(item));
  682. + }
  683. + else
  684. + {
  685. + pet.getInventory().equipPetItem(item);
  686. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.PET_PUT_ON_S1).addItemName(item));
  687. + }
  688. +
  689. + player.sendPacket(new PetItemList((Pet) pet));
  690. + pet.updateAndBroadcastStatus(1);
  691. + return;
  692. + }
  693. +
  694. + if (!item.isEquipped())
  695. + {
  696. + if (!item.getItem().checkCondition(player, player, true))
  697. + return;
  698. + }
  699. +
  700. + if (item.isEquipable())
  701. + {
  702. + if (player.isCastingNow() || player.isCastingSimultaneouslyNow())
  703. + {
  704. + player.sendPacket(SystemMessageId.CANNOT_USE_ITEM_WHILE_USING_MAGIC);
  705. + return;
  706. + }
  707. +
  708. + switch (item.getItem().getBodyPart())
  709. + {
  710. + case Item.SLOT_LR_HAND:
  711. + case Item.SLOT_L_HAND:
  712. + case Item.SLOT_R_HAND:
  713. + {
  714. + if (player.isMounted())
  715. + {
  716. + player.sendPacket(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION);
  717. + return;
  718. + }
  719. +
  720. + if (player.isCursedWeaponEquipped())
  721. + return;
  722. +
  723. + break;
  724. + }
  725. + }
  726. +
  727. + if (player.isCursedWeaponEquipped() && item.getItemId() == 6408)
  728. + return;
  729. +
  730. + if (player.isAttackingNow())
  731. + ThreadPoolManager.getInstance().scheduleGeneral(() -> {
  732. + final ItemInstance itemToTest = player.getInventory().getItemByObjectId(item.getObjectId());
  733. + if (itemToTest == null)
  734. + return;
  735. +
  736. + player.useEquippableItem(itemToTest, false);
  737. + }, player.getAttackEndTime() - System.currentTimeMillis());
  738. + else
  739. + player.useEquippableItem(item, true);
  740. + }
  741. + else
  742. + {
  743. + if (player.isCastingNow() && !(item.isPotion() || item.isElixir()))
  744. + return;
  745. +
  746. + if (player.getAttackType() == WeaponType.FISHINGROD && item.getItem().getItemType() == EtcItemType.LURE)
  747. + {
  748. + player.getInventory().setPaperdollItem(Inventory.PAPERDOLL_LHAND, item);
  749. + player.broadcastUserInfo();
  750. +
  751. + player.sendPacket(new ItemList(player, false));
  752. + return;
  753. + }
  754. +
  755. + final IItemHandler handler = ItemHandler.getInstance().getItemHandler(item.getEtcItem());
  756. + if (handler != null)
  757. + handler.useItem(player, item, false);
  758. +
  759. + for (Quest quest : item.getQuestEvents())
  760. + {
  761. + QuestState state = player.getQuestState(quest.getName());
  762. + if (state == null || !state.isStarted())
  763. + continue;
  764. +
  765. + quest.notifyItemUse(item, player, player.getTarget());
  766. + }
  767. + }
  768. + }
  769. +}
  770. diff --git a/java/Dev/AutoFarm/AutofarmSpell.java b/java/Dev/AutoFarm/AutofarmSpell.java
  771. new file mode 100644
  772. index 0000000..e4e86a7
  773. --- /dev/null
  774. +++ b/java/Dev/AutoFarm/AutofarmSpell.java
  775. @@ -0,0 +1,24 @@
  776. +package Dev.AutoFarm;
  777. +
  778. +public class AutofarmSpell
  779. +{
  780. + private final Integer _skillId;
  781. + private final AutofarmSpellType _spellType;
  782. +
  783. + public AutofarmSpell(Integer skillId, AutofarmSpellType spellType)
  784. + {
  785. +
  786. + _skillId = skillId;
  787. + _spellType = spellType;
  788. + }
  789. +
  790. + public Integer getSkillId()
  791. + {
  792. + return _skillId;
  793. + }
  794. +
  795. + public AutofarmSpellType getSpellType()
  796. + {
  797. + return _spellType;
  798. + }
  799. +}
  800. \ No newline at end of file
  801. diff --git a/java/Dev/AutoFarm/AutofarmSpellType.java b/java/Dev/AutoFarm/AutofarmSpellType.java
  802. new file mode 100644
  803. index 0000000..81a4d8b
  804. --- /dev/null
  805. +++ b/java/Dev/AutoFarm/AutofarmSpellType.java
  806. @@ -0,0 +1,10 @@
  807. +package Dev.AutoFarm;
  808. +
  809. +
  810. +public enum AutofarmSpellType
  811. +{
  812. + Attack,
  813. + Chance,
  814. + Self,
  815. + LowLife
  816. +}
  817. \ No newline at end of file
  818. diff --git a/java/Dev/Instance/Instance.java b/java/Dev/Instance/Instance.java
  819. new file mode 100644
  820. index 0000000..612cb6e
  821. --- /dev/null
  822. +++ b/java/Dev/Instance/Instance.java
  823. @@ -0,0 +1,45 @@
  824. +package Dev.Instance;
  825. +
  826. +import java.util.ArrayList;
  827. +import java.util.List;
  828. +
  829. +import net.sf.l2j.gameserver.model.actor.instance.Door;
  830. +
  831. +public class Instance
  832. +{
  833. + private int id;
  834. + private List<Door> doors;
  835. +
  836. + public Instance(int id)
  837. + {
  838. + this.id = id;
  839. + doors = new ArrayList<>();
  840. + }
  841. +
  842. + public void openDoors()
  843. + {
  844. + for (Door door : doors)
  845. + door.openMe();
  846. + }
  847. +
  848. + public void closeDoors()
  849. + {
  850. + for (Door door : doors)
  851. + door.closeMe();
  852. + }
  853. +
  854. + public void addDoor(Door door)
  855. + {
  856. + doors.add(door);
  857. + }
  858. +
  859. + public List<Door> getDoors()
  860. + {
  861. + return doors;
  862. + }
  863. +
  864. + public int getId()
  865. + {
  866. + return id;
  867. + }
  868. +}
  869. diff --git a/java/Dev/Instance/InstanceIdFactory.java b/java/Dev/Instance/InstanceIdFactory.java
  870. new file mode 100644
  871. index 0000000..14f4e23
  872. --- /dev/null
  873. +++ b/java/Dev/Instance/InstanceIdFactory.java
  874. @@ -0,0 +1,13 @@
  875. +package Dev.Instance;
  876. +
  877. +import java.util.concurrent.atomic.AtomicInteger;
  878. +
  879. +public final class InstanceIdFactory
  880. +{
  881. + private static AtomicInteger nextAvailable = new AtomicInteger(1);
  882. +
  883. + public synchronized static int getNextAvailable()
  884. + {
  885. + return nextAvailable.getAndIncrement();
  886. + }
  887. +}
  888. diff --git a/java/Dev/Instance/InstanceManager.java b/java/Dev/Instance/InstanceManager.java
  889. new file mode 100644
  890. index 0000000..42d4f25
  891. --- /dev/null
  892. +++ b/java/Dev/Instance/InstanceManager.java
  893. @@ -0,0 +1,59 @@
  894. +package Dev.Instance;
  895. +
  896. +import java.util.Map;
  897. +import java.util.concurrent.ConcurrentHashMap;
  898. +
  899. +import net.sf.l2j.gameserver.model.actor.instance.Door;
  900. +
  901. +
  902. +public class InstanceManager
  903. +{
  904. + private Map<Integer, Instance> instances;
  905. +
  906. + protected InstanceManager()
  907. + {
  908. + instances = new ConcurrentHashMap<>();
  909. + instances.put(0, new Instance(0));
  910. + }
  911. +
  912. + public void addDoor(int id, Door door)
  913. + {
  914. + if (!instances.containsKey(id) || id == 0)
  915. + return;
  916. +
  917. + instances.get(id).addDoor(door);
  918. + }
  919. +
  920. + public void deleteInstance(int id)
  921. + {
  922. + if (id == 0)
  923. + {
  924. + System.out.println("Attempt to delete instance with id 0.");
  925. + return;
  926. + }
  927. +
  928. + // delete doors
  929. + }
  930. +
  931. + public synchronized Instance createInstance()
  932. + {
  933. + Instance instance = new Instance(InstanceIdFactory.getNextAvailable());
  934. + instances.put(instance.getId(), instance);
  935. + return instance;
  936. + }
  937. +
  938. + public Instance getInstance(int id)
  939. + {
  940. + return instances.get(id);
  941. + }
  942. +
  943. + public static InstanceManager getInstance()
  944. + {
  945. + return SingletonHolder.instance;
  946. + }
  947. +
  948. + private static final class SingletonHolder
  949. + {
  950. + protected static final InstanceManager instance = new InstanceManager();
  951. + }
  952. +}
  953. diff --git a/java/net/sf/l2j/Config.java b/java/net/sf/l2j/Config.java
  954. index 742fe1a..07efedc 100644
  955. --- a/java/net/sf/l2j/Config.java
  956. +++ b/java/net/sf/l2j/Config.java
  957. @@ -50,6 +50,7 @@
  958. public static final String ENCHANTCONFIG = "./config/Custom/Enchant.properties";
  959. public static final String SKIN_FILE = "./config/Custom/Skin.properties";
  960. public static final String DONATE_FILE = "./config/Custom/Donate.properties";
  961. + public static final String AUTO_FARM = "./config/Custom/AutoFarm.properties";
  962. public static final String COMMANDS_FILE = "./config/Custom/Commands.properties";
  963. public static final String LASTHITBOSS = "./config/Custom/Events/LastHitBossEvent.properties";
  964. public static final String CHAMPION_EVENT = "./config/Custom/Events/ChampionEvent.properties";
  965. @@ -781,6 +782,11 @@
  966. public static int SKIN_GLOVES_RMAGICIAN;
  967. public static int SKIN_LEGS_RMAGICIAN;
  968.  
  969. +
  970. + /** Auto Farm Variaveis */
  971. + public static Integer AUTO_FARM_BAR;
  972. + public static int AUTO_FARM_RADIUS;
  973. +
  974. /** Donate Settings */
  975. public static boolean ALLOW_VIP_NCOLOR;
  976. public static int VIP_NCOLOR;
  977. @@ -1794,6 +1800,15 @@
  978.  
  979. }
  980.  
  981. + /**
  982. + * Loads AutoFarm Settings.<br>
  983. + */
  984. + private static final void loadAutoFarm()
  985. + {
  986. + final ExProperties farm = initProperties(AUTO_FARM);
  987. + AUTO_FARM_RADIUS = farm.getProperty("AutoFarmRadius", 600);
  988. + AUTO_FARM_BAR = farm.getProperty("AutoFarmBar", 0);
  989. + }
  990.  
  991. /**
  992. * Loads Donate Settings.<br>
  993. @@ -3222,6 +3237,9 @@
  994. // Donate Settings
  995. loadDonate();
  996.  
  997. + // Auto Farm Settings
  998. + loadAutoFarm();
  999. +
  1000. // Commands Settings
  1001. loadCommands();
  1002.  
  1003. diff --git a/java/net/sf/l2j/gameserver/GameServer.java b/java/net/sf/l2j/gameserver/GameServer.java
  1004. index 64d9bc4..21815ed 100644
  1005. --- a/java/net/sf/l2j/gameserver/GameServer.java
  1006. +++ b/java/net/sf/l2j/gameserver/GameServer.java
  1007. @@ -120,6 +120,7 @@
  1008. import Dev.Events.PartyFarm.InitialPartyFarm;
  1009. import Dev.Events.PartyFarm.PartyFarm;
  1010. import Dev.Events.PartyFarm.PartyZoneReward;
  1011. +import Dev.Instance.InstanceManager;
  1012. import Dev.SpecialMods.RaidBossInfoManager;
  1013.  
  1014. public class GameServer
  1015. @@ -249,6 +250,9 @@
  1016. SkillTable.getInstance();
  1017. SkillTreeData.getInstance();
  1018.  
  1019. + StringUtil.printSection("Instance Manager");
  1020. + InstanceManager.getInstance();
  1021. +
  1022. StringUtil.printSection("Items");
  1023. ItemTable.getInstance();
  1024. SummonItemData.getInstance();
  1025. diff --git a/java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java b/java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java
  1026. index 27d69c1..6076be5 100644
  1027. --- a/java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java
  1028. +++ b/java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java
  1029. @@ -26,6 +26,7 @@
  1030. import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminGmChat;
  1031. import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminHeal;
  1032. import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminHelpPage;
  1033. +import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminInstance;
  1034. import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminInvul;
  1035. import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminKick;
  1036. import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminKnownlist;
  1037. @@ -63,6 +64,7 @@
  1038.  
  1039. protected AdminCommandHandler()
  1040. {
  1041. + registerAdminCommandHandler(new AdminInstance());
  1042. registerAdminCommandHandler(new AdminCTFEngine());
  1043. registerAdminCommandHandler(new AdminTvTEngine());
  1044. registerAdminCommandHandler(new AdminCrazyRates());
  1045. diff --git a/java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java b/java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java
  1046. index 642b176..75a928c 100644
  1047. --- a/java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java
  1048. +++ b/java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java
  1049. @@ -16,6 +16,8 @@
  1050. import net.sf.l2j.gameserver.handler.voicedcommandhandlers.VoicedRanking;
  1051. import net.sf.l2j.gameserver.handler.voicedcommandhandlers.VoicedVipFree;
  1052.  
  1053. +import Dev.AutoFarm.AutofarmCommand;
  1054. +
  1055. public class VoicedCommandHandler
  1056. {
  1057. private final Map<Integer, IVoicedCommandHandler> _datatable = new HashMap<>();
  1058. @@ -27,6 +29,7 @@
  1059.  
  1060. protected VoicedCommandHandler()
  1061. {
  1062. + registerHandler(new AutofarmCommand());
  1063. registerHandler(new EventCMD());
  1064. // coloque aqui os comandos
  1065. if(Config.ENABLE_VOICED_DONATE)
  1066. diff --git a/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminInstance.java b/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminInstance.java
  1067. new file mode 100644
  1068. index 0000000..8c9fe50
  1069. --- /dev/null
  1070. +++ b/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminInstance.java
  1071. @@ -0,0 +1,72 @@
  1072. +package net.sf.l2j.gameserver.handler.admincommandhandlers;
  1073. +
  1074. +import java.util.StringTokenizer;
  1075. +
  1076. +import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
  1077. +import net.sf.l2j.gameserver.model.World;
  1078. +import net.sf.l2j.gameserver.model.actor.instance.Player;
  1079. +
  1080. +import Dev.Instance.InstanceManager;
  1081. +
  1082. +public class AdminInstance implements IAdminCommandHandler {
  1083. +
  1084. + @Override
  1085. + public boolean useAdminCommand(String command, Player activeChar) {
  1086. + if (command.startsWith("admin_resetmyinstance"))
  1087. + {
  1088. + activeChar.setInstance(InstanceManager.getInstance().getInstance(0), false);
  1089. + activeChar.sendMessage("Your instance is now default");
  1090. + }
  1091. + else if (command.startsWith("admin_instanceid"))
  1092. + {
  1093. + StringTokenizer st = new StringTokenizer(command, " ");
  1094. + st.nextToken(); // skip command
  1095. +
  1096. + if(!st.hasMoreTokens())
  1097. + {
  1098. + activeChar.sendMessage("Write the name.");
  1099. + return false;
  1100. + }
  1101. +
  1102. + String target_name = st.nextToken();
  1103. + Player player = World.getInstance().getPlayer(target_name);
  1104. + if(player == null)
  1105. + {
  1106. + activeChar.sendMessage("Player is offline");
  1107. + return false;
  1108. + }
  1109. +
  1110. + activeChar.sendMessage(""+target_name+ " instance id: " + player.getInstance().getId());
  1111. + }
  1112. + else if (command.startsWith("admin_getinstance"))
  1113. + {
  1114. + StringTokenizer st = new StringTokenizer(command, " ");
  1115. + st.nextToken(); // skip command
  1116. +
  1117. + if(!st.hasMoreTokens())
  1118. + {
  1119. + activeChar.sendMessage("Write the name.");
  1120. + return false;
  1121. + }
  1122. +
  1123. + String target_name = st.nextToken();
  1124. + Player player = World.getInstance().getPlayer(target_name);
  1125. + if(player == null)
  1126. + {
  1127. + activeChar.sendMessage("Player is offline");
  1128. + return false;
  1129. + }
  1130. +
  1131. + activeChar.setInstance(player.getInstance(), false);
  1132. + activeChar.sendMessage("You are with the same instance of player "+target_name);
  1133. + }
  1134. + return false;
  1135. + }
  1136. +
  1137. + @Override
  1138. + public String[] getAdminCommandList() {
  1139. +
  1140. + return new String [] {"admin_resetmyinstance","admin_getinstance","admin_instanceid"};
  1141. + }
  1142. +
  1143. +}
  1144. diff --git a/java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/VoicedMenu.java b/java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/VoicedMenu.java
  1145. index b853fcc..964f0e7 100644
  1146. --- a/java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/VoicedMenu.java
  1147. +++ b/java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/VoicedMenu.java
  1148. @@ -30,6 +30,8 @@
  1149. import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage;
  1150. import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
  1151.  
  1152. +import Dev.AutoFarm.AutofarmManager;
  1153. +
  1154. public class VoicedMenu implements IVoicedCommandHandler
  1155. {
  1156. private static final String[] VOICED_COMMANDS =
  1157. @@ -70,6 +72,14 @@
  1158. else if (command.equals("info_pt"))
  1159. showInfoPtHtml(activeChar);
  1160.  
  1161. + else if (command.equals("vip"))
  1162. + {
  1163. + if (activeChar.isVip())
  1164. + sendVipWindow(activeChar);
  1165. + else if(!activeChar.isVip())
  1166. + activeChar.sendMessage("You are not VIP member.");
  1167. + }
  1168. +
  1169. else if (command.equals("info_sp"))
  1170. showInfoSpHtml(activeChar);
  1171. else if (command.equals("setxpnot"))
  1172. @@ -1433,7 +1443,16 @@
  1173. html.replace("%pet_food_rate%", String.valueOf(Config.PET_FOOD_RATE));
  1174. activeChar.sendPacket(html);
  1175. }
  1176. -
  1177. + public static void sendVipWindow(Player activeChar)
  1178. + { String autofarmOn= "<button width=38 height=38 back=\"L2UI_NewTex.AutomaticPlay.CombatBTNOff_Over\" fore=\"L2UI_NewTex.AutomaticPlay.CombatBTNON_Normal\" action=\"bypass voiced_farm\" value=\"\">";
  1179. + String autofarmOff= "<button width=38 height=38 back=\"L2UI_NewTex.AutomaticPlay.CombatBTNON_Over\" fore=\"L2UI_NewTex.AutomaticPlay.CombatBTNOff_Normal\" action=\"bypass voiced_farm\" value=\"\">";
  1180. +
  1181. + NpcHtmlMessage html = new NpcHtmlMessage(0);
  1182. + html.setFile("data/html/mods/menu/AutoFarm.htm");
  1183. + html.replace("%AutoFarmActived%", AutofarmManager.INSTANCE.isAutofarming(activeChar) ? "<img src=\"panel.online\" width=\"16\" height=\"16\">" : "<img src=\"panel.offline\" width=\"16\" height=\"16\">");
  1184. + html.replace("%autoFarmButton%", AutofarmManager.INSTANCE.isAutofarming(activeChar) ? autofarmOn : autofarmOff);
  1185. + activeChar.sendPacket(html);
  1186. + }
  1187. private static void showInfoSpHtml(Player activeChar)
  1188. {
  1189. NpcHtmlMessage html = new NpcHtmlMessage(0);
  1190. diff --git a/java/net/sf/l2j/gameserver/model/WorldObject.java b/java/net/sf/l2j/gameserver/model/WorldObject.java
  1191. index 70ba6c6..4a698d3 100644
  1192. --- a/java/net/sf/l2j/gameserver/model/WorldObject.java
  1193. +++ b/java/net/sf/l2j/gameserver/model/WorldObject.java
  1194. @@ -19,6 +19,9 @@
  1195. import net.sf.l2j.gameserver.model.zone.ZoneId;
  1196. import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
  1197.  
  1198. +import Dev.Instance.Instance;
  1199. +import Dev.Instance.InstanceManager;
  1200. +
  1201. /**
  1202. * Mother class of all interactive objects in the world (PC, NPC, Item...)
  1203. */
  1204. @@ -442,7 +445,24 @@
  1205.  
  1206. return result;
  1207. }
  1208. + /** instance system */
  1209. + private Instance _instance = InstanceManager.getInstance().getInstance(0);
  1210.  
  1211. + public void setInstance(Instance instance, boolean silent)
  1212. + {
  1213. + _instance = instance;
  1214. +
  1215. + if(!silent)
  1216. + {
  1217. + decayMe();
  1218. + spawnMe();
  1219. + }
  1220. + }
  1221. +
  1222. + public Instance getInstance()
  1223. + {
  1224. + return _instance;
  1225. + }
  1226. /**
  1227. * Return the known list of given object type within specified radius.
  1228. * @param <A> : Object type must be instance of {@link WorldObject}.
  1229.  
  1230. result.add((A) obj);
  1231. diff --git a/java/net/sf/l2j/gameserver/model/actor/Attackable.java b/java/net/sf/l2j/gameserver/model/actor/Attackable.java
  1232. index 368fe2d..8f9e154 100644
  1233. --- a/java/net/sf/l2j/gameserver/model/actor/Attackable.java
  1234. +++ b/java/net/sf/l2j/gameserver/model/actor/Attackable.java
  1235. @@ -1274,6 +1274,7 @@
  1236. {
  1237. // Init the dropped ItemInstance and add it in the world as a visible object at the position where mob was last
  1238. item = ItemTable.getInstance().createItem("Loot", holder.getId(), holder.getValue(), mainDamageDealer, this);
  1239. + item.setInstance(getInstance(), false);
  1240. item.dropMe(this, getX() + Rnd.get(-70, 70), getY() + Rnd.get(-70, 70), Math.max(getZ(), mainDamageDealer.getZ()) + 20);
  1241.  
  1242. // If stackable, end loop as entire count is included in 1 instance of item
  1243. diff --git a/java/net/sf/l2j/gameserver/model/actor/Summon.java b/java/net/sf/l2j/gameserver/model/actor/Summon.java
  1244. index 9c37a1e..5aa110b 100644
  1245. --- a/java/net/sf/l2j/gameserver/model/actor/Summon.java
  1246. +++ b/java/net/sf/l2j/gameserver/model/actor/Summon.java
  1247. @@ -55,7 +55,7 @@
  1248. public Summon(int objectId, NpcTemplate template, Player owner)
  1249. {
  1250. super(objectId, template);
  1251. -
  1252. + setInstance(owner.getInstance(), true);
  1253. for (L2Skill skill : template.getSkills(SkillType.PASSIVE))
  1254. addStatFuncs(skill.getStatFuncs(this));
  1255.  
  1256. diff --git a/java/net/sf/l2j/gameserver/model/actor/instance/Player.java b/java/net/sf/l2j/gameserver/model/actor/instance/Player.java
  1257. index ebd8bb6..a83a7ea 100644
  1258. --- a/java/net/sf/l2j/gameserver/model/actor/instance/Player.java
  1259. +++ b/java/net/sf/l2j/gameserver/model/actor/instance/Player.java
  1260. @@ -2633,7 +2633,7 @@
  1261.  
  1262. return false;
  1263. }
  1264. + item.setInstance(getInstance(), true); // True because Drop me will spawn it
  1265. item.dropMe(this, getX() + Rnd.get(-25, 25), getY() + Rnd.get(-25, 25), getZ() + 20);
  1266.  
  1267. // Send inventory update packet
  1268. @@ -2865,7 +2865,7 @@
  1269. }
  1270.  
  1271. @Override
  1272. - protected boolean checkDoCastConditions(L2Skill skill)
  1273. + public boolean checkDoCastConditions(L2Skill skill)
  1274. {
  1275. if (!super.checkDoCastConditions(skill))
  1276. return false;
  1277. diff --git a/java/net/sf/l2j/gameserver/skills/l2skills/L2SkillSummon.java b/java/net/sf/l2j/gameserver/skills/l2skills/L2SkillSummon.java
  1278. index d06f799..3a090c1 100644
  1279. --- a/java/net/sf/l2j/gameserver/skills/l2skills/L2SkillSummon.java
  1280. +++ b/java/net/sf/l2j/gameserver/skills/l2skills/L2SkillSummon.java
  1281. @@ -213,6 +213,7 @@
  1282. summon.setCurrentHp(summon.getMaxHp());
  1283. summon.setCurrentMp(summon.getMaxMp());
  1284. summon.setHeading(activeChar.getHeading());
  1285. + summon.setInstance(activeChar.getInstance(), true);
  1286. summon.setRunning();
  1287. activeChar.setPet(summon);
  1288.  
  1289.  
  1290.  
  1291. HTML Auto Farm
  1292.  
  1293. <html imgsrc="Ressurge.bkg"><title>L2jserver - VIP</title><body><center>
  1294. <center>
  1295. <br>
  1296. <table width=250>
  1297. <tr>
  1298.  
  1299. <td width=20><font color="00FF00"> ACESSO VIP EXCLUSIVO</font></td>
  1300.  
  1301. </tr>
  1302. </table>
  1303. </center>
  1304. <br>
  1305. <img src="L2UI.SquareBlank" width=300 height=1>
  1306. <table width=305 bgcolor="000000">
  1307. <tr>
  1308. <td><center><font color="LEVEL"> Buscamos entregar o melhor Lineage II Player Solo</font></center></td></tr><br1>
  1309. </table>
  1310. <br>
  1311. <center><table align=center>
  1312. <tr>
  1313.  
  1314. <td><button value="SKINS ACTIVED" action="bypass voiced_skins" width=120 height=21 back="lineagenppc.y120" fore="lineagenppc.y120" over="lineagenppc.y120"></td>
  1315.  
  1316. </tr>
  1317. </table></center>
  1318. <center><table align=center>
  1319. <tr>
  1320.  
  1321. <td><button value="CONSUMABLES VIP" action="bypass voiced_multisell consumables-vip-custom" width=120 height=21 back="lineagenppc.g120" fore="lineagenppc.g120" over="lineagenppc.g120"></td>
  1322.  
  1323. </tr>
  1324. </table></center><br>
  1325. <table width=130>
  1326. <tr>
  1327. <td width=20><img src="l2UI_Valhalla_3.24Hz_DF_ChannelControlBtn_Next" width=18 height=18></td>
  1328. <td width=20><font color="FF0000"> Auto Farm </font></td>
  1329. <td width=20><img src="l2UI_Valhalla_3.24Hz_DF_ChannelControlBtn_Pre" width=18 height=18></td>
  1330. </tr>
  1331. </table>
  1332. <br><br><br><br><br><br>
  1333. <table cellspacing=-39 cellpadding=0>
  1334. <tr> <!-- Botão Back -->
  1335. <td align=center>
  1336. <img src="L2UI_NewTex.AutomaticPlay.AutoPlaySlotON_BG_Over" width=97 height=95>
  1337. </td>
  1338. </tr>
  1339. </table>
  1340. <table cellspacing=-38 cellpadding=2>
  1341. <tr> <!-- Botão Back -->
  1342. <td align=center>
  1343. <button width=61 height=62 back="L2UI_NewTex.AutomaticPlay.AutoPlaySlotIconTarget" fore="L2UI_NewTex.AutomaticPlay.AutoPlaySlotIconTargetON" action="bypass voiced_farm" value="">
  1344. </td>
  1345. </tr>
  1346. </table>
  1347. <table cellspacing=-42 cellpadding=0>
  1348. <tr> <!-- Botão Back -->
  1349. <td align=center>
  1350. <button width=85 height=70 back="L2UI_NewTex.AutomaticPlay.AutoPlayONAni_001" fore="L2UI_NewTex.AutomaticPlay.AutoPlayONAni_001" action="" value="">
  1351. </td>
  1352. </tr>
  1353. </table>
  1354. <table cellspacing=-36 cellpadding=-23>
  1355. <tr> <!-- Botão Back -->
  1356. <td align=center>
  1357. <img src="L2UI_NewTex.AutomaticPlay.AutoCircleFrame" width=120 height=128>
  1358. </td>
  1359. </tr>
  1360. </table>
  1361. <br>
  1362. <br>
  1363. <br>
  1364. <img src="L2UI.SquareBlank" width=300 height=2>
  1365. <table width=21 cellspacing=0 cellpadding=-25>
  1366. <tr> <!-- Botão Back -->
  1367. <td align=right>
  1368. <font color="LEVEL">%AutoFarmActived%</font>
  1369. </td>
  1370. </tr>
  1371. </table>
  1372.  
  1373.  
  1374.  
  1375. <br><br>
  1376.  
  1377.  
  1378.  
  1379.  
  1380.  
  1381.  
  1382. <br><br><br><br>
  1383. <tr>
  1384. <td><button value="Voltar" action="bypass voiced_menu" width=75 height=22 back="L2UI_CH3.Btn1_normalDisable" fore="L2UI_CH3.Btn1_normal" over="L2UI_CH3.Btn1_normal_over"></td>
  1385. </tr>
  1386.  
  1387.  
  1388.  
  1389.  
  1390.  
  1391.  
  1392.  
  1393.  
  1394.  
  1395.  
  1396.  
  1397.  
  1398. </body></html>
  1399.  
RAW Paste Data