Support for auto use summon skills.

This commit is contained in:
MobiusDevelopment
2022-03-24 23:13:01 +00:00
parent 5d4d64bf34
commit 4c9bb1e4cf
43 changed files with 750 additions and 143 deletions
@@ -5477,7 +5477,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5479,7 +5479,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5481,7 +5481,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5477,7 +5477,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5493,7 +5493,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5493,7 +5493,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5494,7 +5494,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5459,7 +5459,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.ActionDataHolder;
import org.l2jmobius.gameserver.model.ShortCuts; import org.l2jmobius.gameserver.model.ShortCuts;
import org.l2jmobius.gameserver.model.Shortcut; import org.l2jmobius.gameserver.model.Shortcut;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.Summon;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -80,6 +81,24 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
if (shortcut.getType() == ShortcutType.SKILL) if (shortcut.getType() == ShortcutType.SKILL)
{ {
skill = player.getKnownSkill(shortcut.getId()); skill = player.getKnownSkill(shortcut.getId());
if (skill == null)
{
if (player.hasServitors())
{
for (Summon summon : player.getServitors().values())
{
skill = summon.getKnownSkill(shortcut.getId());
if (skill != null)
{
break;
}
}
}
if ((skill == null) && player.hasPet())
{
skill = player.getPet().getKnownSkill(shortcut.getId());
}
}
} }
else else
{ {
@@ -184,27 +184,50 @@ public class AutoUseTaskManager implements Runnable
break BUFFS; break BUFFS;
} }
final Skill skill = player.getKnownSkill(skillId.intValue()); Playable pet = null;
Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoBuffs().remove(skillId); if (player.hasServitors())
continue BUFFS; {
SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoBuffs().remove(skillId);
continue BUFFS;
}
} }
final WorldObject target = player.getTarget(); final WorldObject target = player.getTarget();
if (canCastBuff(player, target, skill)) if (canCastBuff(player, target, skill))
{ {
final Playable caster = pet != null ? pet : player;
// Playable target cast. // Playable target cast.
if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0)) if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0))
{ {
player.doCast(skill); caster.doCast(skill);
} }
else // Target self, cast and re-target. else // Target self, cast and re-target.
{ {
final WorldObject savedTarget = target; final WorldObject savedTarget = target;
player.setTarget(player); caster.setTarget(caster);
player.doCast(skill); caster.doCast(skill);
player.setTarget(savedTarget); caster.setTarget(savedTarget);
} }
} }
} }
@@ -230,13 +253,34 @@ public class AutoUseTaskManager implements Runnable
} }
// Acquire next skill. // Acquire next skill.
Playable pet = null;
final Integer skillId = player.getAutoUseSettings().getNextSkillId(); final Integer skillId = player.getAutoUseSettings().getNextSkillId();
final Skill skill = player.getKnownSkill(skillId.intValue()); Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoSkills().remove(skillId); if (player.hasServitors())
player.getAutoUseSettings().resetSkillOrder(); {
break SKILLS; SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoSkills().remove(skillId);
player.getAutoUseSettings().resetSkillOrder();
break SKILLS;
}
} }
// Casting on self stops movement. // Casting on self stops movement.
@@ -258,7 +302,7 @@ public class AutoUseTaskManager implements Runnable
break SKILLS; break SKILLS;
} }
if (!canUseMagic(player, target, skill) || player.useMagic(skill, null, true, false)) if (!canUseMagic(player, target, skill) || (pet != null ? pet : player).useMagic(skill, null, true, false))
{ {
player.getAutoUseSettings().incrementSkillOrder(); player.getAutoUseSettings().incrementSkillOrder();
} }
@@ -5503,7 +5503,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.ActionDataHolder;
import org.l2jmobius.gameserver.model.ShortCuts; import org.l2jmobius.gameserver.model.ShortCuts;
import org.l2jmobius.gameserver.model.Shortcut; import org.l2jmobius.gameserver.model.Shortcut;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.Summon;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -80,6 +81,24 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
if (shortcut.getType() == ShortcutType.SKILL) if (shortcut.getType() == ShortcutType.SKILL)
{ {
skill = player.getKnownSkill(shortcut.getId()); skill = player.getKnownSkill(shortcut.getId());
if (skill == null)
{
if (player.hasServitors())
{
for (Summon summon : player.getServitors().values())
{
skill = summon.getKnownSkill(shortcut.getId());
if (skill != null)
{
break;
}
}
}
if ((skill == null) && player.hasPet())
{
skill = player.getPet().getKnownSkill(shortcut.getId());
}
}
} }
else else
{ {
@@ -184,27 +184,50 @@ public class AutoUseTaskManager implements Runnable
break BUFFS; break BUFFS;
} }
final Skill skill = player.getKnownSkill(skillId.intValue()); Playable pet = null;
Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoBuffs().remove(skillId); if (player.hasServitors())
continue BUFFS; {
SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoBuffs().remove(skillId);
continue BUFFS;
}
} }
final WorldObject target = player.getTarget(); final WorldObject target = player.getTarget();
if (canCastBuff(player, target, skill)) if (canCastBuff(player, target, skill))
{ {
final Playable caster = pet != null ? pet : player;
// Playable target cast. // Playable target cast.
if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0)) if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0))
{ {
player.doCast(skill); caster.doCast(skill);
} }
else // Target self, cast and re-target. else // Target self, cast and re-target.
{ {
final WorldObject savedTarget = target; final WorldObject savedTarget = target;
player.setTarget(player); caster.setTarget(caster);
player.doCast(skill); caster.doCast(skill);
player.setTarget(savedTarget); caster.setTarget(savedTarget);
} }
} }
} }
@@ -230,13 +253,34 @@ public class AutoUseTaskManager implements Runnable
} }
// Acquire next skill. // Acquire next skill.
Playable pet = null;
final Integer skillId = player.getAutoUseSettings().getNextSkillId(); final Integer skillId = player.getAutoUseSettings().getNextSkillId();
final Skill skill = player.getKnownSkill(skillId.intValue()); Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoSkills().remove(skillId); if (player.hasServitors())
player.getAutoUseSettings().resetSkillOrder(); {
break SKILLS; SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoSkills().remove(skillId);
player.getAutoUseSettings().resetSkillOrder();
break SKILLS;
}
} }
// Casting on self stops movement. // Casting on self stops movement.
@@ -258,7 +302,7 @@ public class AutoUseTaskManager implements Runnable
break SKILLS; break SKILLS;
} }
if (!canUseMagic(player, target, skill) || player.useMagic(skill, null, true, false)) if (!canUseMagic(player, target, skill) || (pet != null ? pet : player).useMagic(skill, null, true, false))
{ {
player.getAutoUseSettings().incrementSkillOrder(); player.getAutoUseSettings().incrementSkillOrder();
} }
@@ -5520,7 +5520,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.ActionDataHolder;
import org.l2jmobius.gameserver.model.ShortCuts; import org.l2jmobius.gameserver.model.ShortCuts;
import org.l2jmobius.gameserver.model.Shortcut; import org.l2jmobius.gameserver.model.Shortcut;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.Summon;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -80,6 +81,24 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
if (shortcut.getType() == ShortcutType.SKILL) if (shortcut.getType() == ShortcutType.SKILL)
{ {
skill = player.getKnownSkill(shortcut.getId()); skill = player.getKnownSkill(shortcut.getId());
if (skill == null)
{
if (player.hasServitors())
{
for (Summon summon : player.getServitors().values())
{
skill = summon.getKnownSkill(shortcut.getId());
if (skill != null)
{
break;
}
}
}
if ((skill == null) && player.hasPet())
{
skill = player.getPet().getKnownSkill(shortcut.getId());
}
}
} }
else else
{ {
@@ -184,27 +184,50 @@ public class AutoUseTaskManager implements Runnable
break BUFFS; break BUFFS;
} }
final Skill skill = player.getKnownSkill(skillId.intValue()); Playable pet = null;
Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoBuffs().remove(skillId); if (player.hasServitors())
continue BUFFS; {
SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoBuffs().remove(skillId);
continue BUFFS;
}
} }
final WorldObject target = player.getTarget(); final WorldObject target = player.getTarget();
if (canCastBuff(player, target, skill)) if (canCastBuff(player, target, skill))
{ {
final Playable caster = pet != null ? pet : player;
// Playable target cast. // Playable target cast.
if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0)) if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0))
{ {
player.doCast(skill); caster.doCast(skill);
} }
else // Target self, cast and re-target. else // Target self, cast and re-target.
{ {
final WorldObject savedTarget = target; final WorldObject savedTarget = target;
player.setTarget(player); caster.setTarget(caster);
player.doCast(skill); caster.doCast(skill);
player.setTarget(savedTarget); caster.setTarget(savedTarget);
} }
} }
} }
@@ -230,13 +253,34 @@ public class AutoUseTaskManager implements Runnable
} }
// Acquire next skill. // Acquire next skill.
Playable pet = null;
final Integer skillId = player.getAutoUseSettings().getNextSkillId(); final Integer skillId = player.getAutoUseSettings().getNextSkillId();
final Skill skill = player.getKnownSkill(skillId.intValue()); Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoSkills().remove(skillId); if (player.hasServitors())
player.getAutoUseSettings().resetSkillOrder(); {
break SKILLS; SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoSkills().remove(skillId);
player.getAutoUseSettings().resetSkillOrder();
break SKILLS;
}
} }
// Casting on self stops movement. // Casting on self stops movement.
@@ -258,7 +302,7 @@ public class AutoUseTaskManager implements Runnable
break SKILLS; break SKILLS;
} }
if (!canUseMagic(player, target, skill) || player.useMagic(skill, null, true, false)) if (!canUseMagic(player, target, skill) || (pet != null ? pet : player).useMagic(skill, null, true, false))
{ {
player.getAutoUseSettings().incrementSkillOrder(); player.getAutoUseSettings().incrementSkillOrder();
} }
@@ -5553,7 +5553,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.ActionDataHolder;
import org.l2jmobius.gameserver.model.ShortCuts; import org.l2jmobius.gameserver.model.ShortCuts;
import org.l2jmobius.gameserver.model.Shortcut; import org.l2jmobius.gameserver.model.Shortcut;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.Summon;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -80,6 +81,24 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
if (shortcut.getType() == ShortcutType.SKILL) if (shortcut.getType() == ShortcutType.SKILL)
{ {
skill = player.getKnownSkill(shortcut.getId()); skill = player.getKnownSkill(shortcut.getId());
if (skill == null)
{
if (player.hasServitors())
{
for (Summon summon : player.getServitors().values())
{
skill = summon.getKnownSkill(shortcut.getId());
if (skill != null)
{
break;
}
}
}
if ((skill == null) && player.hasPet())
{
skill = player.getPet().getKnownSkill(shortcut.getId());
}
}
} }
else else
{ {
@@ -184,27 +184,50 @@ public class AutoUseTaskManager implements Runnable
break BUFFS; break BUFFS;
} }
final Skill skill = player.getKnownSkill(skillId.intValue()); Playable pet = null;
Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoBuffs().remove(skillId); if (player.hasServitors())
continue BUFFS; {
SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoBuffs().remove(skillId);
continue BUFFS;
}
} }
final WorldObject target = player.getTarget(); final WorldObject target = player.getTarget();
if (canCastBuff(player, target, skill)) if (canCastBuff(player, target, skill))
{ {
final Playable caster = pet != null ? pet : player;
// Playable target cast. // Playable target cast.
if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0)) if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0))
{ {
player.doCast(skill); caster.doCast(skill);
} }
else // Target self, cast and re-target. else // Target self, cast and re-target.
{ {
final WorldObject savedTarget = target; final WorldObject savedTarget = target;
player.setTarget(player); caster.setTarget(caster);
player.doCast(skill); caster.doCast(skill);
player.setTarget(savedTarget); caster.setTarget(savedTarget);
} }
} }
} }
@@ -230,13 +253,34 @@ public class AutoUseTaskManager implements Runnable
} }
// Acquire next skill. // Acquire next skill.
Playable pet = null;
final Integer skillId = player.getAutoUseSettings().getNextSkillId(); final Integer skillId = player.getAutoUseSettings().getNextSkillId();
final Skill skill = player.getKnownSkill(skillId.intValue()); Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoSkills().remove(skillId); if (player.hasServitors())
player.getAutoUseSettings().resetSkillOrder(); {
break SKILLS; SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoSkills().remove(skillId);
player.getAutoUseSettings().resetSkillOrder();
break SKILLS;
}
} }
// Casting on self stops movement. // Casting on self stops movement.
@@ -258,7 +302,7 @@ public class AutoUseTaskManager implements Runnable
break SKILLS; break SKILLS;
} }
if (!canUseMagic(player, target, skill) || player.useMagic(skill, null, true, false)) if (!canUseMagic(player, target, skill) || (pet != null ? pet : player).useMagic(skill, null, true, false))
{ {
player.getAutoUseSettings().incrementSkillOrder(); player.getAutoUseSettings().incrementSkillOrder();
} }
@@ -5553,7 +5553,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.ActionDataHolder;
import org.l2jmobius.gameserver.model.ShortCuts; import org.l2jmobius.gameserver.model.ShortCuts;
import org.l2jmobius.gameserver.model.Shortcut; import org.l2jmobius.gameserver.model.Shortcut;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.Summon;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -80,6 +81,24 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
if (shortcut.getType() == ShortcutType.SKILL) if (shortcut.getType() == ShortcutType.SKILL)
{ {
skill = player.getKnownSkill(shortcut.getId()); skill = player.getKnownSkill(shortcut.getId());
if (skill == null)
{
if (player.hasServitors())
{
for (Summon summon : player.getServitors().values())
{
skill = summon.getKnownSkill(shortcut.getId());
if (skill != null)
{
break;
}
}
}
if ((skill == null) && player.hasPet())
{
skill = player.getPet().getKnownSkill(shortcut.getId());
}
}
} }
else else
{ {
@@ -184,27 +184,50 @@ public class AutoUseTaskManager implements Runnable
break BUFFS; break BUFFS;
} }
final Skill skill = player.getKnownSkill(skillId.intValue()); Playable pet = null;
Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoBuffs().remove(skillId); if (player.hasServitors())
continue BUFFS; {
SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoBuffs().remove(skillId);
continue BUFFS;
}
} }
final WorldObject target = player.getTarget(); final WorldObject target = player.getTarget();
if (canCastBuff(player, target, skill)) if (canCastBuff(player, target, skill))
{ {
final Playable caster = pet != null ? pet : player;
// Playable target cast. // Playable target cast.
if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0)) if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0))
{ {
player.doCast(skill); caster.doCast(skill);
} }
else // Target self, cast and re-target. else // Target self, cast and re-target.
{ {
final WorldObject savedTarget = target; final WorldObject savedTarget = target;
player.setTarget(player); caster.setTarget(caster);
player.doCast(skill); caster.doCast(skill);
player.setTarget(savedTarget); caster.setTarget(savedTarget);
} }
} }
} }
@@ -230,13 +253,34 @@ public class AutoUseTaskManager implements Runnable
} }
// Acquire next skill. // Acquire next skill.
Playable pet = null;
final Integer skillId = player.getAutoUseSettings().getNextSkillId(); final Integer skillId = player.getAutoUseSettings().getNextSkillId();
final Skill skill = player.getKnownSkill(skillId.intValue()); Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoSkills().remove(skillId); if (player.hasServitors())
player.getAutoUseSettings().resetSkillOrder(); {
break SKILLS; SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoSkills().remove(skillId);
player.getAutoUseSettings().resetSkillOrder();
break SKILLS;
}
} }
// Casting on self stops movement. // Casting on self stops movement.
@@ -258,7 +302,7 @@ public class AutoUseTaskManager implements Runnable
break SKILLS; break SKILLS;
} }
if (!canUseMagic(player, target, skill) || player.useMagic(skill, null, true, false)) if (!canUseMagic(player, target, skill) || (pet != null ? pet : player).useMagic(skill, null, true, false))
{ {
player.getAutoUseSettings().incrementSkillOrder(); player.getAutoUseSettings().incrementSkillOrder();
} }
@@ -5454,7 +5454,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5454,7 +5454,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5439,7 +5439,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5453,7 +5453,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5453,7 +5453,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5408,7 +5408,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.ActionDataHolder;
import org.l2jmobius.gameserver.model.ShortCuts; import org.l2jmobius.gameserver.model.ShortCuts;
import org.l2jmobius.gameserver.model.Shortcut; import org.l2jmobius.gameserver.model.Shortcut;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.Summon;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -80,6 +81,24 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
if (shortcut.getType() == ShortcutType.SKILL) if (shortcut.getType() == ShortcutType.SKILL)
{ {
skill = player.getKnownSkill(shortcut.getId()); skill = player.getKnownSkill(shortcut.getId());
if (skill == null)
{
if (player.hasServitors())
{
for (Summon summon : player.getServitors().values())
{
skill = summon.getKnownSkill(shortcut.getId());
if (skill != null)
{
break;
}
}
}
if ((skill == null) && player.hasPet())
{
skill = player.getPet().getKnownSkill(shortcut.getId());
}
}
} }
else else
{ {
@@ -184,27 +184,50 @@ public class AutoUseTaskManager implements Runnable
break BUFFS; break BUFFS;
} }
final Skill skill = player.getKnownSkill(skillId.intValue()); Playable pet = null;
Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoBuffs().remove(skillId); if (player.hasServitors())
continue BUFFS; {
SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoBuffs().remove(skillId);
continue BUFFS;
}
} }
final WorldObject target = player.getTarget(); final WorldObject target = player.getTarget();
if (canCastBuff(player, target, skill)) if (canCastBuff(player, target, skill))
{ {
final Playable caster = pet != null ? pet : player;
// Playable target cast. // Playable target cast.
if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0)) if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0))
{ {
player.doCast(skill); caster.doCast(skill);
} }
else // Target self, cast and re-target. else // Target self, cast and re-target.
{ {
final WorldObject savedTarget = target; final WorldObject savedTarget = target;
player.setTarget(player); caster.setTarget(caster);
player.doCast(skill); caster.doCast(skill);
player.setTarget(savedTarget); caster.setTarget(savedTarget);
} }
} }
} }
@@ -230,13 +253,34 @@ public class AutoUseTaskManager implements Runnable
} }
// Acquire next skill. // Acquire next skill.
Playable pet = null;
final Integer skillId = player.getAutoUseSettings().getNextSkillId(); final Integer skillId = player.getAutoUseSettings().getNextSkillId();
final Skill skill = player.getKnownSkill(skillId.intValue()); Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoSkills().remove(skillId); if (player.hasServitors())
player.getAutoUseSettings().resetSkillOrder(); {
break SKILLS; SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoSkills().remove(skillId);
player.getAutoUseSettings().resetSkillOrder();
break SKILLS;
}
} }
// Casting on self stops movement. // Casting on self stops movement.
@@ -258,7 +302,7 @@ public class AutoUseTaskManager implements Runnable
break SKILLS; break SKILLS;
} }
if (!canUseMagic(player, target, skill) || player.useMagic(skill, null, true, false)) if (!canUseMagic(player, target, skill) || (pet != null ? pet : player).useMagic(skill, null, true, false))
{ {
player.getAutoUseSettings().incrementSkillOrder(); player.getAutoUseSettings().incrementSkillOrder();
} }
@@ -5435,7 +5435,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -5492,7 +5492,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -22,6 +22,7 @@ import org.l2jmobius.gameserver.enums.ShortcutType;
import org.l2jmobius.gameserver.model.ShortCuts; import org.l2jmobius.gameserver.model.ShortCuts;
import org.l2jmobius.gameserver.model.Shortcut; import org.l2jmobius.gameserver.model.Shortcut;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.Summon;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -76,6 +77,24 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
if (shortcut.getType() == ShortcutType.SKILL) if (shortcut.getType() == ShortcutType.SKILL)
{ {
skill = player.getKnownSkill(shortcut.getId()); skill = player.getKnownSkill(shortcut.getId());
if (skill == null)
{
if (player.hasServitors())
{
for (Summon summon : player.getServitors().values())
{
skill = summon.getKnownSkill(shortcut.getId());
if (skill != null)
{
break;
}
}
}
if ((skill == null) && player.hasPet())
{
skill = player.getPet().getKnownSkill(shortcut.getId());
}
}
} }
else else
{ {
@@ -184,27 +184,50 @@ public class AutoUseTaskManager implements Runnable
break BUFFS; break BUFFS;
} }
final Skill skill = player.getKnownSkill(skillId.intValue()); Playable pet = null;
Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoBuffs().remove(skillId); if (player.hasServitors())
continue BUFFS; {
SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoBuffs().remove(skillId);
continue BUFFS;
}
} }
final WorldObject target = player.getTarget(); final WorldObject target = player.getTarget();
if (canCastBuff(player, target, skill)) if (canCastBuff(player, target, skill))
{ {
final Playable caster = pet != null ? pet : player;
// Playable target cast. // Playable target cast.
if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0)) if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0))
{ {
player.doCast(skill); caster.doCast(skill);
} }
else // Target self, cast and re-target. else // Target self, cast and re-target.
{ {
final WorldObject savedTarget = target; final WorldObject savedTarget = target;
player.setTarget(player); caster.setTarget(caster);
player.doCast(skill); caster.doCast(skill);
player.setTarget(savedTarget); caster.setTarget(savedTarget);
} }
} }
} }
@@ -230,13 +253,34 @@ public class AutoUseTaskManager implements Runnable
} }
// Acquire next skill. // Acquire next skill.
Playable pet = null;
final Integer skillId = player.getAutoUseSettings().getNextSkillId(); final Integer skillId = player.getAutoUseSettings().getNextSkillId();
final Skill skill = player.getKnownSkill(skillId.intValue()); Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoSkills().remove(skillId); if (player.hasServitors())
player.getAutoUseSettings().resetSkillOrder(); {
break SKILLS; SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoSkills().remove(skillId);
player.getAutoUseSettings().resetSkillOrder();
break SKILLS;
}
} }
// Casting on self stops movement. // Casting on self stops movement.
@@ -258,7 +302,7 @@ public class AutoUseTaskManager implements Runnable
break SKILLS; break SKILLS;
} }
if (!canUseMagic(player, target, skill) || player.useMagic(skill, null, true, false)) if (!canUseMagic(player, target, skill) || (pet != null ? pet : player).useMagic(skill, null, true, false))
{ {
player.getAutoUseSettings().incrementSkillOrder(); player.getAutoUseSettings().incrementSkillOrder();
} }
@@ -5533,7 +5533,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -22,6 +22,7 @@ import org.l2jmobius.gameserver.enums.ShortcutType;
import org.l2jmobius.gameserver.model.ShortCuts; import org.l2jmobius.gameserver.model.ShortCuts;
import org.l2jmobius.gameserver.model.Shortcut; import org.l2jmobius.gameserver.model.Shortcut;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.Summon;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -76,6 +77,24 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
if (shortcut.getType() == ShortcutType.SKILL) if (shortcut.getType() == ShortcutType.SKILL)
{ {
skill = player.getKnownSkill(shortcut.getId()); skill = player.getKnownSkill(shortcut.getId());
if (skill == null)
{
if (player.hasServitors())
{
for (Summon summon : player.getServitors().values())
{
skill = summon.getKnownSkill(shortcut.getId());
if (skill != null)
{
break;
}
}
}
if ((skill == null) && player.hasPet())
{
skill = player.getPet().getKnownSkill(shortcut.getId());
}
}
} }
else else
{ {
@@ -184,27 +184,50 @@ public class AutoUseTaskManager implements Runnable
break BUFFS; break BUFFS;
} }
final Skill skill = player.getKnownSkill(skillId.intValue()); Playable pet = null;
Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoBuffs().remove(skillId); if (player.hasServitors())
continue BUFFS; {
SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoBuffs().remove(skillId);
continue BUFFS;
}
} }
final WorldObject target = player.getTarget(); final WorldObject target = player.getTarget();
if (canCastBuff(player, target, skill)) if (canCastBuff(player, target, skill))
{ {
final Playable caster = pet != null ? pet : player;
// Playable target cast. // Playable target cast.
if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0)) if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0))
{ {
player.doCast(skill); caster.doCast(skill);
} }
else // Target self, cast and re-target. else // Target self, cast and re-target.
{ {
final WorldObject savedTarget = target; final WorldObject savedTarget = target;
player.setTarget(player); caster.setTarget(caster);
player.doCast(skill); caster.doCast(skill);
player.setTarget(savedTarget); caster.setTarget(savedTarget);
} }
} }
} }
@@ -230,13 +253,34 @@ public class AutoUseTaskManager implements Runnable
} }
// Acquire next skill. // Acquire next skill.
Playable pet = null;
final Integer skillId = player.getAutoUseSettings().getNextSkillId(); final Integer skillId = player.getAutoUseSettings().getNextSkillId();
final Skill skill = player.getKnownSkill(skillId.intValue()); Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoSkills().remove(skillId); if (player.hasServitors())
player.getAutoUseSettings().resetSkillOrder(); {
break SKILLS; SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoSkills().remove(skillId);
player.getAutoUseSettings().resetSkillOrder();
break SKILLS;
}
} }
// Casting on self stops movement. // Casting on self stops movement.
@@ -258,7 +302,7 @@ public class AutoUseTaskManager implements Runnable
break SKILLS; break SKILLS;
} }
if (!canUseMagic(player, target, skill) || player.useMagic(skill, null, true, false)) if (!canUseMagic(player, target, skill) || (pet != null ? pet : player).useMagic(skill, null, true, false))
{ {
player.getAutoUseSettings().incrementSkillOrder(); player.getAutoUseSettings().incrementSkillOrder();
} }
@@ -5539,7 +5539,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -22,6 +22,7 @@ import org.l2jmobius.gameserver.enums.ShortcutType;
import org.l2jmobius.gameserver.model.ShortCuts; import org.l2jmobius.gameserver.model.ShortCuts;
import org.l2jmobius.gameserver.model.Shortcut; import org.l2jmobius.gameserver.model.Shortcut;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.Summon;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -76,6 +77,24 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
if (shortcut.getType() == ShortcutType.SKILL) if (shortcut.getType() == ShortcutType.SKILL)
{ {
skill = player.getKnownSkill(shortcut.getId()); skill = player.getKnownSkill(shortcut.getId());
if (skill == null)
{
if (player.hasServitors())
{
for (Summon summon : player.getServitors().values())
{
skill = summon.getKnownSkill(shortcut.getId());
if (skill != null)
{
break;
}
}
}
if ((skill == null) && player.hasPet())
{
skill = player.getPet().getKnownSkill(shortcut.getId());
}
}
} }
else else
{ {
@@ -184,27 +184,50 @@ public class AutoUseTaskManager implements Runnable
break BUFFS; break BUFFS;
} }
final Skill skill = player.getKnownSkill(skillId.intValue()); Playable pet = null;
Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoBuffs().remove(skillId); if (player.hasServitors())
continue BUFFS; {
SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoBuffs().remove(skillId);
continue BUFFS;
}
} }
final WorldObject target = player.getTarget(); final WorldObject target = player.getTarget();
if (canCastBuff(player, target, skill)) if (canCastBuff(player, target, skill))
{ {
final Playable caster = pet != null ? pet : player;
// Playable target cast. // Playable target cast.
if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0)) if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0))
{ {
player.doCast(skill); caster.doCast(skill);
} }
else // Target self, cast and re-target. else // Target self, cast and re-target.
{ {
final WorldObject savedTarget = target; final WorldObject savedTarget = target;
player.setTarget(player); caster.setTarget(caster);
player.doCast(skill); caster.doCast(skill);
player.setTarget(savedTarget); caster.setTarget(savedTarget);
} }
} }
} }
@@ -230,13 +253,34 @@ public class AutoUseTaskManager implements Runnable
} }
// Acquire next skill. // Acquire next skill.
Playable pet = null;
final Integer skillId = player.getAutoUseSettings().getNextSkillId(); final Integer skillId = player.getAutoUseSettings().getNextSkillId();
final Skill skill = player.getKnownSkill(skillId.intValue()); Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoSkills().remove(skillId); if (player.hasServitors())
player.getAutoUseSettings().resetSkillOrder(); {
break SKILLS; SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoSkills().remove(skillId);
player.getAutoUseSettings().resetSkillOrder();
break SKILLS;
}
} }
// Casting on self stops movement. // Casting on self stops movement.
@@ -258,7 +302,7 @@ public class AutoUseTaskManager implements Runnable
break SKILLS; break SKILLS;
} }
if (!canUseMagic(player, target, skill) || player.useMagic(skill, null, true, false)) if (!canUseMagic(player, target, skill) || (pet != null ? pet : player).useMagic(skill, null, true, false))
{ {
player.getAutoUseSettings().incrementSkillOrder(); player.getAutoUseSettings().incrementSkillOrder();
} }
@@ -5539,7 +5539,6 @@ public class Player extends Playable
{ {
final List<Summon> summons = new ArrayList<>(); final List<Summon> summons = new ArrayList<>();
summons.addAll(getServitors().values()); summons.addAll(getServitors().values());
if (_pet != null) if (_pet != null)
{ {
summons.add(_pet); summons.add(_pet);
@@ -22,6 +22,7 @@ import org.l2jmobius.gameserver.enums.ShortcutType;
import org.l2jmobius.gameserver.model.ShortCuts; import org.l2jmobius.gameserver.model.ShortCuts;
import org.l2jmobius.gameserver.model.Shortcut; import org.l2jmobius.gameserver.model.Shortcut;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.Summon;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -76,6 +77,24 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
if (shortcut.getType() == ShortcutType.SKILL) if (shortcut.getType() == ShortcutType.SKILL)
{ {
skill = player.getKnownSkill(shortcut.getId()); skill = player.getKnownSkill(shortcut.getId());
if (skill == null)
{
if (player.hasServitors())
{
for (Summon summon : player.getServitors().values())
{
skill = summon.getKnownSkill(shortcut.getId());
if (skill != null)
{
break;
}
}
}
if ((skill == null) && player.hasPet())
{
skill = player.getPet().getKnownSkill(shortcut.getId());
}
}
} }
else else
{ {
@@ -184,27 +184,50 @@ public class AutoUseTaskManager implements Runnable
break BUFFS; break BUFFS;
} }
final Skill skill = player.getKnownSkill(skillId.intValue()); Playable pet = null;
Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoBuffs().remove(skillId); if (player.hasServitors())
continue BUFFS; {
SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoBuffs().remove(skillId);
continue BUFFS;
}
} }
final WorldObject target = player.getTarget(); final WorldObject target = player.getTarget();
if (canCastBuff(player, target, skill)) if (canCastBuff(player, target, skill))
{ {
final Playable caster = pet != null ? pet : player;
// Playable target cast. // Playable target cast.
if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0)) if ((target != null) && target.isPlayable() && !((Playable) target).isAlikeDead() && (target.getActingPlayer().getPvpFlag() == 0) && (target.getActingPlayer().getReputation() >= 0))
{ {
player.doCast(skill); caster.doCast(skill);
} }
else // Target self, cast and re-target. else // Target self, cast and re-target.
{ {
final WorldObject savedTarget = target; final WorldObject savedTarget = target;
player.setTarget(player); caster.setTarget(caster);
player.doCast(skill); caster.doCast(skill);
player.setTarget(savedTarget); caster.setTarget(savedTarget);
} }
} }
} }
@@ -230,13 +253,34 @@ public class AutoUseTaskManager implements Runnable
} }
// Acquire next skill. // Acquire next skill.
Playable pet = null;
final Integer skillId = player.getAutoUseSettings().getNextSkillId(); final Integer skillId = player.getAutoUseSettings().getNextSkillId();
final Skill skill = player.getKnownSkill(skillId.intValue()); Skill skill = player.getKnownSkill(skillId.intValue());
if (skill == null) if (skill == null)
{ {
player.getAutoUseSettings().getAutoSkills().remove(skillId); if (player.hasServitors())
player.getAutoUseSettings().resetSkillOrder(); {
break SKILLS; SUMMON_SEARCH: for (Summon summon : player.getServitors().values())
{
pet = summon;
skill = summon.getKnownSkill(skillId.intValue());
if (skill != null)
{
break SUMMON_SEARCH;
}
}
}
if ((skill == null) && player.hasPet())
{
pet = player.getPet();
skill = pet.getKnownSkill(skillId.intValue());
}
if (skill == null)
{
player.getAutoUseSettings().getAutoSkills().remove(skillId);
player.getAutoUseSettings().resetSkillOrder();
break SKILLS;
}
} }
// Casting on self stops movement. // Casting on self stops movement.
@@ -258,7 +302,7 @@ public class AutoUseTaskManager implements Runnable
break SKILLS; break SKILLS;
} }
if (!canUseMagic(player, target, skill) || player.useMagic(skill, null, true, false)) if (!canUseMagic(player, target, skill) || (pet != null ? pet : player).useMagic(skill, null, true, false))
{ {
player.getAutoUseSettings().incrementSkillOrder(); player.getAutoUseSettings().incrementSkillOrder();
} }