public static bool Equals(GameEntity entityA, GameEntity entityB, BitBuffer bufferA, BitBuffer bufferB)
    {
        void Clear()
        {
            bufferA.Clear();
            bufferB.Clear();
        }

        Clear();
        if (entityA.hasPosition && entityB.hasPosition)
        {
            entityA.position.Serialize(bufferA);
            entityB.position.Serialize(bufferB);
            if (!bufferA.Equals(bufferB))
            {
                return(false);
            }
        }
        else if (!entityA.hasPosition && !entityA.hasPosition)
        {
        }
        else
        {
            return(false);
        }
        Clear();
        if (entityA.hasDirection && entityB.hasDirection)
        {
            entityA.direction.Serialize(bufferA);
            entityB.direction.Serialize(bufferB);
            if (!bufferA.Equals(bufferB))
            {
                return(false);
            }
        }
        else if (!entityA.hasDirection && !entityA.hasDirection)
        {
        }
        else
        {
            return(false);
        }
        Clear();
        if (entityA.hasSprite && entityB.hasSprite)
        {
            entityA.sprite.Serialize(bufferA);
            entityB.sprite.Serialize(bufferB);
            if (!bufferA.Equals(bufferB))
            {
                return(false);
            }
        }
        else if (!entityA.hasSprite && !entityA.hasSprite)
        {
        }
        else
        {
            return(false);
        }
        Clear();
        if (entityA.isMover != entityB.isMover)
        {
            return(false);
        }
        Clear();
        if (entityA.hasMove && entityB.hasMove)
        {
            entityA.move.Serialize(bufferA);
            entityB.move.Serialize(bufferB);
            if (!bufferA.Equals(bufferB))
            {
                return(false);
            }
        }
        else if (!entityA.hasMove && !entityA.hasMove)
        {
        }
        else
        {
            return(false);
        }
        Clear();
        if (entityA.hasLastMoveTick && entityB.hasLastMoveTick)
        {
            entityA.lastMoveTick.Serialize(bufferA);
            entityB.lastMoveTick.Serialize(bufferB);
            if (!bufferA.Equals(bufferB))
            {
                return(false);
            }
        }
        else if (!entityA.hasLastMoveTick && !entityA.hasLastMoveTick)
        {
        }
        else
        {
            return(false);
        }
        Clear();
        if (entityA.hasMoverID && entityB.hasMoverID)
        {
            entityA.moverID.Serialize(bufferA);
            entityB.moverID.Serialize(bufferB);
            if (!bufferA.Equals(bufferB))
            {
                return(false);
            }
        }
        else if (!entityA.hasMoverID && !entityA.hasMoverID)
        {
        }
        else
        {
            return(false);
        }
        Clear();
        if (entityA.hasTick && entityB.hasTick)
        {
            entityA.tick.Serialize(bufferA);
            entityB.tick.Serialize(bufferB);
            if (!bufferA.Equals(bufferB))
            {
                return(false);
            }
        }
        else if (!entityA.hasTick && !entityA.hasTick)
        {
        }
        else
        {
            return(false);
        }
        Clear();
        if (entityA.hasIce && entityB.hasIce)
        {
            entityA.ice.Serialize(bufferA);
            entityB.ice.Serialize(bufferB);
            if (!bufferA.Equals(bufferB))
            {
                return(false);
            }
        }
        else if (!entityA.hasIce && !entityA.hasIce)
        {
        }
        else
        {
            return(false);
        }
        Clear();
        if (entityA.isCharacter != entityB.isCharacter)
        {
            return(false);
        }
        Clear();
        if (entityA.hasControlledBy && entityB.hasControlledBy)
        {
            entityA.controlledBy.Serialize(bufferA);
            entityB.controlledBy.Serialize(bufferB);
            if (!bufferA.Equals(bufferB))
            {
                return(false);
            }
        }
        else if (!entityA.hasControlledBy && !entityA.hasControlledBy)
        {
        }
        else
        {
            return(false);
        }
        Clear();
        if (entityA.hasConnection && entityB.hasConnection)
        {
            entityA.connection.Serialize(bufferA);
            entityB.connection.Serialize(bufferB);
            if (!bufferA.Equals(bufferB))
            {
                return(false);
            }
        }
        else if (!entityA.hasConnection && !entityA.hasConnection)
        {
        }
        else
        {
            return(false);
        }
        Clear();
        if (entityA.isSync != entityB.isSync)
        {
            return(false);
        }
        return(true);
    }