Nelimee
It's not a bug, it's a feature.
Plus sérieusement, bien vu. De mémoire j'avais fait ça au début en me disant que du coup je n’inclurai pas la position du writeByte du BBW, mais finalement c'était une mauvaise idée et je n'ai pas tout repris...
Est-ce que les lignes
"super": "GameContextActorPositionInformations",
et
"super_serialize": true,
dans
{
"fields": [
{
"name": "look",
"position": 0,
"self_serialize_method": "serializeAs_EntityLook",
"type": "EntityLook",
"type_namespace": "com.ankamagames.dofus.network.types.game.look"
}
],
"name": "GameContextActorInformations",
"namespace": "com.ankamagames.dofus.network.types.game.context",
"protocolID": 150,
"super": "GameContextActorPositionInformations",
"super_serialize": true,
"supernamespace": "com.ankamagames.dofus.network.types.game.context",
"use_hash_function": false
},
ne réponds pas à ta question? Si non, peux-tu rephraser parce que je n'ai pas compris :)
Pour le BBW ça va vu qu'on a la position et le BBW position, du coup je peux :
private function resetByteWrapperBytes()
{
$isInWrapper = false;
$lastWrapperIndex = 0;
$lastWrapperPosition = 0;
foreach ($this->fields as $field) {
if ($field->getUseBooleanByteWrapper() == true) {
if ($isInWrapper === false) {
$isInWrapper = true;
} elseif ($lastWrapperPosition != $field->getPosition()) {
$lastWrapperIndex = 0;
$lastWrapperPosition = $field->getPosition();
}
$field->setBooleanByteWrapperPosition($lastWrapperIndex);
$lastWrapperIndex++;
} else {
$isInWrapper = false;
$lastWrapperIndex = 0;
}
}
}
En ayant préalablement sort les fields par position puis par position de BBW. Ce code réécris les index's correctement.
Pour les histoires d'héritage en fait c'était inutile, il suffisait de regarder si pas de parent mais des enfants -> déclarer les méthodes serialize et deserialze en virtual et si parent déclarer les méthodes en override et c'était tout bon :)
Vraiment super boulot, je vais partager mon tool soon, c'est pas parfait mais il permet de générer un protocol propre avec toutes les options possibles en fonction des langages (ça a été pensé principalement pour le C# mais techniquement il fonctionne partout à condition de bien gérer les templates), et ça ressemble à:
{%- use 'io.twig' -%}
{%- use 'constructor.twig' -%}
using HetwanSharp.Core.IO;
{% if hasTypeDependency == true %}
using HetwanSharp.Dofus.Protocol.Type;
{% endif %}
{% if hasEnumerationDependency == true %}
using HetwanSharp.Dofus.Protocol.Enum;
{% endif %}
using System;
{% if hasCollectionDependency %}
using System.Collections.Generic;
using System.Linq;
{% endif %}
namespace HetwanSharp.Dofus.Protocol.Message
{
public class {{ name }}{% if parent %} : {{ parent.name }}{% else %} : DofusMessage{% endif ~%}
{
public const uint Id = {{ protocolId }};
public override uint MessageId => Id;
{%~ block class_fields -%}
{{ parent()|ident(8) }}
{%- endblock -%}
{%- block constructor -%}
{{ parent()|ident(8) }}
{%~ endblock -%}
{%~ block serialize -%}
{{ parent()|ident(8) }}
{%~ endblock -%}
{%~ block deserialize -%}
{{ parent()|ident(8) }}
{%- endblock %}
}
}