Hello everyone, Nemekh here with a topic that has come up a handful of times since the launch of Shadowbringers:
Visibly doing 0 damage
Understanding The Problem
7 months ago in the first Shadowbringers Savage tier a player by the alias Sakubus clipped a segment of his streaming E3S where he observed that his Midare Setsugekka had been a Critical Hit for 0 damage.
In the clip you can see “Midare Setsugekka 0!” at around 5s in.
4 months later a similar case was reported again where a Summoner by the alias of Valaina came to the Summoner Balance channels reporting that their Akh Morn had been a Critical Direct Hit (CDH, not DHC!) for 0 damage, asking what had happened.
In this clip you can see “Akh Morn 0!!” at around 10s in.
Unfortunately there was no data other than these clips to attempt to scratch the surface of why this has been happening. That is until 4 days ago.
The issue was brought up again this time in the Ninja Balance channels by the player Ashpd reporting that they had a Raiton Critical Direct Hit for 0 damage.
Fellow Balance mentors Jessica and Sheenda pinged me and I jumped to it talking Ashpd through the log data that would be useful to make heads or tails over this peculiar damage problem. Fortunately they had logged the pull where it happened and kindly provided with me the XIV Plugin Network log data to go over.
There was one common thread recognised with all of these cases:
The intended damage range for the actions that hit for 0, given their gear at the time and being a Crit or CDH, was close to one another. All at least 60k.
Additional recent examples:
The Game Client’s Inaccuracies
Before going over the analysis, a bit of back story.
In Heavensward and part of Stormblood it was noticed that damage above a certain threshold would always end in a 0, seemingly any value above 30k, where the initial value would be sent to the client then multiplied by 10 and the end being truncated to 0.
Consider a Fire IV in early Stormblood hitting Ravana in DPS Stance for over 30k. 31450, 30870, 32410 etc. The numbers would always end in 0.
However, I didn’t believe that given how damage rolls actually worked in the game that this was in fact accurate. Thus I performed some enmity tests (as we know that damage is 1:1 with enmity before any aggro modifiers), as well as comparing Ravana’s remaining HP before and after.
One damage roll observed was 30530. After subtracting all other enmity events (initial damage GCD + buff enmity from Enochian) and cross checking it against Ravana’s remaining HP, it was seen that the true damage dealt was in fact 30532. (The data is somewhere in the Allagan Studies discord archives)
This meant that an observed 30530 could in fact be any number in the range of 30530-30539 and that for each direct damage event.
It was one of our earlier confirmations that damage sent to the client from the server isn’t entirely accurate.
With the release of Patch 4.40 on September 18th 2018, Square Enix changed up how they sent damage allowing for not only in greater accuracy for direct damage reported, but also a much higher range.
Players may remember during O12S where if M/F were both tethered and buffed up that their dashes would hit for millions and millions of damage far exceeding our max HP and any previous damage cap values.
This was made possible through some structure changes for the server and game client and notably in the net data sent to the client from the server. I’ll come back to why the change is important later.
What Did The Server Send Us?
The following is from the processed net log data sent from Ashpd:
[21:42:05.000] Sice Yvain uses Raiton.
[21:42:05.000] ⇒ Critical direct hit! Shiva takes 0 damage.
These highlight the specific lines representing the 0 damage Raiton.
The last two lines come directly from the in game battle log. If this problem happens to a player, it will not only appear in visible floating text but also show in the in game battle log that the entity “takes 0 damage”.
Typically this log is reliable and serves as one of the methods for verifying if a player action was a ghost action (that is, it didn’t really happen even if ACT/FFLogs thinks it did).
The first line is the summarised net log line from the data the server sends to the client that ACT’s XIV Plugin reads (with some irrelevant data trimmed off).
While I won’t explain every part, I will go over the pertinent ones:
This represents :ActionID:ActionName: of what the actor is performing. 0x8DB is 2267 in decimal aka one of Raiton’s IDs.
This contains the action elemental aspect, the action damage type and the flag for whether an action was a Normal, Critical, Direct Hit, or Critical Direct Hit roll. 55 represents Lightning Magic and the first 03 represents a Critical Direct Hit.
This represents the recipient actor’s hp at the time of the action snapshot and their max hp. In this case, Shiva’s “current” hp at the time was 70539402 out of a maximum of 72360160.
There is the 4th part which is important, but it’s not anything before the damage type data. It’s what is next in the sequence which represents direct damage numbers. In this case what was sent is :0:.
This further confirms that the server is telling the client “the action did 0 damage”.
By comparison, this is what a more normal CDH Raiton should look like from net log data:
[16:31:24.262] :8DB:Raiton:40000519:Striking Dummy:550303:CC060000:0:0:0:0:0:0:0:0:0:0:0:0:0:0:2862500:2862500:
[16:31:24.000] ⇒ Critical direct hit! The striking dummy takes 52230 damage.
The underlined :CC06 represents the direct damage in hexadecimal which when 0xCC06 is converted to decimal becomes 52230.
Hypothesis: The 0 is 65535 or 65536
Over the years Square Enix have had to change how data is sent from the server to the client due to increases in numbers across the board. Older max hits went from 30k (certain ARR enrages & max hits) to 99999 (HW Enrages & max hits), damage rolls above 30k would visibly end in 0 but truly be damage ending in 0-9 with damage caps changing significantly in early and late Stormblood. Detailing the full history of this would merit its own post!
In Stormblood they changed the max value sent in damage packets to be 65535 or 0xFFFF in hexadecimal as it is the most you can fit into 16 bits of data. 65536 is 0x 1 0000 in hexadecimal. From our experiences strange things can happen at the max limits of damage value sent, so it was plausible the problem only occurs at those values or multiples of them.
Confirming The 0 Was In Fact 65535
In order to confirm if the Raiton damage event was legitimately 0 or otherwise you have to compare each health update of Shiva’s that we receive in the net log data. Then by looking at the hp difference between each successive update we know what damage figures we want to match to particular actions.
I have a Fester CDH for 600 hp, a combined DoT tick of 100 damage and a Ruin III for 200 damage.
- A boss starts with 1000 hp.
- Update 1 is 700 hp. Compared to the step before this is a difference of 300 hp.
- Update 2 is 100 hp. Compared to the step before this is a difference of 600 hp.
The first update difference is because of the DoT and Ruin III damage combined. The last update difference is because of the Fester.
That is the general premise of the method only on a party wide scale and making sure the timeline is sane against the actions that occured.
Here is the net log data and here are the findings:
- 70531522 hp at this update
- 70510150 hp at this update, delta of 21372 hp from above.
- Ruin II Crit damage 21372.
- 70490645 hp at this update, delta of 19505 hp from above.
- Heated Slug Shot DH damage 19505.
- 70481624 hp at this update, delta of 9021 hp from above.
- Loyce’s Attack Crit damage 9021.
- 70423935 hp at this update, delta of 57689 hp from above.
- Vorpal Thrust CDH damage 38958 + 18731 combined DoT tick.
- 70358400 hp at this update, delta of 65535 hp from above.
- This can only be Raiton. CDH damage for 65535.
- 70320278 hp at this update, delta of 38122 hp from above.
- Fell Cleave CDH damage 38122.
- 70315760 hp at this update, delta of 4518 hp from above.
- Cynthia’s Shot Normal damage 4518.
Conclusion & Afterthoughts
The cases I have investigated back it being 65535. It is possible that this is breaking at 65536 as well but it’s genuinely time consuming and tedious to fish for exact damage rolls especially when they rely on less frequent RNG rolls beyond normal damage. Damage just is not happening frequently enough to prove this in reasonable time.
My main concern was proving whether it was genuinely 0 damage. Fortunately every time this happens there is real underlying damage - that’s the important thing.
As we move into the realms of stronger gear seeing this event will become more likely for more jobs.
If you see a 0 damage event in the future do not worry. It’s just a display bug! One that Square Enix have recently accepted as a bug.