/// <summary> /// Adds a client subscriber to object, which will eventually be notified whenever the object changes state. /// </summary> /// <param name="client">The client to add as a subscriber.</param> /// <param name="remoteObjectId">The client's dynamic ID.</param> public void AddSubscriber(LogNetClient client, ulong remoteObjectId) { // [D3Inferno] // Remove Subscribers that have been disconnected. // Apparently the RPCObject is not being cleaned up properly. // See the comment at the top for more info. // Conver to an Array so we can remove as we iterate. foreach (var subscriber in this.Subscribers.ToArray()) { if (!subscriber.Connection.IsConnected) { Logger.Warn("Removing disconnected subscriber {0}", subscriber); this.Subscribers.Remove(subscriber); } } // Map the subscriber's dynamic ID to to our dynamic ID so we know how to translate later on when the object makes a notify call client.MapLocalObjectID(this.DynamicId, remoteObjectId); this.Subscribers.Add(client); // Since the client wasn't previously subscribed, it should not be aware of the object's state -- let's notify it foreach (var subscriber in this.Subscribers) { this.NotifySubscriptionAdded(subscriber); } //this.NotifySubscriptionAdded(client); }
/// <summary> /// Creates a new channel for given client with supplied remote object-id. /// </summary> /// <param name="client">The client channels is created for</param> /// <param name="remoteObjectId">The remove object-id of the client.</param> public Channel(LogNetClient client, bool isGameChannel = false, ulong remoteObjectId = 0) { this.BnetEntityId = bnet.protocol.EntityId.CreateBuilder().SetHigh((ulong)EntityIdHelper.HighIdType.ChannelId).SetLow(this.DynamicId).Build(); this.D3EntityId = D3.OnlineService.EntityId.CreateBuilder().SetIdHigh((ulong)EntityIdHelper.HighIdType.ChannelId).SetIdLow(this.DynamicId).Build(); this.PrivacyLevel = bnet.protocol.channel.ChannelState.Types.PrivacyLevel.PRIVACY_LEVEL_OPEN_INVITATION; this.MinMembers = 1; this.MaxMembers = 8; this.MaxInvitations = 12; this.IsGameChannel = isGameChannel; if (remoteObjectId != 0) { client.MapLocalObjectID(this.DynamicId, remoteObjectId); // This is an object creator, so we have to map the remote object ID } // The client can't be set as the owner (or added as a member) here because the server must first make a response // to the client before using a mapped ID (presuming that this was called from a service). // We'll just let the caller do that for us. }
public void Join(LogNetClient client, ulong remoteObjectId) { client.MapLocalObjectID(this.DynamicId, remoteObjectId); this.AddMember(client); }