From d42c5dbdacb4c81b9877458c3574ab76d4eae9dd Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Thu, 10 Oct 2019 17:09:25 +0000 Subject: [PATCH] Implementation for auto play pickup. --- .../model/actor/instance/PlayerInstance.java | 42 +++++++++++++++++-- .../clientpackets/ExAutoPlaySetting.java | 2 +- .../model/actor/instance/PlayerInstance.java | 42 +++++++++++++++++-- .../clientpackets/ExAutoPlaySetting.java | 2 +- 4 files changed, 78 insertions(+), 10 deletions(-) diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java index bb37e68af2..61ec6b3629 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java @@ -14065,7 +14065,7 @@ public class PlayerInstance extends Playable _autoPlayTask = null; } - public void startAutoPlayTask(boolean longRange, boolean respectfulHunting) + public void startAutoPlayTask(boolean pickup, boolean longRange, boolean respectfulHunting) { if (_autoPlayTask != null) { @@ -14074,26 +14074,59 @@ public class PlayerInstance extends Playable _autoPlayTask = ThreadPool.scheduleAtFixedRate(() -> { + // Skip thinking. if ((getTarget() != null) && getTarget().isMonster() && (((MonsterInstance) getTarget()).getTarget() == this) && !((MonsterInstance) getTarget()).isAlikeDead()) { sendPacket(ExAutoPlayDoMacro.STATIC_PACKET); return; } + // Pickup. + if (pickup) + { + for (ItemInstance droppedItem : World.getInstance().getVisibleObjectsInRange(this, ItemInstance.class, 200)) + { + // Check if item is reachable. + if ((droppedItem == null) // + || (!droppedItem.isSpawned()) // + || !GeoEngine.getInstance().canMoveToTarget(getX(), getY(), getZ(), droppedItem.getX(), droppedItem.getY(), droppedItem.getZ(), getInstanceWorld())) + { + continue; + } + + // Move to item. + if (calculateDistance2D(droppedItem) > 50) + { + moveToLocation(droppedItem.getX(), droppedItem.getY(), droppedItem.getZ(), 0); + return; + } + + // Try to pick it up. + if (!droppedItem.isProtected() || (droppedItem.getOwnerId() == getObjectId())) + { + doPickupItem(droppedItem); + return; // Avoid pickup being skipped. + } + } + } + + // Find target. MonsterInstance monster = null; double closestDistance = Double.MAX_VALUE; - for (MonsterInstance nearby : World.getInstance().getVisibleObjectsInRange(this, MonsterInstance.class, longRange ? 600 : 1400)) + for (MonsterInstance nearby : World.getInstance().getVisibleObjectsInRange(this, MonsterInstance.class, longRange ? 1400 : 600)) { + // Skip unavailable monsters. if ((nearby == null) || nearby.isAlikeDead()) { continue; } + // Check monster target. if (respectfulHunting && (nearby.getTarget() != null) && (nearby.getTarget() != this)) { continue; } + // Check if monster is reachable. if (nearby.isAutoAttackable(this) // - && GeoEngine.getInstance().canSeeTarget(this, nearby)// && GeoEngine.getInstance().canMoveToTarget(getX(), getY(), getZ(), nearby.getX(), nearby.getY(), nearby.getZ(), getInstanceWorld())) { final double monsterDistance = calculateDistance2D(nearby); @@ -14105,11 +14138,12 @@ public class PlayerInstance extends Playable } } + // New target was assigned. if (monster != null) { setTarget(monster); sendPacket(ExAutoPlayDoMacro.STATIC_PACKET); } - }, 0, 2000); + }, 0, 1000); } } diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/ExAutoPlaySetting.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/ExAutoPlaySetting.java index c2eeefe7a0..f9f7de18c2 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/ExAutoPlaySetting.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/ExAutoPlaySetting.java @@ -60,7 +60,7 @@ public class ExAutoPlaySetting implements IClientIncomingPacket if (_active) { - player.startAutoPlayTask(_longRange, _respectfulHunting); + player.startAutoPlayTask(_pickUp, _longRange, _respectfulHunting); } else { diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java index 3a87621935..1c1f015844 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java @@ -14014,7 +14014,7 @@ public class PlayerInstance extends Playable _autoPlayTask = null; } - public void startAutoPlayTask(boolean longRange, boolean respectfulHunting) + public void startAutoPlayTask(boolean pickup, boolean longRange, boolean respectfulHunting) { if (_autoPlayTask != null) { @@ -14023,26 +14023,59 @@ public class PlayerInstance extends Playable _autoPlayTask = ThreadPool.scheduleAtFixedRate(() -> { + // Skip thinking. if ((getTarget() != null) && getTarget().isMonster() && (((MonsterInstance) getTarget()).getTarget() == this) && !((MonsterInstance) getTarget()).isAlikeDead()) { sendPacket(ExAutoPlayDoMacro.STATIC_PACKET); return; } + // Pickup. + if (pickup) + { + for (ItemInstance droppedItem : World.getInstance().getVisibleObjectsInRange(this, ItemInstance.class, 200)) + { + // Check if item is reachable. + if ((droppedItem == null) // + || (!droppedItem.isSpawned()) // + || !GeoEngine.getInstance().canMoveToTarget(getX(), getY(), getZ(), droppedItem.getX(), droppedItem.getY(), droppedItem.getZ(), getInstanceWorld())) + { + continue; + } + + // Move to item. + if (calculateDistance2D(droppedItem) > 50) + { + moveToLocation(droppedItem.getX(), droppedItem.getY(), droppedItem.getZ(), 0); + return; + } + + // Try to pick it up. + if (!droppedItem.isProtected() || (droppedItem.getOwnerId() == getObjectId())) + { + doPickupItem(droppedItem); + return; // Avoid pickup being skipped. + } + } + } + + // Find target. MonsterInstance monster = null; double closestDistance = Double.MAX_VALUE; - for (MonsterInstance nearby : World.getInstance().getVisibleObjectsInRange(this, MonsterInstance.class, longRange ? 600 : 1400)) + for (MonsterInstance nearby : World.getInstance().getVisibleObjectsInRange(this, MonsterInstance.class, longRange ? 1400 : 600)) { + // Skip unavailable monsters. if ((nearby == null) || nearby.isAlikeDead()) { continue; } + // Check monster target. if (respectfulHunting && (nearby.getTarget() != null) && (nearby.getTarget() != this)) { continue; } + // Check if monster is reachable. if (nearby.isAutoAttackable(this) // - && GeoEngine.getInstance().canSeeTarget(this, nearby)// && GeoEngine.getInstance().canMoveToTarget(getX(), getY(), getZ(), nearby.getX(), nearby.getY(), nearby.getZ(), getInstanceWorld())) { final double monsterDistance = calculateDistance2D(nearby); @@ -14054,11 +14087,12 @@ public class PlayerInstance extends Playable } } + // New target was assigned. if (monster != null) { setTarget(monster); sendPacket(ExAutoPlayDoMacro.STATIC_PACKET); } - }, 0, 2000); + }, 0, 1000); } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/ExAutoPlaySetting.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/ExAutoPlaySetting.java index c2eeefe7a0..f9f7de18c2 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/ExAutoPlaySetting.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/ExAutoPlaySetting.java @@ -60,7 +60,7 @@ public class ExAutoPlaySetting implements IClientIncomingPacket if (_active) { - player.startAutoPlayTask(_longRange, _respectfulHunting); + player.startAutoPlayTask(_pickUp, _longRange, _respectfulHunting); } else {