diff --git a/trunk/dist/game/config/Character.ini b/trunk/dist/game/config/Character.ini index 8c5336795c..3ebae86c57 100644 --- a/trunk/dist/game/config/Character.ini +++ b/trunk/dist/game/config/Character.ini @@ -757,6 +757,10 @@ ExpertisePenalty = True # Default: True StoreCharUiSettings = True +# Enable automatic Shot usage on player login or weapon equipped. +# Default: True +EnableAutoShots = True + # Character name restriction # Disallow characters to have a name which contains the words. # Split them with ",". Example: announcements,announce... diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/Summon.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/Summon.java index 16aa6892ab..5650302d2d 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/Summon.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/Summon.java @@ -113,6 +113,6 @@ public final class Summon extends AbstractEffect summon.setRunning(); summon.spawnMe(); - player.handleAutoShots(); + player.handleAutoShots(false); } } diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonMulti.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonMulti.java index 53cd916380..e86bb9078a 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonMulti.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonMulti.java @@ -104,6 +104,6 @@ public final class SummonMulti extends AbstractEffect summon.setRunning(); summon.spawnMe(); - player.handleAutoShots(); + player.handleAutoShots(false); } } diff --git a/trunk/dist/game/data/scripts/handlers/itemhandlers/BlessedSpiritShot.java b/trunk/dist/game/data/scripts/handlers/itemhandlers/BlessedSpiritShot.java index 61f990231a..434763e4f5 100644 --- a/trunk/dist/game/data/scripts/handlers/itemhandlers/BlessedSpiritShot.java +++ b/trunk/dist/game/data/scripts/handlers/itemhandlers/BlessedSpiritShot.java @@ -42,21 +42,20 @@ public class BlessedSpiritShot implements IItemHandler return false; } - final L2PcInstance activeChar = (L2PcInstance) playable; + final L2PcInstance activeChar = playable.getActingPlayer(); final L2ItemInstance weaponInst = activeChar.getActiveWeaponInstance(); final L2Weapon weaponItem = activeChar.getActiveWeaponItem(); final List skills = item.getItem().getSkills(ItemSkillType.NORMAL); - - final int itemId = item.getId(); - if (skills == null) { _log.warning(getClass().getSimpleName() + ": is missing skills!"); return false; } + final int itemId = item.getId(); + // Check if Blessed SpiritShot can be used - if ((weaponInst == null) || (weaponItem == null) || (weaponItem.getSpiritShotCount() == 0)) + if ((weaponInst == null) || (weaponItem.getSpiritShotCount() == 0)) { if (!activeChar.getAutoSoulShot().contains(itemId)) { @@ -94,10 +93,14 @@ public class BlessedSpiritShot implements IItemHandler return false; } - // Send message to client - activeChar.sendPacket(SystemMessageId.YOUR_SPIRITSHOT_HAS_BEEN_ENABLED); - activeChar.setChargedShot(ShotType.BLESSED_SPIRITSHOTS, true); + // Charge Spirit shot + activeChar.setChargedShot(ShotType.SPIRITSHOTS, true); + // Send message to client + if (!activeChar.getAutoSoulShot().contains(item.getId())) + { + activeChar.sendPacket(SystemMessageId.YOUR_SPIRITSHOT_HAS_BEEN_ENABLED); + } skills.forEach(holder -> Broadcast.toSelfAndKnownPlayersInRadius(activeChar, new MagicSkillUse(activeChar, activeChar, holder.getSkillId(), holder.getSkillLvl(), 0, 0), 600)); return true; } diff --git a/trunk/dist/game/data/scripts/handlers/itemhandlers/SoulShots.java b/trunk/dist/game/data/scripts/handlers/itemhandlers/SoulShots.java index a5ed4703d9..4c32af9452 100644 --- a/trunk/dist/game/data/scripts/handlers/itemhandlers/SoulShots.java +++ b/trunk/dist/game/data/scripts/handlers/itemhandlers/SoulShots.java @@ -109,7 +109,10 @@ public class SoulShots implements IItemHandler } // Send message to client - activeChar.sendPacket(SystemMessageId.YOUR_SOULSHOTS_ARE_ENABLED); + if (!activeChar.getAutoSoulShot().contains(item.getId())) + { + activeChar.sendPacket(SystemMessageId.YOUR_SOULSHOTS_ARE_ENABLED); + } skills.forEach(holder -> Broadcast.toSelfAndKnownPlayersInRadius(activeChar, new MagicSkillUse(activeChar, activeChar, holder.getSkillId(), holder.getSkillLvl(), 0, 0), 600)); return true; } diff --git a/trunk/dist/game/data/scripts/handlers/itemhandlers/SpiritShot.java b/trunk/dist/game/data/scripts/handlers/itemhandlers/SpiritShot.java index 00576dea0f..20f38a25e7 100644 --- a/trunk/dist/game/data/scripts/handlers/itemhandlers/SpiritShot.java +++ b/trunk/dist/game/data/scripts/handlers/itemhandlers/SpiritShot.java @@ -42,7 +42,7 @@ public class SpiritShot implements IItemHandler return false; } - final L2PcInstance activeChar = (L2PcInstance) playable; + final L2PcInstance activeChar = playable.getActingPlayer(); final L2ItemInstance weaponInst = activeChar.getActiveWeaponInstance(); final L2Weapon weaponItem = activeChar.getActiveWeaponItem(); final List skills = item.getItem().getSkills(ItemSkillType.NORMAL); @@ -54,7 +54,7 @@ public class SpiritShot implements IItemHandler final int itemId = item.getId(); - // Check if Spirit shot can be used + // Check if SpiritShot can be used if ((weaponInst == null) || (weaponItem.getSpiritShotCount() == 0)) { if (!activeChar.getAutoSoulShot().contains(itemId)) @@ -64,12 +64,13 @@ public class SpiritShot implements IItemHandler return false; } - // Check if Spirit shot is already active + // Check if SpiritShot is already active if (activeChar.isChargedShot(ShotType.SPIRITSHOTS)) { return false; } + // Check for correct grade final boolean gradeCheck = item.isEtcItem() && (item.getEtcItem().getDefaultAction() == ActionType.SPIRITSHOT) && (weaponInst.getItem().getCrystalTypePlus() == item.getItem().getCrystalTypePlus()); if (!gradeCheck) @@ -82,7 +83,7 @@ public class SpiritShot implements IItemHandler return false; } - // Consume Spirit shot if player has enough of them + // Consume SpiritShot if player has enough of them if (!activeChar.destroyItemWithoutTrace("Consume", item.getObjectId(), weaponItem.getSpiritShotCount(), null, false)) { if (!activeChar.disableAutoShot(itemId)) @@ -96,7 +97,10 @@ public class SpiritShot implements IItemHandler activeChar.setChargedShot(ShotType.SPIRITSHOTS, true); // Send message to client - activeChar.sendPacket(SystemMessageId.YOUR_SPIRITSHOT_HAS_BEEN_ENABLED); + if (!activeChar.getAutoSoulShot().contains(item.getId())) + { + activeChar.sendPacket(SystemMessageId.YOUR_SPIRITSHOT_HAS_BEEN_ENABLED); + } skills.forEach(holder -> Broadcast.toSelfAndKnownPlayersInRadius(activeChar, new MagicSkillUse(activeChar, activeChar, holder.getSkillId(), holder.getSkillLvl(), 0, 0), 600)); return true; } diff --git a/trunk/java/com/l2jmobius/Config.java b/trunk/java/com/l2jmobius/Config.java index f5d866a37f..bb7f8ddcf1 100644 --- a/trunk/java/com/l2jmobius/Config.java +++ b/trunk/java/com/l2jmobius/Config.java @@ -254,6 +254,7 @@ public final class Config public static boolean EXPERTISE_PENALTY; public static boolean STORE_RECIPE_SHOPLIST; public static boolean STORE_UI_SETTINGS; + public static boolean ENABLE_AUTO_SHOTS; public static String[] FORBIDDEN_NAMES; public static boolean SILENCE_MODE_EXCLUDE; public static boolean SHOW_GOD_VIDEO_INTRO; @@ -1545,6 +1546,7 @@ public final class Config EXPERTISE_PENALTY = Character.getBoolean("ExpertisePenalty", true); STORE_RECIPE_SHOPLIST = Character.getBoolean("StoreRecipeShopList", false); STORE_UI_SETTINGS = Character.getBoolean("StoreCharUiSettings", true); + ENABLE_AUTO_SHOTS = Character.getBoolean("EnableAutoShots", true); FORBIDDEN_NAMES = Character.getString("ForbiddenNames", "").split(","); SILENCE_MODE_EXCLUDE = Character.getBoolean("SilenceModeExclude", false); SHOW_GOD_VIDEO_INTRO = Character.getBoolean("GoDVideoIntro", true); diff --git a/trunk/java/com/l2jmobius/gameserver/model/actor/instance/L2PcInstance.java b/trunk/java/com/l2jmobius/gameserver/model/actor/instance/L2PcInstance.java index f8f6b7eb24..aa3f603942 100644 --- a/trunk/java/com/l2jmobius/gameserver/model/actor/instance/L2PcInstance.java +++ b/trunk/java/com/l2jmobius/gameserver/model/actor/instance/L2PcInstance.java @@ -13798,8 +13798,13 @@ public final class L2PcInstance extends L2Playable } } - public void handleAutoShots() + public void handleAutoShots(boolean force) { + if (getAutoSoulShot().isEmpty() && !force) + { + return; + } + final L2ItemInstance weapon = getActiveWeaponInstance(); int soulShotId = 0; int spiritShotId = 0; @@ -13853,10 +13858,40 @@ public final class L2PcInstance extends L2Playable } } - sendPacket(new ExAutoSoulShot(soulShotId, true, 1)); - sendPacket(new ExAutoSoulShot(spiritShotId, true, 2)); - sendPacket(new ExAutoSoulShot(summonSoulShotId, true, 3)); - sendPacket(new ExAutoSoulShot(summonSpiritShotId, true, 4)); + for (int shotId : getAutoSoulShot()) + { + if ((shotId != soulShotId) && (shotId != spiritShotId) && (shotId != summonSoulShotId) && (shotId != summonSpiritShotId)) + { + removeAutoSoulShot(shotId); + } + } + + if (soulShotId != 0) + { + addAutoSoulShot(soulShotId); + } + if (spiritShotId != 0) + { + addAutoSoulShot(spiritShotId); + } + if (summonSoulShotId != 0) + { + addAutoSoulShot(summonSoulShotId); + } + if (summonSpiritShotId != 0) + { + addAutoSoulShot(summonSpiritShotId); + } + + sendPacket(new ExAutoSoulShot(soulShotId, true, 0)); + sendPacket(new ExAutoSoulShot(spiritShotId, true, 1)); + sendPacket(new ExAutoSoulShot(summonSoulShotId, true, 2)); + sendPacket(new ExAutoSoulShot(summonSpiritShotId, true, 3)); + + if (!getAutoSoulShot().isEmpty()) + { + rechargeShots(true, true, true); + } } public GroupType getGroupType() diff --git a/trunk/java/com/l2jmobius/gameserver/model/itemcontainer/Inventory.java b/trunk/java/com/l2jmobius/gameserver/model/itemcontainer/Inventory.java index 7b7b6db643..bda2d4101f 100644 --- a/trunk/java/com/l2jmobius/gameserver/model/itemcontainer/Inventory.java +++ b/trunk/java/com/l2jmobius/gameserver/model/itemcontainer/Inventory.java @@ -374,7 +374,7 @@ public abstract class Inventory extends ItemContainer if (item.isWeapon()) { - player.handleAutoShots(); + player.handleAutoShots(false); } } @@ -470,7 +470,7 @@ public abstract class Inventory extends ItemContainer if (item.isWeapon()) { - player.handleAutoShots(); + player.handleAutoShots(Config.ENABLE_AUTO_SHOTS); } } } diff --git a/trunk/java/com/l2jmobius/gameserver/model/itemcontainer/PcInventory.java b/trunk/java/com/l2jmobius/gameserver/model/itemcontainer/PcInventory.java index 9b4f5e7b3a..601777a7a8 100644 --- a/trunk/java/com/l2jmobius/gameserver/model/itemcontainer/PcInventory.java +++ b/trunk/java/com/l2jmobius/gameserver/model/itemcontainer/PcInventory.java @@ -460,7 +460,7 @@ public class PcInventory extends Inventory if (item.isEtcItem() && (item.getItemType() == EtcItemType.SOULSHOT)) { - actor.handleAutoShots(); + actor.handleAutoShots(false); } // Notify to scripts @@ -516,7 +516,7 @@ public class PcInventory extends Inventory if (item.isEtcItem() && (item.getItemType() == EtcItemType.SOULSHOT)) { - actor.handleAutoShots(); + actor.handleAutoShots(false); } // Notify to scripts diff --git a/trunk/java/com/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/trunk/java/com/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 3c75f46a67..6d07f6d269 100644 --- a/trunk/java/com/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/trunk/java/com/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -63,6 +63,7 @@ import com.l2jmobius.gameserver.network.serverpackets.CreatureSay; import com.l2jmobius.gameserver.network.serverpackets.Die; import com.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate; import com.l2jmobius.gameserver.network.serverpackets.ExAdenaInvenCount; +import com.l2jmobius.gameserver.network.serverpackets.ExAutoSoulShot; import com.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import com.l2jmobius.gameserver.network.serverpackets.ExBeautyItemList; import com.l2jmobius.gameserver.network.serverpackets.ExCastleState; @@ -616,7 +617,18 @@ public class EnterWorld implements IClientIncomingPacket activeChar.sendPacket(new ExWorldChatCnt(activeChar)); activeChar.sendPacket(new ExOneDayReceiveRewardList(activeChar)); activeChar.sendPacket(ExConnectedTimeAndGettableReward.STATIC_PACKET); - activeChar.handleAutoShots(); + + if (Config.ENABLE_AUTO_SHOTS) + { + activeChar.handleAutoShots(true); + } + else + { + activeChar.sendPacket(new ExAutoSoulShot(0, false, 0)); + activeChar.sendPacket(new ExAutoSoulShot(0, false, 1)); + activeChar.sendPacket(new ExAutoSoulShot(0, false, 2)); + activeChar.sendPacket(new ExAutoSoulShot(0, false, 3)); + } } /** diff --git a/trunk/java/com/l2jmobius/gameserver/network/clientpackets/RequestAutoSoulShot.java b/trunk/java/com/l2jmobius/gameserver/network/clientpackets/RequestAutoSoulShot.java index 46360d1d0b..b92f3098a3 100644 --- a/trunk/java/com/l2jmobius/gameserver/network/clientpackets/RequestAutoSoulShot.java +++ b/trunk/java/com/l2jmobius/gameserver/network/clientpackets/RequestAutoSoulShot.java @@ -184,9 +184,13 @@ public final class RequestAutoSoulShot implements IClientIncomingPacket case SPIRITSHOT: case SOULSHOT: case FISHINGSHOT: + { return true; + } default: + { return false; + } } } @@ -196,9 +200,13 @@ public final class RequestAutoSoulShot implements IClientIncomingPacket { case SUMMON_SPIRITSHOT: case SUMMON_SOULSHOT: + { return true; + } default: + { return false; + } } } }