05-09-2014, 12:33 AM
Нужно что бы хилил вот так как на видео-
http://www.youtube.com/watch?v=1u76Qdo5dxc
исходы Фт.
А сейчас хилит цепной только когда у персонажей не фулл хп, и если они находятся в пати.
http://www.youtube.com/watch?v=1u76Qdo5dxc
исходы Фт.
А сейчас хилит цепной только когда у персонажей не фулл хп, и если они находятся в пати.
Скилл
PHP код:
<?php
<skill id="1553" levels="1" name="Chain Heal">
<set name="icon" val="icon.skill1553"/>
<set name="magicType" val="MAGIC"/>
<set name="effectPoint" val="398"/>
<set name="hitTime" val="3000"/>
<set name="itemConsumeId" val="3031"/>
<set name="itemConsumeCount" val="4"/>
<set name="magicLvl" val="83"/>
<set name="castRange" val="900"/>
<set name="healRadius" val="350"/>
<set name="mpConsume2" val="156"/>
<set name="mpConsume1" val="38"/>
<set name="operateType" val="OP_ACTIVE"/>
<set name="healPercents" val="30;27;24;21;18;15;12;10;10;10;10"/>
<set name="reuseDelay" val="5000"/>
<set name="skillRadius" val="600"/>
<set name="skillType" val="CHAIN_HEAL"/>
<set name="target" val="TARGET_ONE"/>
Но я думаю не в скиле дело, т.к если поменять <set name="target" val="TARGET_ONE" на TARGET_AREA и тип скилла просто на HEAL, то он начинает хилить как на видео, а проблема была в том, что не %, а просто 30хп...
ChainHeal.java
PHP код:
<?php
package l2ft.gameserver.skills.skillclasses;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import l2ft.gameserver.model.Creature;
import l2ft.gameserver.model.Skill;
import l2ft.gameserver.network.l2.s2c.SystemMessage;
import l2ft.gameserver.stats.Stats;
import l2ft.gameserver.stats.conditions.ConditionTargetRelation;
import l2ft.gameserver.templates.StatsSet;
public class ChainHeal extends Skill
{
private final int[] _healPercents;
private final int _healRadius;
private final int _maxTargets;
public ChainHeal(StatsSet set)
{
super(set);
_healRadius = set.getInteger("healRadius", 350);
String[] params = set.getString("healPercents", "").split(";");
_maxTargets = params.length;
_healPercents = new int[params.length];
for(int i = 0; i < params.length; i++)
_healPercents[i] = Integer.parseInt(params[i]);
}
@Override
public void useSkill(Creature activeChar, List<Creature> targets)
{
int curTarget = 0;
for(Creature target : targets)
{
if(target == null)
continue;
getEffects(activeChar, target, getActivateRate() > 0, false);
double hp = _healPercents[curTarget] * target.getMaxHp() / 100.;
double addToHp = Math.max(0, Math.min(hp, target.calcStat(Stats.HP_LIMIT, null, null) * target.getMaxHp() / 100. - target.getCurrentHp()));
if(addToHp > 0)
target.setCurrentHp(addToHp + target.getCurrentHp(), false);
if(target.isPlayer())
if(activeChar != target)
target.sendPacket(new SystemMessage(SystemMessage.XS2S_HP_HAS_BEEN_RESTORED_BY_S1).addString(activeChar.getName()).addNumber(Math.round(addToHp)));
else
activeChar.sendPacket(new SystemMessage(SystemMessage.S1_HPS_HAVE_BEEN_RESTORED).addNumber(Math.round(addToHp)));
curTarget++;
}
if(isSSPossible())
activeChar.unChargeShots(isMagic());
}
@Override
public List<Creature> getTargets(Creature activeChar, Creature aimingTarget, boolean forceUse)
{
List<Creature> result = new ArrayList<Creature>();
List<Creature> targets = aimingTarget.getAroundCharacters(_healRadius, _healRadius);
if(targets == null)
return result;
List<HealTarget> healTargets = new ArrayList<HealTarget>();
healTargets.add(new HealTarget(-100.0D, aimingTarget));
for(Creature target : targets)
{
if(target == null || target.isHealBlocked() || target.isCursedWeaponEquipped() || target.isCurrentHpFull() || ConditionTargetRelation.getRelation(activeChar, target) != ConditionTargetRelation.Relation.Friend)
continue;
double hpPercent = target.getCurrentHp() / target.getMaxHp();
healTargets.add(new HealTarget(hpPercent, target));
}
HealTarget[] healTargetsArr = new HealTarget[healTargets.size()];
healTargets.toArray(healTargetsArr);
Arrays.sort(healTargetsArr, new Comparator<HealTarget>(){
@Override
public int compare(HealTarget o1, HealTarget o2)
{
if(o1 == null || o2 == null)
return 0;
if(o1.getHpPercent() < o2.getHpPercent())
return -1;
if(o1.getHpPercent() > o2.getHpPercent())
return 1;
return 0;
}
});
int targetsCount = 0;
for(HealTarget ht : healTargetsArr)
{
result.add(ht.getTarget());
targetsCount++;
if(targetsCount >= _maxTargets)
break;
}
return result;
}
@Override
public boolean checkCondition(Creature activeChar, Creature target, boolean forceUse, boolean dontMove, boolean first)
{
if(activeChar.isPlayable() && target.isMonster())
return false;
return super.checkCondition(activeChar, target, forceUse, dontMove, first);
}
private static class HealTarget
{
private final double hpPercent;
private final Creature target;
public HealTarget(double hpPercent, Creature target)
{
this.hpPercent = hpPercent;
this.target = target;
}
public double getHpPercent()
{
return hpPercent;
}
public Creature getTarget()
{
return target;
}
}
}