No animation skills.
Issue #7
resolved
Either revert to old style (patched below) or do something about it.
diff --git a/src/main/java/com/l2jserver/gameserver/model/stats/Formulas.java b/src/main/java/com/l2jserver/gameserver/model/stats/Formulas.java
index 275c117..f9f0b67 100644
--- a/src/main/java/com/l2jserver/gameserver/model/stats/Formulas.java
+++ b/src/main/java/com/l2jserver/gameserver/model/stats/Formulas.java
@@ -1184,13 +1194,18 @@
/**
* Calculate delay (in milliseconds) for skills cast
- * @param speed
+ * @param attacker
+ * @param skill
* @param skillTime
* @return
*/
- public static final double calcAtkSpd(double speed, double skillTime)
+ public static final int calcAtkSpd(L2Character attacker, Skill skill, double skillTime)
{
- return (skillTime / speed) * 333;
+ if (skill.isMagic())
+ {
+ return (int) ((skillTime / attacker.getMAtkSpd()) * 333);
+ }
+ return (int) ((skillTime / attacker.getPAtkSpd()) * 300);
}
/**
diff --git a/src/main/java/com/l2jserver/gameserver/model/actor/L2Character.java b/src/main/java/com/l2jserver/gameserver/model/actor/L2Character.java
index aea50b8..9ffcd06 100644
--- a/src/main/java/com/l2jserver/gameserver/model/actor/L2Character.java
+++ b/src/main/java/com/l2jserver/gameserver/model/actor/L2Character.java
@@ -1760,25 +1778,32 @@
int magicId = skill.getId();
// Get the Base Casting Time of the Skills.
- double skillAnimTime = skill.getHitTime();
+ int skillTime = (skill.getHitTime() + skill.getCoolTime());
if (!skill.isChanneling() || (skill.getChannelingSkillId() == 0))
{
// Calculate the Casting Time of the "Non-Static" Skills (with caster PAtk/MAtkSpd).
if (!skill.isStatic())
{
- skillAnimTime = Formulas.calcAtkSpd(skill.isMagic() ? getMAtkSpd() : getPAtkSpd(), skillAnimTime);
+ skillTime = Formulas.calcAtkSpd(this, skill, skillTime);
}
// Calculate the Casting Time of Magic Skills (reduced in 40% if using SPS/BSPS)
if (skill.isMagic() && (isChargedShot(ShotType.SPIRITSHOTS) || isChargedShot(ShotType.BLESSED_SPIRITSHOTS)))
{
- skillAnimTime = (int) (skillAnimTime / 1.4);
+ skillTime = (int) (0.6 * skillTime);
}
}
- if ((skillAnimTime < 500) && (skill.getHitTime() > 500))
+ // Avoid broken Casting Animation.
+ // Client can't handle less than 550ms Casting Animation in Magic Skills with more than 550ms base.
+ if (skill.isMagic() && ((skill.getHitTime() + skill.getCoolTime()) > 550) && (skillTime < 550))
{
- skillAnimTime = 500;
+ skillTime = 550;
+ }
+ // Client can't handle less than 500ms Casting Animation in Physical Skills with 500ms base or more.
+ else if (!skill.isStatic() && ((skill.getHitTime() + skill.getCoolTime()) >= 500) && (skillTime < 500))
+ {
+ skillTime = 500;
}
// queue herbs and potions
@@ -1796,7 +1821,7 @@
else
{
setIsCastingNow(true);
- _castInterruptTime = -2 + GameTimeController.getInstance().getGameTicks() + ((int) skillAnimTime / GameTimeController.MILLIS_IN_TICK);
+ _castInterruptTime = -2 + GameTimeController.getInstance().getGameTicks() + (skillTime / GameTimeController.MILLIS_IN_TICK);
setLastSkillCast(skill);
}
@@ -1893,7 +1918,7 @@
// Send a Server->Client packet MagicSkillUser with target, displayId, level, skillTime, reuseDelay
// to the L2Character AND to all L2PcInstance in the _KnownPlayers of the L2Character
- broadcastPacket(new MagicSkillUse(this, target, skill.getDisplayId(), skill.getDisplayLevel(), (int) skillAnimTime, reuseDelay));
+ broadcastPacket(new MagicSkillUse(this, target, skill.getDisplayId(), skill.getDisplayLevel(), skillTime, reuseDelay));
// Send a system message to the player.
if (isPlayer() && !skill.isAbnormalInstant())
@@ -1933,25 +1958,20 @@
ThreadPoolManager.getInstance().scheduleEffect(new FlyToLocationTask(this, target, skill), 50);
}
- MagicUseTask mut = new MagicUseTask(this, targets, skill, (int) skillAnimTime, simultaneously);
+ MagicUseTask mut = new MagicUseTask(this, targets, skill, skillTime, simultaneously);
// launch the magic in skillTime milliseconds
- if (skillAnimTime > 0)
+ if (skillTime > 0)
{
// Send a Server->Client packet SetupGauge with the color of the gauge and the casting time
if (isPlayer() && !simultaneously)
{
- sendPacket(new SetupGauge(SetupGauge.BLUE, (int) skillAnimTime));
+ sendPacket(new SetupGauge(SetupGauge.BLUE, skillTime));
}
if (skill.isChanneling() && (skill.getChannelingSkillId() > 0))
{
getSkillChannelizer().startChanneling(skill);
- }
- else if (skill.isContinuous())
- {
- // For client animation reasons (party buffs especially) 300 ms before!
- skillAnimTime -= 300;
}
if (simultaneously)
@@ -1962,7 +1982,10 @@
future.cancel(true);
_skillCast2 = null;
}
- _skillCast2 = ThreadPoolManager.getInstance().scheduleEffect(mut, (int) skillAnimTime);
+
+ // Create a task MagicUseTask to launch the MagicSkill at the end of the casting time (skillTime)
+ // For client animation reasons (party buffs especially) 400 ms before!
+ _skillCast2 = ThreadPoolManager.getInstance().scheduleEffect(mut, skillTime - 400);
}
else
{
@@ -1972,7 +1995,10 @@
future.cancel(true);
_skillCast = null;
}
- _skillCast = ThreadPoolManager.getInstance().scheduleEffect(mut, (int) skillAnimTime);
+
+ // Create a task MagicUseTask to launch the MagicSkill at the end of the casting time (skillTime)
+ // For client animation reasons (party buffs especially) 400 ms before!
+ _skillCast = ThreadPoolManager.getInstance().scheduleEffect(mut, skillTime - 400);
}
}
else
Comments (3)
-
-
- changed status to resolved
Fixing casting animation
Added first unit test. Moved calculations to Formulas class. Fixes
#7→ <<cset df121484114c>>
-
- Log in to comment
nice :D