The issue was never the GCD. GCD calculations are exactly blizzlike, the issue is with the Spell
Queue system as some of you suggested.
Just to explain: blizzard ALWAYS uses this spellqueue, but on our server it's disabled by default (and as of now you can't really enable it, since it's rather bugged - both the command and the system itself).
It should function like this: the client lets you cast a spell 400ms sooner than your GCD finishes (there's a 0-400ms window where you can do that, calculated from the end of the GCD). If you try and spam a spell in that time, the client sends the server a request that you want to cast a spell, and at the same time it tells your character to start the cast animation => the request gets to the server, and immediately interrupts the cast because your GCD is not yet finished => your animation is interrupted.
So in that 400ms you can spam the ability, and you will tremble like someone with epilepsy, but your spell won't go off. To fix this issue, you must use the spellqueue system. After the next server restart, everyone will be able to use ".spellqueue on/off/info".
on will turn it on, off will disable it, info will tell you if it's on or not.
Just a preview of what does it look like after my fix (you'll see how much smoother the transition is from 1 cast to another with spellqueue)
https://youtube.com/watch?v=9nhup3EVKmg:
IMPORTANT!!! THE BEST RESULT IN 99% OF THE CASES IS JUST TO TURN OFF COMPLETELY SPELL QUEUING (BOTH CLIENT -> by the following macro AND SERVER SIDE -> by .spellqueue off)! Turning on spellqueue is recommended ONLY if you have latency issues. If you don't have, we strongly recommend doing the following...
You can also turn off the client's request to
queue spells. This means it will no longer allow that 400ms to try and cast, instead you will have ABSOLUTE control over your scheduling.
In order to do this, you must do the following:
Open your Config.wtf, and add these options
SET MaxSpellStartRecoveryoffset 0
SET ReducedLagTolerance 1
This will disable the
queue timer, and you will never experience that glitching again.
If you want to do it via a macro, you can do:
/console MaxSpellStartRecoveryoffset 0
/console ReducedLagTolerance 1
Don't forget: if you decide to turn it on client side, it is very strongly advised to use .spellqueue off
See the result here:
https://youtube.com/watch?v=9H7wh7Ugukk: