public void AddSubscriber(LiteNetLibPlayer subscriber) { // Only server can manage subscribers if (!IsServer || subscriber == null) { return; } if (Subscribers.ContainsKey(subscriber.ConnectionId)) { if (Manager.LogDebug) { Logging.Log(LogTag, $"Subscriber: {subscriber.ConnectionId} already added to {gameObject}."); } return; } Subscribers[subscriber.ConnectionId] = subscriber; #if UNITY_EDITOR if (!subscriberIds.Contains(subscriber.ConnectionId)) { subscriberIds.Add(subscriber.ConnectionId); } #endif subscriber.AddSubscribing(this); }
internal void AddSubscriber(LiteNetLibPlayer subscriber) { // Only server can manage subscribers if (!IsServer || subscriber == null) { return; } if (Subscribers.ContainsKey(subscriber.ConnectionId)) { if (Manager.LogDebug) { Debug.Log("Subscriber [" + subscriber.ConnectionId + "] already added to [" + gameObject + "]"); } return; } Subscribers[subscriber.ConnectionId] = subscriber; #if UNITY_EDITOR if (!subscriberIds.Contains(subscriber.ConnectionId)) { subscriberIds.Add(subscriber.ConnectionId); } #endif subscriber.AddSubscribing(this); }
public virtual void SetPlayerReady(long connectionId, NetDataReader reader) { if (!IsServer) { return; } LiteNetLibPlayer player = Players[connectionId]; if (player.IsReady) { return; } player.IsReady = true; LiteNetLibIdentity playerIdentity = SpawnPlayer(connectionId); DeserializeClientReadyExtra(playerIdentity, connectionId, reader); foreach (LiteNetLibIdentity spawnedObject in Assets.SpawnedObjects.Values) { if (spawnedObject.ConnectionId == player.ConnectionId) { continue; } if (spawnedObject.ShouldAddSubscriber(player)) { spawnedObject.AddSubscriber(player); } } }
public override void OnPeerConnected(long connectionId) { base.OnPeerConnected(connectionId); if (!Players.ContainsKey(connectionId)) { Players[connectionId] = new LiteNetLibPlayer(this, connectionId); } }
public override void OnPeerDisconnected(long connectionId, DisconnectInfo disconnectInfo) { base.OnPeerDisconnected(connectionId, disconnectInfo); if (Players.ContainsKey(connectionId)) { LiteNetLibPlayer player = Players[connectionId]; player.ClearSubscribing(false); player.DestroyAllObjects(); Players.Remove(connectionId); } }
public bool ShouldAddSubscriber(LiteNetLibPlayer subscriber) { for (int i = 0; i < Behaviours.Length; ++i) { if (!Behaviours[i].ShouldAddSubscriber(subscriber)) { return(false); } } return(true); }
public bool ShouldAddSubscriber(LiteNetLibPlayer subscriber) { int loopCounter; for (loopCounter = 0; loopCounter < Behaviours.Length; ++loopCounter) { if (!Behaviours[loopCounter].ShouldAddSubscriber(subscriber)) { return(false); } } return(true); }
public void RemoveSubscriber(LiteNetLibPlayer subscriber, bool removePlayerSubscribing) { // Only server can manage subscribers if (!IsServer) { return; } Subscribers.Remove(subscriber.ConnectionId); #if UNITY_EDITOR subscriberIds.Remove(subscriber.ConnectionId); #endif if (removePlayerSubscribing) { subscriber.RemoveSubscribing(this, false); } }
public void SendServerError(long connectionId, bool shouldDisconnect, string errorMessage) { if (!IsServer) { return; } LiteNetLibPlayer player = null; if (!Players.TryGetValue(connectionId, out player) || !player.IsReady) { return; } ServerErrorMessage message = new ServerErrorMessage(); message.shouldDisconnect = shouldDisconnect; message.errorMessage = errorMessage; ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, GameMsgTypes.ServerDestroyObject, message); }
public void SendServerDestroyObject(long connectionId, uint objectId, byte reasons) { if (!IsServer) { return; } LiteNetLibPlayer player = null; if (!Players.TryGetValue(connectionId, out player) || !player.IsReady) { return; } ServerDestroyObjectMessage message = new ServerDestroyObjectMessage(); message.objectId = objectId; message.reasons = reasons; ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, GameMsgTypes.ServerDestroyObject, message); }
public virtual void SetPlayerNotReady(long connectionId, NetDataReader reader) { if (!IsServer) { return; } LiteNetLibPlayer player = Players[connectionId]; if (!player.IsReady) { return; } player.IsReady = false; player.ClearSubscribing(true); player.DestroyAllObjects(); }
public void SendServerSpawnSceneObject(long connectionId, LiteNetLibIdentity identity) { if (!IsServer) { return; } LiteNetLibPlayer player = null; if (!Players.TryGetValue(connectionId, out player) || !player.IsReady) { return; } ServerSpawnSceneObjectMessage message = new ServerSpawnSceneObjectMessage(); message.objectId = identity.ObjectId; message.position = identity.transform.position; message.rotation = identity.transform.rotation; ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, GameMsgTypes.ServerSpawnSceneObject, message, identity.WriteInitialSyncFields); }
public void SendServerSpawnObject(long connectionId, LiteNetLibIdentity identity) { if (!IsServer) { return; } LiteNetLibPlayer player = null; if (!Players.TryGetValue(connectionId, out player) || !player.IsReady) { return; } var message = new ServerSpawnObjectMessage(); message.hashAssetId = identity.HashAssetId; message.objectId = identity.ObjectId; message.isOwner = identity.ConnectionId == connectionId; message.position = identity.transform.position; message.rotation = identity.transform.rotation; ServerSendPacket(connectionId, SendOptions.ReliableOrdered, GameMsgTypes.ServerSpawnObject, message); }
public override bool ShouldAddSubscriber(LiteNetLibPlayer subscriber) { if (subscriber == null) { return(false); } if (subscriber.ConnectionId == ConnectionId) { return(true); } foreach (LiteNetLibIdentity spawnedObject in subscriber.SpawnedObjects.Values) { Vector3 pos = spawnedObject.transform.position; if ((pos - transform.position).magnitude < range) { return(true); } } return(false); }
/// <summary> /// Override this function to decides that old object should add new object as subscriber or not /// </summary> /// <param name="subscriber"></param> public virtual bool ShouldAddSubscriber(LiteNetLibPlayer subscriber) { return(true); }
public void RebuildSubscribers(bool initialize) { // Only server can manage subscribers if (!IsServer || !IsSetupBehaviours) { return; } LiteNetLibPlayer ownerPlayer = Player; if (initialize) { AddSubscriber(ownerPlayer); } bool hasChanges = false; bool shouldRebuild = false; HashSet <LiteNetLibPlayer> newSubscribers = new HashSet <LiteNetLibPlayer>(); HashSet <LiteNetLibPlayer> oldSubscribers = new HashSet <LiteNetLibPlayer>(Subscribers.Values); int loopCounter; for (loopCounter = 0; loopCounter < Behaviours.Length; ++loopCounter) { shouldRebuild |= Behaviours[loopCounter].OnRebuildSubscribers(newSubscribers, initialize); } // If shouldRebuild is FALSE, it's means it does not have to rebuild subscribers if (!shouldRebuild) { // None of the behaviours rebuilt our subscribers, use built-in rebuild method if (initialize) { foreach (LiteNetLibPlayer player in Manager.GetPlayers()) { if (ConnectionId == player.ConnectionId || !player.IsReady) { continue; } if (ShouldAddSubscriber(player)) { AddSubscriber(player); } } } return; } // Apply changes from rebuild foreach (LiteNetLibPlayer subscriber in newSubscribers) { if (subscriber == null) { continue; } if (!subscriber.IsReady) { if (Manager.LogWarn) { Logging.Log(LogTag, $"Subscriber: {subscriber.ConnectionId} is not ready."); } continue; } if ((ownerPlayer == null || subscriber.ConnectionId != ownerPlayer.ConnectionId) && (initialize || !oldSubscribers.Contains(subscriber))) { subscriber.AddSubscribing(this); if (Manager.LogDebug) { Logging.Log(LogTag, $"Add subscriber: {subscriber.ConnectionId} to {gameObject}."); } hasChanges = true; } } // Remove subscribers that is not in new subscribers list foreach (LiteNetLibPlayer subscriber in oldSubscribers) { if (!newSubscribers.Contains(subscriber)) { subscriber.RemoveSubscribing(this, true); if (Manager.LogDebug) { Logging.Log(LogTag, $"Remove subscriber: {subscriber.ConnectionId} from {gameObject}."); } hasChanges = true; } } if (!hasChanges) { return; } // Rebuild subscribers Subscribers.Clear(); foreach (LiteNetLibPlayer subscriber in newSubscribers) { Subscribers.Add(subscriber.ConnectionId, subscriber); } #if UNITY_EDITOR subscriberIds.Clear(); foreach (LiteNetLibPlayer subscriber in newSubscribers) { subscriberIds.Add(subscriber.ConnectionId); } #endif }
public bool TryGetPlayer(long connectionId, out LiteNetLibPlayer player) { return(Players.TryGetValue(connectionId, out player)); }