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)); } } } } }
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); }
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++; }
public IEnumerable <IReplica> GetAlivePeers() { return(AliveMembers.Where(r => r != LocalReplica)); }
private IReplica GetOwnerOfTuple(DadTupleId upstreamId) { return(AliveMembers.SingleOrDefault(peer => peer.IsOwner(upstreamId))); }
private IReplica GetLeader() { return(AliveMembers.Last()); }