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; }
public ObjectReplicator(ActorReplicationChannel channel, SerializableObject obj, SerializedObjectFields fields, bool isOwner) { this.channel = channel; _object = obj; wasRelevant = true; this.isOwner = isOwner; fieldStates = new IntHashtableList<ReplicatedObjectFieldState>(); for (int i = 0; i < fields.serializedFields.Values.Count; ++i) { SerializedObjectFields.FieldSpec fieldSpec = fields.serializedFields.Values[i]; fieldStates.Add(fieldSpec.fieldID, new ReplicatedObjectFieldState(fieldSpec)); } }
public SerializableObject AddReference(ISerializableObjectFieldSerializer serializer, int id, int fieldIndex) { var obj = channel.AddObjectReferenceToSerialize(this, id); if ((obj != null) || !isLoading) { return obj; } int idHash = id.GetHashCode(); if (objectReferencedFieldStates == null) { objectReferencedFieldStates = new IntHashtable<IntHashtableList<ReplicatedObjectFieldState>>(); } IntHashtableList<ReplicatedObjectFieldState> fields; if (!objectReferencedFieldStates.TryGetValue(idHash, out fields)) { fields = new IntHashtableList<ReplicatedObjectFieldState>(); objectReferencedFieldStates[idHash] = fields; } if (!fields.Contains(curFieldState.fieldSpec.fieldID)) { fields.Add(curFieldState.fieldSpec.fieldID, curFieldState); } curFieldState.AddReference(id, fieldIndex); return null; }