Esempio n. 1
0
	public SerializableObject AddObjectReferenceToSerialize(ObjectReplicator replicator, int id) {
		int hashCode = id.GetHashCode();

		if (isSending) {
			var obj = connection.world.GetObjectByNetIDHashCode(hashCode);
			if ((obj != null) && (obj.internal_GetReplicator(connection) == null)) {
				objectRefs.Add(hashCode);
			}
		} else {
			// do we have this object?
			var obj = connection.world.GetObjectByNetIDHashCode(hashCode);
			if (obj != null) {
				return obj;
			}

			IntHashtableList<ObjectReplicator> repls;

			if (!pendingRefs.TryGetValue(hashCode, out repls)) {
				repls = new IntHashtableList<ObjectReplicator>();
				pendingRefs[hashCode] = repls;
			}

			if (!repls.Contains(replicator.obj.netIDHashCode)) {
				repls.Add(replicator.obj.netIDHashCode, replicator);
			}
        }

		return null;
	}
Esempio n. 2
0
	void ReplicateDependencies(ref NetMsgs.ReplicatedObjectData packet) {
		Perf.Begin("ActorReplicationChannel.ReplicateDependencies");

		// Serialize referenced actors.
		objectRefs2.Clear();

		while (objectRefs.Values.Count > 0) {
			Utils.Swap(ref objectRefs, ref objectRefs2);

			for (int i = 0; i < objectRefs2.Values.Count; ++i) {
				int netIDHashCode = objectRefs2.Values[i];
				var obj = connection.world.GetObjectByNetIDHashCode(netIDHashCode);

				bool isOwner = true;
				bool isRelevant = true;
				var actor = obj as Actor;
				ObjectReplicator replicator = null;

				if (actor != null) {
					Assert.IsFalse(actor.disposed);
					if (actor.internal_NetTearOff) {
						continue;
					}
					isOwner = actor.ownerConnectionID == _connection.id;
					if (!isOwner && actor.ownerOnly) {
						// actor is not replicated on this channel.
						continue;
					}
					if (!CheckRelevancy(actor, out replicator, out isRelevant)) {
						// actor is not replicated on this channel.
						continue;
					}
				} else {
					var component = obj as ActorComponent;

					if (component != null) {
						isOwner = component.owner.ownerConnectionID == _connection.id;
						if (!isOwner && component.owner.ownerOnly) {
							// only replicate to owner.
							continue;
						}
					}
				}

				ReplicateObject(0f, obj, actor, replicator, isOwner, isRelevant, ref packet);
#if !PACKET_COMBINE
				packet = packet.Flush(connection);
#endif
			}

			objectRefs2.Clear();
		}

		Perf.End();
	}
Esempio n. 3
0
 public void internal_SetReplicator(NetConnection conn, ObjectReplicator repl)
 {
     if (_repls == null)
     {
         _repls = new List <ObjectReplicator>();
     }
     while (_repls.Count <= conn.id)
     {
         _repls.Add(null);
     }
     _repls[conn.id] = repl;
 }
        public Action OneRun()
        {
            var source = new SomeClass
                         {
                             field = 42,
                             Property = new SomeClass2 { Property = new SomeClass3 { field = new int[1240] } }
                         };

            var replicator = new ObjectReplicator(new ConventionalMetadataProvider());
            replicator.Replicate("12");

            return () => replicator.Replicate(source);
        }
        public Action ReplicatorClone()
        {
            SomeClass source = CreateData();

            var replicator = new ObjectReplicator(new ConventionalMetadataProvider());
            replicator.Replicate(new SomeClass());
            replicator.Replicate(new SomeClass2());

            return () => {
                       source = replicator.Replicate(source);
                       Consume(source);
                   };
        }
Esempio n. 6
0
        public void Setup()
        {
            source = new SomeClass
            {
                field    = 42,
                Property = new SomeClass2 {
                    Property = new SomeClass3 {
                        field = new int[1240]
                    }
                }
            };

            replicator = new ObjectReplicator(new ConventionalMetadataProvider());
        }
        public Action ManyRuns()
        {
            var source = new SomeClass
                         {
                             field = 42,
                             Property = new SomeClass2 { Property = new SomeClass3 { field = new int[1240] } }
                         };

            var replicator = new ObjectReplicator(new ConventionalMetadataProvider());

            return () => {
                       for (int i = 0; i < iterationCount; ++i)
                           source = replicator.Replicate(source);
                   };
        }
Esempio n. 8
0
	bool CheckRelevancy(Actor actor, out ObjectReplicator repl, out bool isRelevant) {
		Perf.Begin("CheckRelevancy");
		isRelevant = actor.IsNetRelevantFor(this);

		repl = actor.internal_GetReplicator(connection);
		if (repl != null) {
			if (repl.wasRelevant != isRelevant) {
				Perf.End();
				return true;
			}
		}

		Perf.End();
		return isRelevant;
	}
 protected override void SetUp()
 {
     base.SetUp();
     objectReplicator = new ObjectReplicator(new AttributeBasedMetadataProvider());
 }
Esempio n. 10
0
 public void Setup()
 {
     source     = CreateData();
     replicator = new ObjectReplicator(new ConventionalMetadataProvider());
 }
 public void Setup()
 {
     source = CreateData();
     replicator = new ObjectReplicator(new ConventionalMetadataProvider());
 }
Esempio n. 12
0
	void InternalHandleReplicatedObjectData(NetMsgs.ReplicatedObjectData objectData) {
#if PROFILING
		try {
			Perf.Begin("ActorReplicationChannel.InternalHandleReplicatedObjectData");
#endif
			CHECK_FLD(objectData.archive);

			var netID = objectData.archive.ReadUShort();

			CHECK_FLD(objectData.archive);

			var obj = _connection.world.GetObjectByNetID(netID);

			var create = objectData.archive.ReadUnsignedBits(1) != 0;
			var relevant = objectData.archive.ReadUnsignedBits(1) != 0;
			var tearOff = objectData.archive.ReadUnsignedBits(1) != 0;

			CHECK_FLD(objectData.archive);

			ObjectReplicator replicator;

			if (obj == null) {
				if (!create) {
					throw new ActorReplicationException("Actor replication error (no actor with id " + netID + " and create flag not set)!");
				}
				var netIDOuter = objectData.archive.ReadUShort();
				var outerObj = _connection.world.GetObjectByNetID(netIDOuter);
				var classID = objectData.archive.ReadInt();
				CHECK_FLD(objectData.archive);
				obj = _connection.world.InternalCreateReplicatedObject(classID, netID);
				replicator = new ObjectReplicator(this, obj, _connection.world.InternalGetReplicatedFields(obj), false);
				obj.internal_SetReplicator(connection, replicator);
				obj.PreConstruct(outerObj);
				obj.PreNetConstruct();
			} else {
				if (create) {
					throw new ActorReplicationException("Actor replication error (actor with id " + netID + " create flag not set)!");
				}
				replicator = obj.internal_GetReplicator(connection);
			}

			var actor = obj as Actor;

			bool wasRelevant = true;
			if (actor != null) {
				wasRelevant = actor.isNetRelevant;
				actor.internal_NetRelevant = relevant;
			}

			obj.PreNetReceive();

			isSending = false;
			replicator.DeltaSerialize(0f, objectData.archive, false);
			obj.SerializeCustomData(objectData.archive);
			CHECK_FLD(objectData.archive);

			obj.PostNetReceive();

			if (create) {
				obj.Construct();
				obj.PostNetConstruct();
				obj.PostConstruct();
			}

			replicator.OnRep();
			obj.PostOnRepFields();

			if (create && (actor != null) && !_connection.world.isTraveling) {
				actor.OnLevelStart();
			}

			IntHashtableList<ObjectReplicator> repls;
			if (pendingRefs.TryGetValue(obj.netIDHashCode, out repls)) {
				for (int i = 0; i < repls.Values.Count; ++i) {
					repls.Values[i].ResolveReference(obj, netID);
				}
				for (int i = 0; i < repls.Values.Count; ++i) {
					repls.Values[i].OnRep();
				}
				repls.Clear();
			}

			if ((actor != null) && (wasRelevant != relevant)) {
				actor.OnNetRelevancyChanged();
			}

			if ((actor != null) && tearOff) {
				obj.internal_SetReplicator(connection, null);
				actor.NetTearOff();
			}

#if PROFILING
		} finally {
			Perf.End();
		}
#endif
	}
Esempio n. 13
0
	void ReplicateObject(float dt, SerializableObject obj, Actor actor, ObjectReplicator replicator, bool isOwner, bool isRelevant, ref NetMsgs.ReplicatedObjectData msg) {
		Perf.Begin("ActorReplicationChannel.ReplicateObject");

		Assert.IsFalse((actor != null) ? actor.netTornOff : false);
		
		bool wroteAnything = false;

		// start on a byte boundary so we can restore the position to this point if we don't write any data.
		msg.archive.Flush();
		msg = msg.MaybeSend(connection);

		var position = msg.archive.Position;
		bool relevancyChanged = true;

		CHECK_FLD(msg.archive);

		if (replicator == null) {
			replicator = obj.internal_GetReplicator(connection);
		}

		if (replicator == null) {

			replicator = new ObjectReplicator(this, obj, connection.world.InternalGetReplicatedFields(obj), isOwner);
			obj.internal_SetReplicator(connection, replicator);
			
			msg.archive.Write((ushort)obj.netID);

			CHECK_FLD(msg.archive);

			// actor has not been replicated yet
			msg.archive.WriteUnsignedBits(1, 1);
			msg.archive.WriteUnsignedBits(isRelevant ? 1 : 0, 1);
			msg.archive.WriteUnsignedBits(((actor != null) && (actor.internal_NetTearOff)) ? 1 : 0, 1);

			CHECK_FLD(msg.archive);

			msg.archive.Write((ushort)((obj.outer is SerializableObject) ? (obj.outer as SerializableObject).netID : 0));
			msg.archive.Write(obj.classID);

			CHECK_FLD(msg.archive);

			replicator.FullSerialize(dt, msg.archive);
			SerializeCustomData(obj, msg.archive);
			wroteAnything = true;

		} else {

			relevancyChanged = replicator.wasRelevant != isRelevant;

			bool replicate = true;
			if ((dt >= 0f) && (actor != null) && !actor.internal_NetTearOff && !actor.internal_NetFlush && !relevancyChanged) {
				replicator.serializeDeltaTime += dt;
				if (replicator.serializeDeltaTime < actor.replicateRate) {
					replicate = false;
				}
            }

			if (replicate) {
				msg.archive.Write((ushort)obj.netID);
				CHECK_FLD(msg.archive);
				msg.archive.WriteUnsignedBits(0, 1);
				msg.archive.WriteUnsignedBits(isRelevant ? 1 : 0, 1);
				msg.archive.WriteUnsignedBits(((actor != null) && (actor.internal_NetTearOff)) ? 1 : 0, 1);
				CHECK_FLD(msg.archive);

				wroteAnything = replicator.DeltaSerialize(dt, msg.archive, (actor != null) && (actor.internal_NetFlush || relevancyChanged));
				wroteAnything = SerializeCustomData(obj, msg.archive) || wroteAnything;
			}
		}

		if (wroteAnything || ((actor != null) && (actor.internal_NetFlush || relevancyChanged))) {
			CHECK_FLD(msg.archive);
			obj.SerializeSubobjects(this);
		} else {
			msg.archive.Position = position;
			msg.archive.Discard();
		}

		replicator.wasRelevant = isRelevant;

		if ((actor != null) && actor.internal_NetTearOff) {
			obj.internal_SetReplicator(connection, null);
        }

		Perf.End();
	}
 protected override void SetUp()
 {
     base.SetUp();
     objectReplicator = new ObjectReplicator(new AttributeBasedMetadataProvider());
 }