No animation skills.

Issue #7 resolved
Sahar Atias created an issue

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)

  1. Log in to comment