Well, after some quick testing by forcing the encode to send certain values, it seems that the way the structure is set now is perfect or very close to it.
I added these values to the encode:
itbs.backstab = 16;
itbs.dsmitigation = 17;
itbs.heroic_str = 1;
itbs.heroic_int = 2;
itbs.heroic_wis = 3;
itbs.heroic_agi = 4;
itbs.heroic_dex = 5;
itbs.heroic_sta = 6;
itbs.heroic_cha = 7;
itbs.heroic_mr = 8;
itbs.heroic_fr = 9;
itbs.heroic_cr = 10;
itbs.heroic_dr = 11;
itbs.heroic_pr = 12;
itbs.heroic_corr = 13;
itbs.heal_amt = 14;
itbs.spell_dmg = 15;
And here is an example of an item after forcing those values:
Notice that they all match up perfectly
Anyway, I think that means that everything should be correct. The only thing we should need to do is figure out how the augs fit into the last 8 padded bytes in the structure.
I would think that the last of those 8 bytes is almost certainly the null terminator for the whole item or at the very least it is the null terminator for the last aug slot. Since there are only 5 aug slots, 5 of the 8 bytes should definitely be null terminators for those. That leaves 3 that I am unsure about. They are probably either 3 unknowns at the beginning of the 8 or at the end of the 8. One of them may also be clairvoyance, but I have no clue what that even is. Hopefully it wouldn't be too hard to figure that part out.