Channeling skills rework.
Adapted from: L2jUnity free files.
This commit is contained in:
@@ -2158,8 +2158,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>
|
||||
@@ -2185,8 +2185,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>
|
||||
|
@@ -1806,7 +1806,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>
|
||||
|
@@ -891,8 +891,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>
|
||||
@@ -912,23 +912,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>
|
||||
@@ -948,23 +947,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>
|
||||
@@ -984,15 +982,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>
|
||||
@@ -1042,8 +1039,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>
|
||||
@@ -1063,15 +1060,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>
|
||||
@@ -3560,7 +3556,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>
|
||||
@@ -3577,14 +3574,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 -->
|
||||
|
@@ -2891,7 +2891,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>
|
||||
@@ -2908,14 +2909,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 -->
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -1752,8 +1752,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" />
|
||||
|
@@ -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()
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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)
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user