// This will set the player's position before setOwner() is called.
    public override int SetInformation(object[] data, object[] a, object[] b, bool isThisFirstTick, bool isThisMine)
    {
        playerOwner = (short)data [0];
        GetComponent <PlayerMove> ().plyr = playerOwner;

        if (!ranBeforeFirstInterp)
        {
            ranBeforeFirstInterp = true;
            beforeFirstInterp();
        }

        if (isThisMine)
        {
            // Absolutely NO interp is done when isThisMine = true!!

            GetComponent <Combat> ().health = (short)data [1];            // Duplicate because Player needs this information as well as Clients. (On a non-Prediction Error basis, as it is not predicted)

            // This is only called when new data is received.. although that data can be identical since no frames were simulated..

            if (GetComponent <ClassControl> ().classNum == 4)
            {
                GetComponent <ClassControl> ().setHealthTaken((float)data [4]);                 // health taken is kind of like health in terms of how it syncs
            }
            playerTriggerSet.AddTriggerSet((TriggerSet)data [2]);

            // Trigger triggers:
            for (int i = 0; i < playerTriggerSet.triggerIndecies.Count; i++)
            {
                byte   index       = playerTriggerSet.triggerIndecies [i];
                int    triggerTick = playerTriggerSet.triggerTickNumbers [i];
                object obj         = playerTriggerSet.triggerData [i];
                if (index == DAMAGE_NUMBER)
                {
                    DamageNumber d        = (DamageNumber)obj;
                    Vector3      spawnPos = d.posData + new Vector3(UnityEngine.Random.Range(-0.1f, 0.1f), 1f, UnityEngine.Random.Range(-0.1f, 0.1f));
                    GameObject   dmgNum   = (GameObject)Instantiate(damageNumber, spawnPos, Quaternion.identity);
                    dmgNum.GetComponent <LookAtPlayer> ().DamageDone((short)d.damage); // Hitsound / Setting of text
                    //dmgNum.
                    Destroy(dmgNum, 0.5f);                                             // Could be effected by gravity as well
                }

                if (index == DAMAGE_TAKEN)
                {
                    DamageNumber d = (DamageNumber)obj;
                    GetComponent <Combat> ().addDamageIndicator(d);
                }
            }

            object[] finalObjects = new object[data.Length - getPlayerStateStartIndex()];
            Array.Copy(data, getPlayerStateStartIndex(), finalObjects, 0, data.Length - getPlayerStateStartIndex());

            GetComponent <PlayerMove> ().predictionErrorTest.testForPredictionError((short)data [3], finalObjects, GetComponent <PlayerMove> ());

            return(getBitChoicesLengthThis(true));             // This is discarded, so it's not important.
        }
        else
        {
            GetComponent <Combat> ().health = (short)data [1];
            transform.position    = (Vector3)data [2];
            transform.eulerAngles = new Vector3(transform.eulerAngles.x, ((YRotation)data [3]).interpValue, transform.eulerAngles.z);
            transform.GetComponent <PlayerMove> ().currentPlayerRotUpDown = ((UpDownRotation)data [4]).interpValue;

            GetComponent <ClassControl> ().clientInterp((byte)data [5]);

            Unlock nextUnlock = null;
            if (!GetComponent <ClassControl> ().isSwitching())
            {
                nextUnlock = GetComponent <ClassControl> ().getUnlockEquipped();
            }

            // Client side uses a global representation of Unlock:
            currentTriggerSet.AddTriggerSet((TriggerSet)data [6]);

            // Trigger triggers:
            for (int i = 0; i < currentTriggerSet.triggerIndecies.Count; i++)
            {
                byte   index       = currentTriggerSet.triggerIndecies [i];
                int    triggerTick = currentTriggerSet.triggerTickNumbers [i];
                object obj         = currentTriggerSet.triggerData [i];
                if (index == FIRE_TRIGGER)
                {
                    if (nextUnlock != null)
                    {
                        nextUnlock.FireTriggered(true, triggerTick);
                    }
                }
                else if (index == SECONDARY_FIRE_TRIGGER)
                {
                    if (nextUnlock != null)
                    {
                        nextUnlock.SecondaryFireTriggered(true, triggerTick);
                    }
                }
                else if (index == RELOAD_TRIGGER)
                {
                    if (nextUnlock != null && nextUnlock is GunScript)
                    {
                        ((GunScript)nextUnlock).ReloadTriggered(true, triggerTick);
                    }
                }
                else if (index == HITSCAN)
                {
                    if (nextUnlock != null && nextUnlock is HitscanGun)
                    {
                        ((HitscanGun)nextUnlock).hitscanData((Vector3[])obj);
                    }
                }
            }

            GetComponent <PlayerMove> ().isGrounded = (((byte)data [7] & (1 << 0)) != 0);
            GetComponent <PlayerMove> ().isCrouched = (((byte)data [7] & (1 << 1)) != 0);
            GetComponent <PlayerMove> ().ClientPhasingOrSpeedBoosting = (((byte)data [7] & (1 << 2)) != 0);
            GetComponent <PlayerMove> ().puttingArmorOn = (((byte)data [7] & (1 << 3)) != 0);

            if (GetComponent <ClassControl> ().classNum == 1)
            {
                GetComponent <ClassControl> ().getUnlockEquippedWithType <Pistol> ().setMode((byte)data [8]);
            }

            GetComponent <PlayerMove> ().UpdateCrouchedRep(Interp.lastDeltaTickNumber * Time.fixedDeltaTime);
            GetComponent <PlayerMove> ().UpdateArmorRep(Interp.lastDeltaTickNumber * Time.fixedDeltaTime);

            // Client updates:
            GetComponent <PlayerMove>().PlayerMoveRun();

            return(9);            // This is discarded, so it's not important.
        }
    }