WeiDU possède une fonction très puissante pour faire la même chose : le couple GET_OFFSET_ARRAY et PHP_EACH. Il y a un exemple concret pour les objets dans le tutoriel 9.24 de la doc WeiDU.
En gros, pour pouvoir l'utiliser, il faut connaître la structure SPL (ou ITM dans le cas du tutorial) et le principe du code proposé par dératiseur. Mais ces fonctions sont tout de même la façon la plus propre de faire.
Exemple perso, pour décoder les caractéristiques d'une arme (extrait pour la partie mêlée) :
[HTML] GET_OFFSET_ARRAY ab_array 0x64 4 0x68 2 0 0 0x38
PHP_EACH ab_array AS int => ab_off BEGIN
// Type d'attaque (mêlée, projectile, lanceur, magique ...)
READ_BYTE (ab_off + 0x00) attacktype // à analyser : 1=mêlée, 2=projectile, 4=launcher, 3=magical ignoré
PATCH_IF attacktype = 1
BEGIN
// mêlée
SET nbAttaques += 1
SPRINT ~typeattaque~ ~Melee~
READ_SHORT (ab_off + 0x0e) attackrangeMelee
SPRINT strallonge ~
Allonge : %attackrangeMelee%~
READ_BYTE (ab_off + 0x12) attackspeedMelee
READ_SHORT (ab_off + 0x14) thac0bonusMelee
READ_BYTE (ab_off + 0x16) dicesidesMelee
READ_BYTE (ab_off + 0x18) dicenumberMelee
READ_SHORT (ab_off + 0x1a) damagebonusMelee
END
END // PHP_EACH
[/HTML]
Tu pourrais faire des WRITE à la place des READ, bien entendu, dans ton cas. Et n'en faire qu'un, puisque tu veux juste modifier un paramètre de chaque extended header.
Le gros du travail est de savoir quoi mettre dans les paramètres de GET_OFFSET_ARRAY et pour ça il suffit de la définition de la structure SPL, dans ton cas. On retrouve d'ailleurs dans mon exemple les valeurs 0x64 et 0x68 du sien.
Ensuite l'intérieur du PHP_EACH travaille avec un offset local à l'élément, pas besoin d'un calcul de type "abilities_off + 0x570*i + 0x6ee" comme dans l'exemple de dératiseur.