// 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. } }