Ejemplo n.º 1
0
 public SerializedNode(IReplicable target)
 {
     Parent    = target.GetParent().GetPath();
     Name      = target.Name;
     ScenePath = target.ScenePath;
     Data      = ((ISaveable)target).GetData();
 }
Ejemplo n.º 2
0
    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> > >();
        }
Ejemplo n.º 5
0
    //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);
    }
Ejemplo n.º 6
0
        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();
                }
            }
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
    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));
            }
        }
    }
Ejemplo n.º 9
0
 //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);
 }
Ejemplo n.º 10
0
 public void ReplicateID(IReplicable n, int uid)
 {
     RpcId(uid, nameof(ReplicateRPC), n.GetParent().GetPath(), n.Name, n.ScenePath);
 }
Ejemplo n.º 11
0
 public void Replicate(IReplicable n)
 {
     Rpc(nameof(ReplicateRPC), n.GetParent().GetPath(), n.Name, n.ScenePath);
 }
Ejemplo n.º 12
0
 public void UnSubscribe(IReplicable n)
 {
     NOKs[n.GetNetworkMaster()].Disconnect(nameof(NOKSignaller.Transfer), n.rMember, nameof(ReplicationMember.OnNOKTransfer));
 }