public SerializedNode(IReplicable target) { Parent = target.GetParent().GetPath(); Name = target.Name; ScenePath = target.ScenePath; Data = ((ISaveable)target).GetData(); }
public static ReplicationData GetReplicationDataFrom(this IReplicable replicable, int typeId) { ReplicationData ret = new ReplicationData() { Id = replicable.Id, TypeId = typeId, NetworkMaster = ((Node)replicable).GetNetworkMaster(), FieldValues = new List <byte[]>(), }; foreach (var prop in replicable.GetType().GetProperties()) { if (prop.GetCustomAttribute <Replicated>() != null) { ret.FieldValues.Add(Util.ObjToBytes(prop.GetValue(replicable), prop.PropertyType)); } } foreach (var prop in replicable.GetType().GetFields()) { if (prop.GetCustomAttribute <Replicated>() != null) { ret.FieldValues.Add(Util.ObjToBytes(prop.GetValue(replicable), prop.FieldType)); } } return(ret); }
public DataSpreaderService(IReplicable <User, Message <User> > service, IEnumerable <IDataSpreader <Message <User> > > dataSpreaders) : this(service) { if (dataSpreaders == null) { throw new ArgumentNullException($"{nameof(dataSpreaders)} argument is null"); } foreach (var dataSpreader in dataSpreaders) { this.AddDataSpreader(dataSpreader); } }
public DataSpreaderService(IReplicable <User, Message <User> > service) { if (service == null) { throw new ArgumentNullException($"{nameof(service)} argument is null"); } this.decoratedService = service; this.ServiceMode = this.decoratedService.ServiceMode; this.decoratedService.MessageCreated += this.OnMessageCreated; this.dataSpreaders = new List <IDataSpreader <Message <User> > >(); }
//Override and call base Instance to do actual deserialization. public virtual IReplicable Instance(SceneTree tree, bool newName = false) { IReplicable instance = (IReplicable)EasyInstancer.Instance <Node>(ScenePath); if (newName) { instance.rMember.GenName(); } else { instance.Name = Name; } tree.Root.GetNode(Parent).AddChild((Node)instance); ((ISaveable)instance).ApplyData(Data); return(instance); }
public static void ReplicableReady(this IReplicable n, bool replicate = true) { n.rMember.owner = n; if (!n.IsNetworkMaster()) { NOKManager.Instance.Subscribe(n); } else if (n.rMember.ReplicateOnReady) { n.rMember.GenName(); if (replicate) { n.Replicate(); } } }
public DataSpreaderService GetService(ServiceConfiguration serviceElement) { if (serviceElement == null) { throw new ArgumentNullException(nameof(serviceElement)); } var idGenerator = Activator.CreateInstance(Type.GetType(serviceElement.GeneratorType, true, true)) as IGenerator <int>; var saver = Activator.CreateInstance(Type.GetType(serviceElement.RepositoryStateSaverType, true, true)) as IStateSaver <UserRepositorySnapshot>; var repository = Activator.CreateInstance(Type.GetType(serviceElement.RepositoryType, true, true), idGenerator, saver) as IRepository <User>; var validator = Activator.CreateInstance(Type.GetType(serviceElement.ValidatorType, true, true)) as IValidator <User>; var basicService = Activator.CreateInstance(typeof(BasicUserService), repository, validator) as IService <User>; var logger = Activator.CreateInstance(Type.GetType(serviceElement.LoggerType, true, true), serviceElement.LoggerName); basicService = Activator.CreateInstance(typeof(LoggableUserService), basicService, logger) as IService <User>; basicService = Activator.CreateInstance(typeof(ConcurrentUserService), basicService) as IService <User>; var serviceType = Type.GetType(serviceElement.ServiceType, true, true); var attributes = serviceType.GetCustomAttributesData().ToList(); IReplicable <User, Message <User> > service = null; if (attributes.Exists(attr => attr.AttributeType == typeof(MasterAttribute))) { service = Activator.CreateInstance(serviceType, basicService) as IReplicable <User, Message <User> >; } else { if (attributes.Exists(attr => attr.AttributeType == typeof(SlaveAttribute))) { service = Activator.CreateInstance(serviceType, basicService) as IReplicable <User, Message <User> >; } } var spreaderService = (DataSpreaderService)Activator.CreateInstance(typeof(DataSpreaderService), service); this.AddDataSpreaders(serviceElement, spreaderService); return(spreaderService); }
public static void SetReplicationDataTo(this IReplicable replicable, ReplicationData data) { replicable.Id = data.Id; ((Node)replicable).SetNetworkMaster(data.NetworkMaster); int i = 0; foreach (var prop in replicable.GetType().GetProperties()) { if (prop.GetCustomAttribute <Replicated>() != null) { prop.SetValue(replicable, Util.BytesToObj(data.FieldValues[i++], prop.PropertyType)); } } foreach (var prop in replicable.GetType().GetFields()) { if (prop.GetCustomAttribute <Replicated>() != null) { prop.SetValue(replicable, Util.BytesToObj(data.FieldValues[i++], prop.FieldType)); } } }
//Sometimes you want to replicate separately from startup public static void Replicate(this IReplicable n) { Networking.Instance.RTCMP.Connect("peer_connected", n.rMember, nameof(ReplicationMember.OnPeerConnected)); ReplicationServer.Instance.Replicate(n); }
public void ReplicateID(IReplicable n, int uid) { RpcId(uid, nameof(ReplicateRPC), n.GetParent().GetPath(), n.Name, n.ScenePath); }
public void Replicate(IReplicable n) { Rpc(nameof(ReplicateRPC), n.GetParent().GetPath(), n.Name, n.ScenePath); }
public void UnSubscribe(IReplicable n) { NOKs[n.GetNetworkMaster()].Disconnect(nameof(NOKSignaller.Transfer), n.rMember, nameof(ReplicationMember.OnNOKTransfer)); }