Странно, ни там, ни там, ни в ДП скриптах не нашел то, что нужно.
К примеру, мы имеем скилл:
Код:
<skill id="11755" toLevel="13" name="Radiant Heal">
<!-- Recovers target's HP with $s1 power. If HP is full, recovers CP. <The character is targeted automatically> -->
<icon>icon.skill11755</icon>
<operateType>A1</operateType>
<magicLevel>
<value level="1">85</value>
<value level="2">86</value>
<value level="3">88</value>
<value level="4">90</value>
<value level="5">92</value>
<value level="6">94</value>
<value level="7">96</value>
<value level="8">98</value>
<value level="9">101</value>
<value level="10">103</value>
<value level="11">105</value>
<value level="12">107</value>
<value level="13">109</value>
</magicLevel>
<mpConsume>
<value level="1">110</value>
<value level="2">110</value>
<value level="3">113</value>
<value level="4">114</value>
<value level="5">117</value>
<value level="6">118</value>
<value level="7">121</value>
<value level="8">122</value>
<value level="9">123</value>
<value level="10">124</value>
<value level="11">126</value>
<value level="12">128</value>
<value level="13">130</value>
</mpConsume>
<castRange>600</castRange>
<effectPoint>
<value level="1">867</value>
<value level="2">874</value>
<value level="3">886</value>
<value level="4">895</value>
<value level="5">902</value>
<value level="6">909</value>
<value level="7">918</value>
<value level="8">927</value>
<value level="9">935</value>
<value level="10">944</value>
<value level="11">952</value>
<value level="12">960</value>
<value level="13">969</value>
</effectPoint>
<effectRange>1100</effectRange>
<hitTime>4500</hitTime>
<coolTime>500</coolTime>
<reuseDelay>3000</reuseDelay>
<isMagic>1</isMagic>
<magicCriticalRate>
<value fromLevel="1" toLevel="13">5</value>
<value fromLevel="7" toLevel="13" fromSubLevel="2001" toSubLevel="2020">{base + (base / 100 * subIndex)}</value>
</magicCriticalRate>
<hitCancelTime>1</hitCancelTime>
<mpInitialConsume>
<value level="1">28</value>
<value level="2">28</value>
<value level="3">28</value>
<value level="4">29</value>
<value level="5">29</value>
<value level="6">30</value>
<value level="7">30</value>
<value level="8">31</value>
<value level="9">32</value>
<value level="10">33</value>
<value level="11">34</value>
<value level="12">35</value>
<value level="13">36</value>
</mpInitialConsume>
<targetType>TARGET</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="HpCpHeal">
<power>
<value level="1">1488</value>
<value level="2">1495</value>
<value level="3">1507</value>
<value level="4">1519</value>
<value level="5">1532</value>
<value level="6">1544</value>
<value level="7">1557</value>
<value level="8">1570</value>
<value level="9">1749</value>
<value level="10">1763</value>
<value level="11">1777</value>
<value level="12">1793</value>
<value level="13">1809</value>
<value fromLevel="7" toLevel="13" fromSubLevel="1001" toSubLevel="1020">{base + (base / 100 * subIndex)}</value>
</power>
</effect>
</effects>
</skill>
Который имеет такие параметры:
Код:
<targetType>TARGET</targetType>
<affectScope>SINGLE</affectScope>
Соответственно идем в хандлер сингл:
Код:
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.targethandlers.affectscope;
import java.util.function.Consumer;
import org.l2jmobius.gameserver.handler.AffectObjectHandler;
import org.l2jmobius.gameserver.handler.IAffectObjectHandler;
import org.l2jmobius.gameserver.handler.IAffectScopeHandler;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.skill.targets.AffectScope;
import org.l2jmobius.gameserver.model.skill.targets.TargetType;
/**
* Single target affect scope implementation.
* @author Nik
*/
public class Single implements IAffectScopeHandler
{
@Override
public void forEachAffected(Creature creature, WorldObject target, Skill skill, Consumer<? super WorldObject> action)
{
final IAffectObjectHandler affectObject = AffectObjectHandler.getInstance().getHandler(skill.getAffectObject());
if (target.isCreature())
{
if (skill.getTargetType() == TargetType.GROUND)
{
action.accept(creature); // Return yourself to mark that effects can use your current skill's world position.
}
if (((affectObject == null) || affectObject.checkAffectedObject(creature, (Creature) target)))
{
action.accept(target); // Return yourself to mark that effects can use your current skill's world position.
}
}
else if (target.isItem())
{
action.accept(target); // Return yourself to mark that effects can use your current skill's world position.
}
}
@Override
public Enum<AffectScope> getAffectScopeType()
{
return AffectScope.SINGLE;
}
}
Ни одной проверки, ни на ПК, ни на флаг, дальше идем в хандлер TARGET:
Код:
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.targethandlers;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.handler.ITargetTypeHandler;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.skill.targets.TargetType;
import org.l2jmobius.gameserver.network.SystemMessageId;
/**
* Any friendly selected target or enemy if force use. Works on dead targets or doors as well.
* @author Nik
*/
public class Target implements ITargetTypeHandler
{
@Override
public Enum<TargetType> getTargetType()
{
return TargetType.TARGET;
}
@Override
public WorldObject getTarget(Creature creature, WorldObject selectedTarget, Skill skill, boolean forceUse, boolean dontMove, boolean sendMessage)
{
if (selectedTarget == null)
{
return null;
}
if (!selectedTarget.isCreature())
{
if (sendMessage)
{
creature.sendPacket(SystemMessageId.INVALID_TARGET);
}
return null;
}
final Creature target = (Creature) selectedTarget;
// You can always target yourself.
if (creature == target)
{
return target;
}
// Check for cast range if character cannot move. TODO: char will start follow until within castrange, but if his moving is blocked by geodata, this msg will be sent.
if (dontMove && (creature.calculateDistance2D(target) > skill.getCastRange()))
{
if (sendMessage)
{
creature.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_CANCELLED);
}
return null;
}
if (skill.isFlyType() && !GeoEngine.getInstance().canMoveToTarget(creature.getX(), creature.getY(), creature.getZ(), target.getX(), target.getY(), target.getZ(), creature.getInstanceWorld()))
{
if (sendMessage)
{
creature.sendPacket(SystemMessageId.YOU_CANNOT_ATTACK_THE_TARGET);
}
return null;
}
// Geodata check when character is within range.
if (!GeoEngine.getInstance().canSeeTarget(creature, target))
{
if (sendMessage)
{
creature.sendPacket(SystemMessageId.CANNOT_SEE_TARGET);
}
return null;
}
return target;
}
}
И тут ни одной проверки, а по идее то, ни флагнутого, ни ПК, нельзя хилить без КТРЛ? Где это обрабатывается?