Skip to content

Unoccupied sync validity checks

Nexius edited this page Jul 21, 2021 · 14 revisions

Fix for quantum, bottle and other crashers or hacks which make vehicle invisible

#if !defined IsNaN
    #define IsNaN(%0) ((%0) != (%0))
#endif

const UNOCCUPIED_SYNC = 209;

IPacket:UNOCCUPIED_SYNC(playerid, BitStream:bs)
{
    new unoccupiedData[PR_UnoccupiedSync];
 
    BS_IgnoreBits(bs, 8); // ignore packetid (byte)
    BS_ReadUnoccupiedSync(bs, unoccupiedData);

    if ((
            IsNaN(unoccupiedData[PR_position][0]) ||
            IsNaN(unoccupiedData[PR_position][1]) ||
            IsNaN(unoccupiedData[PR_position][2]) ||
            IsNaN(unoccupiedData[PR_angularVelocity][0]) ||
            IsNaN(unoccupiedData[PR_angularVelocity][1]) ||
            IsNaN(unoccupiedData[PR_angularVelocity][2]) ||
            IsNaN(unoccupiedData[PR_velocity][0]) ||
            IsNaN(unoccupiedData[PR_velocity][1]) ||
            IsNaN(unoccupiedData[PR_velocity][2]) ||
            floatabs(unoccupiedData[PR_position][0]) > 20000.0 ||
            floatabs(unoccupiedData[PR_position][1]) > 20000.0 ||
            floatabs(unoccupiedData[PR_position][2]) > 20000.0 ||
            floatabs(unoccupiedData[PR_angularVelocity][0]) > 1.0 ||
            floatabs(unoccupiedData[PR_angularVelocity][1]) > 1.0 ||
            floatabs(unoccupiedData[PR_angularVelocity][2]) > 1.0 ||
            floatabs(unoccupiedData[PR_velocity][0]) > 100.0 ||
            floatabs(unoccupiedData[PR_velocity][1]) > 100.0 ||
            floatabs(unoccupiedData[PR_velocity][2]) > 100.0
        ) || (
            unoccupiedData[PR_roll][0] * unoccupiedData[PR_direction][0] +
            unoccupiedData[PR_roll][1] * unoccupiedData[PR_direction][1] +
            unoccupiedData[PR_roll][2] * unoccupiedData[PR_direction][2] >= 0.000001
        ) || (
            floatabs(
                1.0 - VectorSize(
                    unoccupiedData[PR_roll][0],
                    unoccupiedData[PR_roll][1],
                    unoccupiedData[PR_roll][2]
                )
            ) >= 0.000001
        ) || (
            floatabs(
                1.0 - VectorSize(
                    unoccupiedData[PR_direction][0],
                    unoccupiedData[PR_direction][1],
                    unoccupiedData[PR_direction][2]
                )
            ) >= 0.000001
        )
    ) {
        return 0; // ignore bad packet
    }

    return 1;
}