Sync with L2jServer HighFive Mar 3rd 2016.
This commit is contained in:
@@ -36,6 +36,9 @@ final class SummonPc extends AbstractNpcAI
|
||||
private static final int PERUM = 20221;
|
||||
// Skill
|
||||
private static final SkillHolder SUMMON_PC = new SkillHolder(4161, 1);
|
||||
// Misc
|
||||
private static final int MIN_DISTANCE = 300;
|
||||
private static final int MIN_DISTANCE_MOST_HATED = 100;
|
||||
|
||||
private SummonPc()
|
||||
{
|
||||
@@ -47,39 +50,29 @@ final class SummonPc extends AbstractNpcAI
|
||||
@Override
|
||||
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
|
||||
{
|
||||
final int chance = getRandom(100);
|
||||
final boolean attacked = npc.getVariables().getBoolean("attacked", false);
|
||||
if ((npc.calculateDistance(attacker, true, false) > 300) && !attacked)
|
||||
if (attacked)
|
||||
{
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
final int chance = getRandom(100);
|
||||
final double distance = npc.calculateDistance(attacker, true, false);
|
||||
if (distance > MIN_DISTANCE)
|
||||
{
|
||||
if (chance < 50)
|
||||
{
|
||||
if ((SUMMON_PC.getSkill().getMpConsume() < npc.getCurrentMp()) && (SUMMON_PC.getSkill().getHpConsume() < npc.getCurrentHp()) && !npc.isSkillDisabled(SUMMON_PC.getSkill()))
|
||||
{
|
||||
npc.setTarget(attacker);
|
||||
npc.doCast(SUMMON_PC.getSkill());
|
||||
}
|
||||
|
||||
if ((SUMMON_PC.getSkill().getMpConsume() < npc.getCurrentMp()) && (SUMMON_PC.getSkill().getHpConsume() < npc.getCurrentHp()) && !npc.isSkillDisabled(SUMMON_PC.getSkill()))
|
||||
{
|
||||
npc.setTarget(attacker);
|
||||
npc.doCast(SUMMON_PC.getSkill());
|
||||
npc.getVariables().set("attacked", true);
|
||||
}
|
||||
doSummonPc(npc, attacker);
|
||||
}
|
||||
}
|
||||
else if ((npc.calculateDistance(attacker, true, false) > 100) && !attacked)
|
||||
else if (distance > MIN_DISTANCE_MOST_HATED)
|
||||
{
|
||||
final L2Attackable monster = (L2Attackable) npc;
|
||||
if (monster.getMostHated() != null)
|
||||
{
|
||||
if (((monster.getMostHated() == attacker) && (chance < 50)) || (chance < 10))
|
||||
{
|
||||
if ((SUMMON_PC.getSkill().getMpConsume() < npc.getCurrentMp()) && (SUMMON_PC.getSkill().getHpConsume() < npc.getCurrentHp()) && !npc.isSkillDisabled(SUMMON_PC.getSkill()))
|
||||
{
|
||||
npc.setTarget(attacker);
|
||||
npc.doCast(SUMMON_PC.getSkill());
|
||||
npc.getVariables().set("attacked", true);
|
||||
}
|
||||
doSummonPc(npc, attacker);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -93,10 +86,23 @@ final class SummonPc extends AbstractNpcAI
|
||||
{
|
||||
player.teleToLocation(npc);
|
||||
npc.getVariables().set("attacked", false);
|
||||
|
||||
// TODO(Zoey76): Teleport removes the player from all known lists, affecting aggro lists.
|
||||
addAttackDesire(npc, player);
|
||||
}
|
||||
return super.onSpellFinished(npc, player, skill);
|
||||
}
|
||||
|
||||
private static void doSummonPc(L2Npc npc, L2PcInstance attacker)
|
||||
{
|
||||
if ((SUMMON_PC.getSkill().getMpConsume() < npc.getCurrentMp()) && (SUMMON_PC.getSkill().getHpConsume() < npc.getCurrentHp()) && !npc.isSkillDisabled(SUMMON_PC.getSkill()))
|
||||
{
|
||||
npc.setTarget(attacker);
|
||||
npc.doCast(SUMMON_PC.getSkill());
|
||||
npc.getVariables().set("attacked", true);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new SummonPc();
|
||||
|
@@ -16,10 +16,9 @@
|
||||
*/
|
||||
package handlers.targethandlers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import com.l2jmobius.gameserver.GeoData;
|
||||
@@ -34,17 +33,19 @@ import com.l2jmobius.gameserver.model.zone.ZoneId;
|
||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||
|
||||
/**
|
||||
* @author Adry_85
|
||||
* Area Friendly target handler implementation.
|
||||
* @author Adry_85, Zoey76
|
||||
*/
|
||||
public class AreaFriendly implements ITargetTypeHandler
|
||||
{
|
||||
private static final CharComparator CHAR_COMPARATOR = new CharComparator();
|
||||
|
||||
@Override
|
||||
public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target)
|
||||
{
|
||||
final List<L2Character> targetList = new ArrayList<>();
|
||||
final L2PcInstance player = activeChar.getActingPlayer();
|
||||
|
||||
if ((target == null) || (!checkTarget(player, target) && (skill.getCastRange() >= 0)))
|
||||
if (!checkTarget(player, target) && (skill.getCastRange() >= 0))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THAT_IS_AN_INCORRECT_TARGET);
|
||||
return EMPTY_TARGET_LIST;
|
||||
@@ -65,27 +66,31 @@ public class AreaFriendly implements ITargetTypeHandler
|
||||
player
|
||||
};
|
||||
}
|
||||
targetList.add(target); // Add target to target list
|
||||
|
||||
final int maxTargets = skill.getAffectLimit();
|
||||
final Collection<L2Character> objs = target.getKnownList().getKnownCharactersInRadius(skill.getAffectRange());
|
||||
|
||||
// TODO: Chain Heal - The recovery amount decreases starting from the most injured person.
|
||||
Collections.sort(targetList, new CharComparator());
|
||||
|
||||
for (L2Character obj : objs)
|
||||
final List<L2Character> targetList = new LinkedList<>();
|
||||
if (target != null)
|
||||
{
|
||||
if (!checkTarget(player, obj) || (obj == activeChar))
|
||||
// Add target to target list.
|
||||
targetList.add(target);
|
||||
|
||||
final int maxTargets = skill.getAffectLimit();
|
||||
for (L2Character obj : target.getKnownList().getKnownCharactersInRadius(skill.getAffectRange()))
|
||||
{
|
||||
continue;
|
||||
if ((maxTargets > 0) && (targetList.size() >= maxTargets))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (!checkTarget(player, obj) || (obj == activeChar))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
targetList.add(obj);
|
||||
}
|
||||
|
||||
if ((maxTargets > 0) && (targetList.size() >= maxTargets))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
targetList.add(obj);
|
||||
// Sort creatures, the most injured first.
|
||||
Collections.sort(targetList, CHAR_COMPARATOR);
|
||||
}
|
||||
|
||||
if (targetList.isEmpty())
|
||||
@@ -107,9 +112,15 @@ public class AreaFriendly implements ITargetTypeHandler
|
||||
return false;
|
||||
}
|
||||
|
||||
// GMs and hidden creatures.
|
||||
if (target.isInvisible())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (target.isPlayable())
|
||||
{
|
||||
final L2PcInstance targetPlayer = target.getActingPlayer();
|
||||
L2PcInstance targetPlayer = target.getActingPlayer();
|
||||
|
||||
if (activeChar == targetPlayer)
|
||||
{
|
||||
@@ -131,6 +142,12 @@ public class AreaFriendly implements ITargetTypeHandler
|
||||
return true;
|
||||
}
|
||||
|
||||
// Only siege allies.
|
||||
if (activeChar.isInSiege() && !activeChar.isOnSameSiegeSideWith(targetPlayer))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (target.isInsideZone(ZoneId.PVP))
|
||||
{
|
||||
return false;
|
||||
@@ -149,7 +166,7 @@ public class AreaFriendly implements ITargetTypeHandler
|
||||
return true;
|
||||
}
|
||||
|
||||
class CharComparator implements Comparator<L2Character>
|
||||
static class CharComparator implements Comparator<L2Character>
|
||||
{
|
||||
@Override
|
||||
public int compare(L2Character char1, L2Character char2)
|
||||
|
@@ -25,6 +25,7 @@ import com.l2jmobius.gameserver.model.skills.targets.L2TargetType;
|
||||
import com.l2jmobius.gameserver.model.zone.ZoneId;
|
||||
|
||||
/**
|
||||
* Enemy Summon target handler implementation.
|
||||
* @author UnAfraid
|
||||
*/
|
||||
public class EnemySummon implements ITargetTypeHandler
|
||||
@@ -32,7 +33,7 @@ public class EnemySummon implements ITargetTypeHandler
|
||||
@Override
|
||||
public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target)
|
||||
{
|
||||
if (target.isSummon())
|
||||
if ((target != null) && target.isSummon())
|
||||
{
|
||||
final L2Summon targetSummon = (L2Summon) target;
|
||||
if ((activeChar.isPlayer() && (activeChar.getPet() != targetSummon) && activeChar.hasServitor(targetSummon.getObjectId()) && !targetSummon.isDead() && ((targetSummon.getOwner().getPvpFlag() != 0) || (targetSummon.getOwner().getReputation() < 0))) || (targetSummon.getOwner().isInsideZone(ZoneId.PVP) && activeChar.getActingPlayer().isInsideZone(ZoneId.PVP)) || (targetSummon.getOwner().isInDuel() && activeChar.getActingPlayer().isInDuel() && (targetSummon.getOwner().getDuelId() == activeChar.getActingPlayer().getDuelId())))
|
||||
|
@@ -740,20 +740,27 @@
|
||||
<set name="reuseDelay" val="3000" />
|
||||
<set name="rideState" val="NONE" />
|
||||
<set name="targetType" val="ONE" />
|
||||
<enchant1 name="abnormalLvl" val="3" />
|
||||
<enchant1 name="abnormalTime" val="30" />
|
||||
<enchant1 name="abnormalType" val="ATTACK_TIME_UP" />
|
||||
<enchant1 name="activateRate" val="#ench1ActivateRates" />
|
||||
<enchant1 name="basicProperty" val="MEN" />
|
||||
<enchant1 name="isDebuff" val="true" />
|
||||
<enchant1 name="lvlBonusRate" val="1" />
|
||||
<enchant1 name="operateType" val="ACTIVE_CONTINUOUS" />
|
||||
<enchant1 name="magicLvl" val="#enchMagicLvl" />
|
||||
<enchant2 name="abnormalLvl" val="3" />
|
||||
<enchant2 name="abnormalTime" val="15" />
|
||||
<enchant2 name="abnormalType" val="DOT_ATTR" />
|
||||
<enchant2 name="operateType" val="ACTIVE_CONTINUOUS" />
|
||||
<enchant2 name="activateRate" val="#ench2ActivateRates" />
|
||||
<enchant2 name="basicProperty" val="MEN" />
|
||||
<enchant2 name="isDebuff" val="true" />
|
||||
<enchant2 name="lvlBonusRate" val="1" />
|
||||
<enchant2 name="magicLvl" val="#enchMagicLvl" />
|
||||
<enchant3 name="abnormalLvl" val="1" />
|
||||
<enchant3 name="abnormalTime" val="15" />
|
||||
<enchant3 name="abnormalType" val="HOLY_ATTACK" />
|
||||
<enchant3 name="activateRate" val="80" />
|
||||
<enchant3 name="basicProperty" val="MEN" />
|
||||
<enchant3 name="isDebuff" val="true" />
|
||||
|
@@ -66,7 +66,9 @@
|
||||
<set name="reuseDelay" val="3000" />
|
||||
<set name="rideState" val="NONE" />
|
||||
<set name="targetType" val="AREA" />
|
||||
<enchant1 name="abnormalLvl" val="3" />
|
||||
<enchant1 name="abnormalTime" val="30" />
|
||||
<enchant1 name="abnormalType" val="ATTACK_TIME_UP" />
|
||||
<enchant1 name="activateRate" val="#ench1ActivateRates" />
|
||||
<enchant1 name="basicProperty" val="MEN" />
|
||||
<enchant1 name="element" val="3" /> <!-- Earth -->
|
||||
@@ -76,7 +78,9 @@
|
||||
<enchant1 name="lvlBonusRate" val="1" />
|
||||
<enchant1 name="magicLvl" val="#enchMagicLvl" />
|
||||
<enchant1 name="offensive" val="true" />
|
||||
<enchant2 name="abnormalLvl" val="3" />
|
||||
<enchant2 name="abnormalTime" val="15" />
|
||||
<enchant2 name="abnormalType" val="DOT_ATTR" />
|
||||
<enchant2 name="activateRate" val="#ench2ActivateRates" />
|
||||
<enchant2 name="basicProperty" val="MEN" />
|
||||
<enchant2 name="element" val="3" /> <!-- Earth -->
|
||||
@@ -86,7 +90,9 @@
|
||||
<enchant2 name="lvlBonusRate" val="1" />
|
||||
<enchant2 name="magicLvl" val="#enchMagicLvl" />
|
||||
<enchant2 name="offensive" val="true" />
|
||||
<enchant3 name="abnormalLvl" val="1" />
|
||||
<enchant3 name="abnormalTime" val="15" />
|
||||
<enchant3 name="abnormalType" val="HOLY_ATTACK" />
|
||||
<enchant3 name="activateRate" val="80" />
|
||||
<enchant3 name="basicProperty" val="MEN" />
|
||||
<enchant3 name="element" val="3" /> <!-- Earth -->
|
||||
|
@@ -885,6 +885,11 @@
|
||||
<enchant2 name="mpConsume" val="#ench2mpConsume" />
|
||||
<enchant2 name="mpInitialConsume" val="#ench2mpInitialConsume" />
|
||||
<enchant2 name="power" val="#ench2Power" />
|
||||
<enchant3 name="abnormalLvl" val="1" />
|
||||
<enchant3 name="abnormalTime" val="60" />
|
||||
<enchant3 name="abnormalType" val="HOLY_ATTACK" />
|
||||
<enchant3 name="activateRate" val="40" />
|
||||
<enchant3 name="lvlBonusRate" val="1" />
|
||||
<enchant3 name="basicProperty" val="MEN" />
|
||||
<enchant3 name="magicLvl" val="#enchMagicLvl" />
|
||||
<enchant3 name="operateType" val="ACTIVE_CONTINUOUS" />
|
||||
@@ -1128,10 +1133,15 @@
|
||||
<enchant2 name="mpConsume" val="#ench2mpConsume" />
|
||||
<enchant2 name="mpInitialConsume" val="#ench2mpInitialConsume" />
|
||||
<enchant2 name="power" val="#ench2Power" />
|
||||
<enchant3 name="abnormalLvl" val="1" />
|
||||
<enchant3 name="abnormalTime" val="60" />
|
||||
<enchant3 name="abnormalType" val="HOLY_ATTACK" />
|
||||
<enchant3 name="activateRate" val="40" />
|
||||
<enchant3 name="lvlBonusRate" val="1" />
|
||||
<enchant3 name="basicProperty" val="MEN" />
|
||||
<enchant3 name="isDebuff" val="true" />
|
||||
<enchant3 name="operateType" val="ACTIVE_CONTINUOUS" />
|
||||
<enchant3 name="magicLvl" val="#enchMagicLvl" />
|
||||
<enchant3 name="operateType" val="ACTIVE_CONTINUOUS" />
|
||||
<enchant3 name="isDebuff" val="true" />
|
||||
<enchant4 name="elementPower" val="#ench4ElementPower" />
|
||||
<enchant4 name="magicLvl" val="#enchMagicLvl" />
|
||||
<for>
|
||||
@@ -1355,9 +1365,14 @@
|
||||
<enchant1 name="power" val="#ench1Power" />
|
||||
<enchant2 name="elementPower" val="#ench2elementPower" />
|
||||
<enchant2 name="magicLvl" val="#enchMagicLvl" />
|
||||
<enchant3 name="operateType" val="ACTIVE_CONTINUOUS" />
|
||||
<enchant3 name="abnormalLvl" val="1" />
|
||||
<enchant3 name="abnormalTime" val="60" />
|
||||
<enchant3 name="abnormalType" val="HOLY_ATTACK" />
|
||||
<enchant3 name="activateRate" val="40" />
|
||||
<enchant3 name="lvlBonusRate" val="1" />
|
||||
<enchant3 name="basicProperty" val="MEN" />
|
||||
<enchant3 name="magicLvl" val="#enchMagicLvl" />
|
||||
<enchant3 name="operateType" val="ACTIVE_CONTINUOUS" />
|
||||
<enchant3 name="isDebuff" val="true" />
|
||||
<for>
|
||||
<effect name="MagicalAttack" />
|
||||
|
Reference in New Issue
Block a user