@Override
    default void updateAndPropagate(@Nullable IPropagationPart prev, int mode) {
        if (mode == DROPPING && getSignal() == 0) return;

        int oldSignal = getSignal();
        int newSignal = calculateSignal();

        if (newSignal < oldSignal) {
            if (newSignal > 0) {
                RedstonePropagator.propagateAnalogDrop(this);
            }
            setSignal(0);
            propagateForward(prev, DROPPING);

        } else if (newSignal > oldSignal) {
            setSignal(newSignal);
            if (mode == DROPPING) {
                propagateForward(null, RISING);
            } else {
                propagateForward(prev, RISING);
            }

        } else if (mode == FORCE) {
            propagateForward(prev, FORCED);

        } else if (mode == DROPPING) {
            // Dropping propagation, but no signal change. Propagate rising back
            propagateBackward(prev, RISING);
        }
    }
Actively calculates the current Redstone signal this part is receiving.
@return The calculated redstone signal
core/src/main/java/mrtjp/projectred/core/part/IRedstonePropagationPart.java