Channeling skills rework.

Adapted from: L2jUnity free files.
This commit is contained in:
MobiusDev
2018-09-05 16:01:11 +00:00
parent b4be2cc560
commit 735d2f6384
182 changed files with 1705 additions and 1559 deletions

View File

@@ -2457,8 +2457,8 @@
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<channelingTickInitialDelay>3600</channelingTickInitialDelay>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>3.6</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<targetType>OTHERS</targetType>
<affectScope>SINGLE</affectScope>
<conditions>
@@ -2484,8 +2484,8 @@
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<channelingTickInitialDelay>3600</channelingTickInitialDelay>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>3.6</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<targetType>OTHERS</targetType>
<affectScope>SINGLE</affectScope>
<conditions>

View File

@@ -1781,7 +1781,7 @@
<reuseDelay>1000</reuseDelay>
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
<magicCriticalRate>5</magicCriticalRate>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<channelingStart>1</channelingStart>
<channelingTickInterval>0</channelingTickInterval>
<targetType>ADVANCE_BASE</targetType>
<affectScope>SINGLE</affectScope>

View File

@@ -834,8 +834,8 @@
<affectRange>200</affectRange>
<blockedInOlympiad>true</blockedInOlympiad>
<castRange>900</castRange>
<channelingSkillId>1419</channelingSkillId>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<effectPoint>-676</effectPoint>
<attributeType>FIRE</attributeType>
<attributeValue>20</attributeValue>
@@ -855,23 +855,22 @@
<magicCriticalRate>5</magicCriticalRate>
<hitCancelTime>4</hitCancelTime>
<effectRange>1000</effectRange>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<targetType>GROUND</targetType>
<affectScope>POINT_BLANK</affectScope>
<affectObject>NOT_FRIEND</affectObject>
<channelingEffects>
<effect name="MagicalAttack">
<power>500</power>
</effect>
</channelingEffects>
<targetType>GROUND</targetType>
<affectScope>POINT_BLANK</affectScope>
<affectObject>NOT_FRIEND</affectObject>
</skill>
<skill id="1420" toLevel="1" name="Cyclone">
<affectLimit>15-25</affectLimit>
<affectRange>200</affectRange>
<blockedInOlympiad>true</blockedInOlympiad>
<castRange>900</castRange>
<channelingSkillId>1420</channelingSkillId>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<effectPoint>-676</effectPoint>
<attributeType>WIND</attributeType>
<attributeValue>20</attributeValue>
@@ -891,23 +890,22 @@
<magicCriticalRate>5</magicCriticalRate>
<hitCancelTime>4</hitCancelTime>
<effectRange>1000</effectRange>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<targetType>GROUND</targetType>
<affectScope>POINT_BLANK</affectScope>
<affectObject>NOT_FRIEND</affectObject>
<channelingEffects>
<effect name="MagicalAttack">
<power>500</power>
</effect>
</channelingEffects>
<targetType>GROUND</targetType>
<affectScope>POINT_BLANK</affectScope>
<affectObject>NOT_FRIEND</affectObject>
</skill>
<skill id="1421" toLevel="1" name="Raging Waves">
<affectLimit>15-25</affectLimit>
<affectRange>200</affectRange>
<blockedInOlympiad>true</blockedInOlympiad>
<castRange>900</castRange>
<channelingSkillId>1421</channelingSkillId>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<effectPoint>-676</effectPoint>
<attributeType>WATER</attributeType>
<attributeValue>20</attributeValue>
@@ -927,15 +925,14 @@
<magicCriticalRate>5</magicCriticalRate>
<hitCancelTime>4</hitCancelTime>
<effectRange>1000</effectRange>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<targetType>GROUND</targetType>
<affectScope>POINT_BLANK</affectScope>
<affectObject>NOT_FRIEND</affectObject>
<channelingEffects>
<effect name="MagicalAttack">
<power>500</power>
</effect>
</channelingEffects>
<targetType>GROUND</targetType>
<affectScope>POINT_BLANK</affectScope>
<affectObject>NOT_FRIEND</affectObject>
</skill>
<skill id="1422" toLevel="1" name="Day of Doom">
<blockedInOlympiad>true</blockedInOlympiad>
@@ -985,8 +982,8 @@
<affectRange>200</affectRange>
<blockedInOlympiad>true</blockedInOlympiad>
<castRange>900</castRange>
<channelingSkillId>1423</channelingSkillId>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<effectPoint>-676</effectPoint>
<attributeType>DARK</attributeType>
<attributeValue>20</attributeValue>
@@ -1006,15 +1003,14 @@
<magicCriticalRate>5</magicCriticalRate>
<hitCancelTime>4</hitCancelTime>
<effectRange>1000</effectRange>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<targetType>GROUND</targetType>
<affectScope>POINT_BLANK</affectScope>
<affectObject>NOT_FRIEND</affectObject>
<channelingEffects>
<effect name="MagicalAttack">
<power>500</power>
</effect>
</channelingEffects>
<targetType>GROUND</targetType>
<affectScope>POINT_BLANK</affectScope>
<affectObject>NOT_FRIEND</affectObject>
</skill>
<skill id="1424" toLevel="1" name="Anti-summoning Field">
<blockedInOlympiad>true</blockedInOlympiad>
@@ -3476,7 +3472,8 @@
<!-- Confirmed CT2.5 -->
<!-- Kamael Final Form Skill -->
<castRange>900</castRange>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<effectPoint>-676</effectPoint>
<effectRange>1000</effectRange>
<attributeType>DARK</attributeType>
@@ -3493,14 +3490,13 @@
<staticReuse>true</staticReuse>
<magicCriticalRate>5</magicCriticalRate>
<hitCancelTime>4</hitCancelTime>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<targetType>ENEMY</targetType>
<affectScope>SINGLE</affectScope>
<channelingEffects>
<effect name="MagicalAttack">
<power>30</power>
</effect>
</channelingEffects>
<targetType>ENEMY</targetType>
<affectScope>SINGLE</affectScope>
</skill>
<skill id="1473" toLevel="1" name="Change Weapon">
<!-- Confirmed CT2.5 -->

View File

@@ -2882,7 +2882,8 @@
<!-- Confirmed CT2.5 -->
<!-- Kamael Final Form Skill -->
<castRange>900</castRange>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<effectPoint>-676</effectPoint>
<effectRange>1000</effectRange>
<attributeType>DARK</attributeType>
@@ -2899,14 +2900,13 @@
<staticReuse>true</staticReuse>
<magicCriticalRate>5</magicCriticalRate>
<hitCancelTime>4</hitCancelTime>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<targetType>ENEMY</targetType>
<affectScope>SINGLE</affectScope>
<channelingEffects>
<effect name="MagicalAttack">
<power>30</power>
</effect>
</channelingEffects>
<targetType>ENEMY</targetType>
<affectScope>SINGLE</affectScope>
</skill>
<skill id="1546" toLevel="1" name="Strider Fear">
<!-- Confirmed CT2.5 -->

View File

@@ -4527,7 +4527,7 @@
<skill id="5396" toLevel="1" name="Spell Stance">
<castRange>400</castRange>
<channelingSkillId>5397</channelingSkillId>
<channelingTickInterval>2000</channelingTickInterval>
<channelingTickInterval>2</channelingTickInterval>
<hitTime>15000</hitTime>
<isMagic>2</isMagic> <!-- Static Skill -->
<operateType>CA5</operateType>
@@ -4536,7 +4536,7 @@
<magicCriticalRate>-5</magicCriticalRate>
<effectRange>600</effectRange>
<magicLvl>77</magicLvl>
<channelingTickInitialDelay>3600</channelingTickInitialDelay>
<channelingStart>3.6</channelingStart>
<targetType>OTHERS</targetType>
<affectScope>SINGLE</affectScope>
</skill>

View File

@@ -372,11 +372,16 @@
<attributeType>FIRE</attributeType>
<attributeValue>180</attributeValue>
<affectRange>250</affectRange>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<targetType>SELF</targetType>
<affectScope>POINT_BLANK</affectScope>
<affectObject>NOT_FRIEND</affectObject>
<channelingEffects>
<effect name="MagicalAttack">
<power>100</power>
</effect>
</channelingEffects>
</skill>
<skill id="5514" toLevel="1" name="Water Taint">
<effectPoint>-1063</effectPoint>
@@ -388,11 +393,16 @@
<attributeType>WATER</attributeType>
<attributeValue>180</attributeValue>
<affectRange>250</affectRange>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<targetType>SELF</targetType>
<affectScope>POINT_BLANK</affectScope>
<affectObject>NOT_FRIEND</affectObject>
<channelingEffects>
<effect name="MagicalAttack">
<power>30</power>
</effect>
</channelingEffects>
</skill>
<skill id="5515" toLevel="1" name="Wind Taint">
<effectPoint>-1063</effectPoint>
@@ -404,11 +414,16 @@
<attributeType>WIND</attributeType>
<attributeValue>180</attributeValue>
<affectRange>250</affectRange>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<targetType>SELF</targetType>
<affectScope>POINT_BLANK</affectScope>
<affectObject>NOT_FRIEND</affectObject>
<channelingEffects>
<effect name="MagicalAttack">
<power>30</power>
</effect>
</channelingEffects>
</skill>
<skill id="5516" toLevel="1" name="Earth Taint">
<effectPoint>-1063</effectPoint>
@@ -420,11 +435,16 @@
<attributeType>EARTH</attributeType>
<attributeValue>180</attributeValue>
<affectRange>250</affectRange>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<targetType>SELF</targetType>
<affectScope>POINT_BLANK</affectScope>
<affectObject>NOT_FRIEND</affectObject>
<channelingEffects>
<effect name="MagicalAttack">
<power>30</power>
</effect>
</channelingEffects>
</skill>
<skill id="5517" toLevel="1" name="Nurture">
<abnormalLvl>1</abnormalLvl>

View File

@@ -311,9 +311,9 @@
<magicCriticalRate>-5</magicCriticalRate>
<effectRange>1700</effectRange>
<channelingSkillId>5713</channelingSkillId>
<channelingTickInitialDelay>3600</channelingTickInitialDelay>
<channelingStart>3.6</channelingStart>
<mpPerChanneling>15</mpPerChanneling>
<channelingTickInterval>2000</channelingTickInterval>
<channelingTickInterval>2</channelingTickInterval>
<targetType>OTHERS</targetType>
<affectScope>SINGLE</affectScope>
<effects>
@@ -2233,9 +2233,9 @@
<magicCriticalRate>-5</magicCriticalRate>
<effectRange>600</effectRange>
<channelingSkillId>5713</channelingSkillId>
<channelingTickInitialDelay>3600</channelingTickInitialDelay>
<channelingStart>3.6</channelingStart>
<mpPerChanneling>15</mpPerChanneling>
<channelingTickInterval>2000</channelingTickInterval>
<channelingTickInterval>2</channelingTickInterval>
<castRange>400</castRange>
<targetType>OTHERS</targetType>
<affectScope>SINGLE</affectScope>

View File

@@ -1142,8 +1142,8 @@
<hitCancelTime>0</hitCancelTime>
<effectRange>1400</effectRange>
<channelingSkillId>14559</channelingSkillId>
<channelingTickInitialDelay>1200</channelingTickInitialDelay>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1.2</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<icon>icon.skill1042</icon>
<hitTime>10000</hitTime>
<reuseDelay>30000</reuseDelay>

View File

@@ -871,7 +871,7 @@
<hitCancelTime>0</hitCancelTime>
<effectRange>2000</effectRange>
<magicLvl>85</magicLvl>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<channelingStart>1</channelingStart>
<channelingTickInterval>0</channelingTickInterval>
<hitTime>90000</hitTime>
<castRange>2000</castRange>

View File

@@ -1705,7 +1705,7 @@
<attributeType>FIRE</attributeType>
<attributeValue>20</attributeValue>
<affectRange>200</affectRange>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<channelingStart>1</channelingStart>
<channelingTickInterval>0</channelingTickInterval>
<targetType>SELF</targetType>
<affectScope>POINT_BLANK</affectScope>

View File

@@ -522,8 +522,8 @@
<effectRange>3000</effectRange>
<magicLvl>99</magicLvl>
<channelingSkillId>15175</channelingSkillId>
<channelingTickInitialDelay>1200</channelingTickInitialDelay>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1.2</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<isMagic>2</isMagic>
<isDebuff>true</isDebuff>
<targetType>TARGET</targetType>
@@ -564,8 +564,8 @@
<effectRange>3000</effectRange>
<magicLvl>99</magicLvl>
<channelingSkillId>15177</channelingSkillId>
<channelingTickInitialDelay>1200</channelingTickInitialDelay>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1.2</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<isMagic>2</isMagic>
<isDebuff>true</isDebuff>
<targetType>TARGET</targetType>
@@ -606,8 +606,8 @@
<effectRange>3000</effectRange>
<magicLvl>99</magicLvl>
<channelingSkillId>15179</channelingSkillId>
<channelingTickInitialDelay>1200</channelingTickInitialDelay>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1.2</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<isMagic>2</isMagic>
<isDebuff>true</isDebuff>
<targetType>TARGET</targetType>
@@ -648,8 +648,8 @@
<effectRange>3000</effectRange>
<magicLvl>99</magicLvl>
<channelingSkillId>15181</channelingSkillId>
<channelingTickInitialDelay>1200</channelingTickInitialDelay>
<channelingTickInterval>2000</channelingTickInterval>
<channelingStart>1.2</channelingStart>
<channelingTickInterval>2</channelingTickInterval>
<isMagic>2</isMagic>
<isDebuff>true</isDebuff>
<targetType>TARGET</targetType>

View File

@@ -1350,7 +1350,7 @@
<hitCancelTime>0</hitCancelTime>
<effectRange>2160</effectRange>
<magicLvl>95</magicLvl>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<channelingStart>1</channelingStart>
<channelingTickInterval>0</channelingTickInterval>
<isMagic>1</isMagic>
<targetType>TARGET</targetType>

View File

@@ -499,7 +499,7 @@
<hitCancelTime>0</hitCancelTime>
<effectRange>1100</effectRange>
<magicLvl>85</magicLvl>
<channelingTickInitialDelay>1000</channelingTickInitialDelay>
<channelingStart>1</channelingStart>
<channelingTickInterval>0</channelingTickInterval>
<isMagic>2</isMagic>
<hitTime>10000</hitTime>

View File

@@ -1765,8 +1765,8 @@
<xs:element name="blockedInOlympiad" type="xs:boolean" />
<xs:element name="channelingSkillId" type="xs:unsignedShort" />
<xs:element name="mpPerChanneling" type="xs:unsignedByte" />
<xs:element name="channelingTickInitialDelay" type="xs:unsignedShort" />
<xs:element name="channelingTickInterval" type="xs:unsignedShort" />
<xs:element name="channelingStart" type="xs:decimal" />
<xs:element name="channelingTickInterval" type="xs:decimal" />
<xs:element name="removedOnDamage" type="xs:boolean" />
<xs:element name="removedOnAnyActionExceptMove" type="xs:boolean" />
<xs:element name="itemConsumeSteps" type="xs:unsignedByte" />

View File

@@ -126,7 +126,7 @@ public final class Skill implements IIdentifiable
private final int _refId;
// all times in milliseconds
private final int _hitTime;
// private final int _skillInterruptTime;
private final double _hitCancelTime;
private final int _coolTime;
private final long _reuseHashCode;
private final int _reuseDelay;
@@ -185,8 +185,8 @@ public final class Skill implements IIdentifiable
// Channeling data
private final int _channelingSkillId;
private final int _channelingTickInitialDelay;
private final int _channelingTickInterval;
private final long _channelingStart;
private final long _channelingTickInterval;
// Mentoring
private final boolean _isMentoring;
@@ -259,6 +259,7 @@ public final class Skill implements IIdentifiable
_stayAfterDeath = set.getBoolean("stayAfterDeath", false);
_hitTime = set.getInt("hitTime", 0);
_hitCancelTime = set.getDouble("hitCancelTime", 0);
_coolTime = set.getInt("coolTime", 0);
_isDebuff = set.getBoolean("isDebuff", false);
_isRecoveryHerb = set.getBoolean("isRecoveryHerb", false);
@@ -391,8 +392,8 @@ public final class Skill implements IIdentifiable
_icon = set.getString("icon", "icon.skill0000");
_channelingSkillId = set.getInt("channelingSkillId", 0);
_channelingTickInterval = set.getInt("channelingTickInterval", 2000);
_channelingTickInitialDelay = set.getInt("channelingTickInitialDelay", _channelingTickInterval);
_channelingTickInterval = (long) set.getFloat("channelingTickInterval", 2000f) * 1000;
_channelingStart = (long) (set.getFloat("channelingStart", 0f) * 1000);
_isMentoring = set.getBoolean("isMentoring", false);
@@ -478,11 +479,6 @@ public final class Skill implements IIdentifiable
return false;
}
public boolean isDamage()
{
return hasEffectType(L2EffectType.MAGICAL_ATTACK, L2EffectType.HP_DRAIN, L2EffectType.PHYSICAL_ATTACK, L2EffectType.PHYSICAL_ATTACK_HP_LINK);
}
public boolean isSuicideAttack()
{
return _isSuicideAttack;
@@ -863,6 +859,11 @@ public final class Skill implements IIdentifiable
return _hitTime;
}
public double getHitCancelTime()
{
return _hitCancelTime;
}
/**
* @return the cool time
*/
@@ -1355,8 +1356,6 @@ public final class Skill implements IIdentifiable
final EffectScope pvpOrPveEffectScope = effector.isPlayable() && effected.isAttackable() ? EffectScope.PVE : effector.isPlayable() && effected.isPlayable() ? EffectScope.PVP : null;
applyEffectScope(pvpOrPveEffectScope, info, instant, addContinuousEffects);
applyEffectScope(EffectScope.CHANNELING, info, instant, addContinuousEffects);
if (addContinuousEffects)
{
// Aura skills reset the abnormal time.
@@ -1430,6 +1429,23 @@ public final class Skill implements IIdentifiable
}
}
/**
* Applies the channeling effects from this skill to the target.
* @param effector the caster of the skill
* @param effected the target of the effect
*/
public void applyChannelingEffects(L2Character effector, L2Character effected)
{
// null targets cannot receive any effects.
if (effected == null)
{
return;
}
final BuffInfo info = new BuffInfo(effector, effected, this, false, null, null);
applyEffectScope(EffectScope.CHANNELING, info, true, true);
}
/**
* Activates a skill for the given creature and targets.
* @param caster the caster
@@ -1489,8 +1505,6 @@ public final class Skill implements IIdentifiable
final EffectScope pvpOrPveEffectScope = caster.isPlayable() && target.isAttackable() ? EffectScope.PVE : caster.isPlayable() && target.isPlayable() ? EffectScope.PVP : null;
applyEffectScope(pvpOrPveEffectScope, info, true, false);
applyEffectScope(EffectScope.CHANNELING, info, true, false);
}
else
{
@@ -1709,14 +1723,14 @@ public final class Skill implements IIdentifiable
return _icon;
}
public int getChannelingTickInterval()
public long getChannelingTickInterval()
{
return _channelingTickInterval;
}
public int getChannelingTickInitialDelay()
public long getChannelingTickInitialDelay()
{
return _channelingTickInitialDelay;
return _channelingStart;
}
public Set<MountType> getRideState()

View File

@@ -389,7 +389,7 @@ public class SkillCaster implements Runnable
}
// Start channeling if skill is channeling.
if (_skill.isChanneling() && (_skill.getChannelingSkillId() > 0))
if (_skill.isChanneling())
{
caster.getSkillChannelizer().startChanneling(_skill);
}

View File

@@ -149,82 +149,84 @@ public class SkillChannelizer implements Runnable
}
// Apply channeling skills on the targets.
if (skill.getChannelingSkillId() > 0)
final List<L2Character> targetList = new ArrayList<>();
final L2Object target = skill.getTarget(_channelizer, false, false, false);
if (target != null)
{
final List<L2Character> targetList = new ArrayList<>();
final L2Object target = skill.getTarget(_channelizer, false, false, false);
if (target != null)
skill.forEachTargetAffected(_channelizer, target, o ->
{
skill.forEachTargetAffected(_channelizer, target, o ->
if (o.isCharacter())
{
if (o.isCharacter())
targetList.add((L2Character) o);
((L2Character) o).getSkillChannelized().addChannelizer(skill.getChannelingSkillId(), _channelizer);
}
});
}
if (targetList.isEmpty())
{
return;
}
channelized = targetList;
for (L2Character character : channelized)
{
if (!Util.checkIfInRange(skill.getEffectRange(), _channelizer, character, true))
{
continue;
}
else if (!GeoEngine.getInstance().canSeeTarget(_channelizer, character))
{
continue;
}
if (skill.getChannelingSkillId() > 0)
{
final int maxSkillLevel = SkillData.getInstance().getMaxLevel(skill.getChannelingSkillId());
final int skillLevel = Math.min(character.getSkillChannelized().getChannerlizersSize(skill.getChannelingSkillId()), maxSkillLevel);
final BuffInfo info = character.getEffectList().getBuffInfoBySkillId(skill.getChannelingSkillId());
if ((info == null) || (info.getSkill().getLevel() < skillLevel))
{
final Skill channeledSkill = SkillData.getInstance().getSkill(skill.getChannelingSkillId(), skillLevel);
if (channeledSkill == null)
{
targetList.add((L2Character) o);
((L2Character) o).getSkillChannelized().addChannelizer(skill.getChannelingSkillId(), _channelizer);
LOGGER.warning(getClass().getSimpleName() + ": Non existent channeling skill requested: " + skill);
_channelizer.abortCast();
return;
}
});
}
if (targetList.isEmpty())
{
return;
}
channelized = targetList;
for (L2Character character : channelized)
{
if (!Util.checkIfInRange(skill.getEffectRange(), _channelizer, character, true))
{
continue;
}
else if (!GeoEngine.getInstance().canSeeTarget(_channelizer, character))
{
continue;
}
else
{
final int maxSkillLevel = SkillData.getInstance().getMaxLevel(skill.getChannelingSkillId());
final int skillLevel = Math.min(character.getSkillChannelized().getChannerlizersSize(skill.getChannelingSkillId()), maxSkillLevel);
final BuffInfo info = character.getEffectList().getBuffInfoBySkillId(skill.getChannelingSkillId());
if ((info == null) || (info.getSkill().getLevel() < skillLevel))
// Update PvP status
if (character.isPlayable() && _channelizer.isPlayer())
{
final Skill channeledSkill = SkillData.getInstance().getSkill(skill.getChannelingSkillId(), skillLevel);
if (channeledSkill == null)
{
LOGGER.warning(getClass().getSimpleName() + ": Non existent channeling skill requested: " + skill);
_channelizer.abortCast();
return;
}
// Update PvP status
if (character.isPlayable() && _channelizer.isPlayer())
{
((L2PcInstance) _channelizer).updatePvPStatus(character);
}
// Be warned, this method has the possibility to call doDie->abortCast->stopChanneling method. Variable cache above try"+ +" is used in this case to avoid NPEs.
channeledSkill.applyEffects(_channelizer, character);
// Reduce shots.
if (skill.useSpiritShot())
{
_channelizer.unchargeShot(_channelizer.isChargedShot(ShotType.BLESSED_SPIRITSHOTS) ? ShotType.BLESSED_SPIRITSHOTS : ShotType.SPIRITSHOTS);
}
else
{
_channelizer.unchargeShot(_channelizer.isChargedShot(ShotType.BLESSED_SOULSHOTS) ? ShotType.BLESSED_SOULSHOTS : ShotType.SOULSHOTS);
}
// Shots are re-charged every cast.
_channelizer.rechargeShots(skill.useSoulShot(), skill.useSpiritShot(), false);
}
if (!skill.isToggle())
{
_channelizer.broadcastPacket(new MagicSkillLaunched(_channelizer, skill.getId(), skill.getLevel(), SkillCastingType.NORMAL, character));
((L2PcInstance) _channelizer).updatePvPStatus(character);
}
// Be warned, this method has the possibility to call doDie->abortCast->stopChanneling method. Variable cache above try{} is used in this case to avoid NPEs.
channeledSkill.applyEffects(_channelizer, character);
}
if (!skill.isToggle())
{
_channelizer.broadcastPacket(new MagicSkillLaunched(_channelizer, skill.getId(), skill.getLevel(), SkillCastingType.NORMAL, character));
}
}
else
{
skill.applyChannelingEffects(_channelizer, character);
}
// Reduce shots.
if (skill.useSpiritShot())
{
_channelizer.unchargeShot(_channelizer.isChargedShot(ShotType.BLESSED_SPIRITSHOTS) ? ShotType.BLESSED_SPIRITSHOTS : ShotType.SPIRITSHOTS);
}
else
{
_channelizer.unchargeShot(_channelizer.isChargedShot(ShotType.BLESSED_SOULSHOTS) ? ShotType.BLESSED_SOULSHOTS : ShotType.SOULSHOTS);
}
// Shots are re-charged every cast.
_channelizer.rechargeShots(skill.useSoulShot(), skill.useSpiritShot(), false);
}
}
catch (Exception e)

View File

@@ -484,13 +484,7 @@ public final class Formulas
public static double calcSkillCancelTime(L2Character creature, Skill skill)
{
// Fishing skills.
if ((skill.getId() == 1312) || (skill.getId() == 1314) || (skill.getId() == 1315))
{
return 0;
}
// return (int) Math.max(skill.getCancelTime() / calcSkillTimeFactor(attacker, skill), 500);
return Math.max(skill.getHitTime() / calcSkillTimeFactor(creature, skill), SKILL_LAUNCH_TIME);
return Math.max((skill.getHitCancelTime() * 1000) / calcSkillTimeFactor(creature, skill), SKILL_LAUNCH_TIME);
}
/**