예제 #1
0
        public void SetPeerAsDead(IReplica deadPeer)
        {
            Debug.Assert(deadPeer != LocalReplica);
            lock (AliveMembers)
            {
                NoOwner.UnionWith(deadPeer.PopOwnedTuples());
                AliveMembers.Remove(deadPeer);
            }

            if (AmILeader() && NoOwner.Count > 0)
            {
                foreach (var freeTuple in NoOwner)
                {
                    Queue <int> interestedPeers;
                    if (Shared.TryGetValue(freeTuple, out interestedPeers))
                    {
                        var interestedAlivePeer = interestedPeers
                                                  .Select(id => AllMembers[id])
                                                  .Intersect(AliveMembers)
                                                  .FirstOrDefault();

                        if (interestedAlivePeer != null)
                        {
                            RMSend(r => r.SetOwner(freeTuple, interestedAlivePeer.ReplicaId));
                        }
                        else
                        {
                            var chosenPeerIdx = LocalRoutingStrategy.Route(freeTuple.Content, AliveMembers.Count);
                            var chosenPeer    = AliveMembers[chosenPeerIdx];
                            RMSend(p => p.SetOwner(freeTuple, chosenPeer.ReplicaId));
                        }
                    }
                }
            }
        }
예제 #2
0
        private void OnEntityKilled(EntityKilledMessage msg)
        {
            int index = Members.IndexOf(msg.Value);

            if (index < 0)
            {
                return;
            }
            Debug.Log($"[Squad] Entity kill registered! {Config.ServerId}|{index}");
            Members[index] = null;
            AliveMembers.Remove(msg.Value);
        }
예제 #3
0
        public void AddMember(IEntityManager gem, IHexCoord position, string entityId)
        {
            var ent = gem.CreateEntity(entityId, e => {
                e.AddModule(new SquadMember(this, _number));
            });

            ent.GetComponent <HexMovementComp>().SetPosition(position);
            ent.GetComponent <ModelColorizer>().Colorize(Config.Color);

            //var map = ServiceLocator.Instance.GetService<IHexMap>();
            //var center = map.GetTile(map.Columns / 2, map.Rows / 2);
            //var dir = center.GetTop() - ent.transform.position;
            //dir.y = 0;
            //ent.transform.rotation = Quaternion.LookRotation(dir);
            ent.transform.rotation = Quaternion.Euler(0, Random.value * 360f, 0);

            Members.Add(ent);
            AliveMembers.Add(ent);
            _number++;
        }
예제 #4
0
 public IEnumerable <IReplica> GetAlivePeers()
 {
     return(AliveMembers.Where(r => r != LocalReplica));
 }
예제 #5
0
 private IReplica GetOwnerOfTuple(DadTupleId upstreamId)
 {
     return(AliveMembers.SingleOrDefault(peer => peer.IsOwner(upstreamId)));
 }
예제 #6
0
 private IReplica GetLeader()
 {
     return(AliveMembers.Last());
 }