// NETWORK CODE // ----- void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if (stream.isWriting) { // send server position, velocity, and the lifetime at which this snapshot was taken stream.SendNext(rigidbody.position); stream.SendNext(Velocity); stream.SendNext(m_Lifetime); } else { // I've chosen to use entity interpolation for the deathball // http://www.gabrielgambetta.com/fpm3.html // it means that the ball will be shown with a 1 packet delay, but with this, I always have an endpos for my interpolation to turn to // Queue should always be packed with 2 networkData newPacket = new networkData(); newPacket.P = (Vector3)stream.ReceiveNext(); newPacket.V = (Vector3)stream.ReceiveNext(); newPacket.Lifetime = (float)stream.ReceiveNext(); newPacket.cT = Time.time; // client time I received this package m_NetworkPackages.Add(newPacket); if (m_NetworkPackages.Count < 2) { // some initting for late joiners m_Lifetime = newPacket.Lifetime;// - 0.1f; //newPacket.Lifetime += .1f; // double package and teleport deathball to server's given position m_NetworkPackages.Add(newPacket); transform.position = newPacket.P; } //else if (m_NetworkPackages.Count >= 2) //{ // // rreducelifteime of first packet with delay // float packageDelay = ((networkData)(m_NetworkPackages[1])).Lifetime - ((networkData)(m_NetworkPackages[0])).Lifetime; // syncDelay = packageDelay; //} // if MY LOCAL LIFETIME m_Lifetime is not yet at the SECOND PACKAGE'S lifetime, I do NOT remove the FIRST PACKAGE if (m_NetworkPackages.Count >= 2) { float nextPackageLifetime = ((networkData)m_NetworkPackages[1]).Lifetime; // remove first package, local lifetime has passed beyond first-second package range if (m_Lifetime > nextPackageLifetime) { m_NetworkPackages.RemoveAt(0); } } } }
void ChangeBallTrajectory(Vector3 startpos, Vector3 newDirection, float newSpeed, float EventTime) { // received dir, speed and time, add fake package in packet stream Speed = newSpeed; Velocity = newDirection; networkData fakePackage = new networkData(); fakePackage.P = startpos; fakePackage.V = newDirection; fakePackage.Lifetime = EventTime; //InsertPackage(fakePackage); }
private void InsertPackage(networkData newPackage) { int insertPosition = 0; float previousLifetime = 0; // insert package into stream at correct position for (int i = 0; i < m_NetworkPackages.Count; i++) { networkData listedPacket = (networkData)m_NetworkPackages[i]; if (previousLifetime < newPackage.Lifetime && newPackage.Lifetime < listedPacket.Lifetime) { insertPosition = i; } previousLifetime = listedPacket.Lifetime; } m_NetworkPackages.Insert(insertPosition, newPackage); }
void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { // send position to clients & server? if (stream.isWriting) { // send server position, direction, and the lifetime at which this snapshot was taken stream.SendNext(transform.position); stream.SendNext(Direction); stream.SendNext(transform.rotation.eulerAngles.y); // send Y rotation stream.SendNext(m_Lifetime); } else { // receive and store data for prediction networkData newPacket = new networkData(); newPacket.P = (Vector3)stream.ReceiveNext(); newPacket.V = (Vector3)stream.ReceiveNext(); newPacket.Rotation = (float)stream.ReceiveNext(); newPacket.Lifetime = (float)stream.ReceiveNext(); newPacket.cT = Time.time; // client time I received this package if (m_NetworkPackagesList == null) m_NetworkPackagesList = new ArrayList(); m_NetworkPackagesList.Add(newPacket); // wiat for 2 first packages if (m_NetworkPackagesList.Count < 2) { // some initting for late joiners m_Lifetime = newPacket.Lifetime;// - 0.1f; //newPacket.Lifetime += .1f; // double package and teleport deathball to server's given position m_NetworkPackagesList.Add(newPacket); transform.position = newPacket.P; } // remove packages that are no longer needed if (m_NetworkPackagesList.Count >= 2) { float nextPackageLifetime = ((networkData)m_NetworkPackagesList[1]).Lifetime; // remove first package, local lifetime has passed beyond first-second package range if (m_Lifetime > nextPackageLifetime) { m_NetworkPackagesList.RemoveAt(0); } } } }
private void InsertPackage(networkData newPackage) { int insertPosition = 0; float previousLifetime = 0 ; // insert package into stream at correct position for (int i = 0; i < m_NetworkPackages.Count; i++) { networkData listedPacket = (networkData)m_NetworkPackages[i]; if( previousLifetime < newPackage.Lifetime && newPackage.Lifetime < listedPacket.Lifetime) { insertPosition = i; } previousLifetime = listedPacket.Lifetime; } m_NetworkPackages.Insert(insertPosition, newPackage); }
void ChangeBallTrajectory(Vector3 startpos, Vector3 newDirection, float newSpeed , float EventTime) { // received dir, speed and time, add fake package in packet stream Speed = newSpeed; Velocity = newDirection; networkData fakePackage = new networkData(); fakePackage.P = startpos; fakePackage.V = newDirection; fakePackage.Lifetime = EventTime; //InsertPackage(fakePackage); }