/// <summary> /// Uses the photonEvent's provided by the server to advance the internal state and call ops as needed. /// </summary> /// <remarks>This method is essential to update the internal state of a LoadBalancingClient. Overriding methods must call base.OnEvent.</remarks> public virtual void OnEvent(EventData photonEvent) { switch (photonEvent.Code) { case EventCode.GameList: case EventCode.GameListUpdate: if (photonEvent.Code == EventCode.GameList) { this.RoomInfoList = new Dictionary<string, RoomInfo>(); } Hashtable games = (Hashtable)photonEvent[ParameterCode.GameList]; foreach (string gameName in games.Keys) { RoomInfo game = new RoomInfo(gameName, (Hashtable)games[gameName]); if (game.removedFromList) { this.RoomInfoList.Remove(gameName); } else { this.RoomInfoList[gameName] = game; } } break; case EventCode.Join: int actorNr = (int)photonEvent[ParameterCode.ActorNr]; // actorNr (a.k.a. playerNumber / ID) of sending player bool isLocal = this.LocalPlayer.ID == actorNr; Hashtable actorProperties = (Hashtable)photonEvent[ParameterCode.PlayerProperties]; if (!isLocal) { Player newPlayer = this.CreatePlayer(string.Empty, actorNr, false, actorProperties); this.CurrentRoom.StorePlayer(newPlayer); } else { // in this player's own join event, we get a complete list of players in the room, so check if we know each of the int[] actorsInRoom = (int[])photonEvent[ParameterCode.ActorList]; foreach (int actorNrToCheck in actorsInRoom) { if (this.LocalPlayer.ID != actorNrToCheck && !this.CurrentRoom.Players.ContainsKey(actorNrToCheck)) { this.CurrentRoom.StorePlayer(this.CreatePlayer(string.Empty, actorNrToCheck, false, null)); } else if (this.CurrentRoom.Players.ContainsKey(actorNrToCheck)) { Player p = null; if (this.CurrentRoom.Players.TryGetValue(actorNrToCheck, out p)) { p.IsInactive = false; } } } } break; case EventCode.Leave: { int actorID = (int) photonEvent[ParameterCode.ActorNr]; //TURNBASED bool isInactive = false; if (photonEvent.Parameters.ContainsKey(ParameterCode.IsInactive)) { isInactive = (bool)photonEvent.Parameters[ParameterCode.IsInactive]; } if (isInactive) { this.CurrentRoom.MarkAsInactive(actorID); //UnityEngine.Debug.Log("leave marked player as inactive "+ actorID); } else { this.CurrentRoom.RemovePlayer(actorID); //UnityEngine.Debug.Log("leave removed player " + actorID); } } break; // EventCode.Disconnect was "replaced" by Leave which now has a "inactive" flag. //case EventCode.Disconnect: //TURNBASED // { // int actorID = (int) photonEvent[ParameterCode.ActorNr]; // this.CurrentRoom.MarkAsInactive(actorID); // } // break; case EventCode.PropertiesChanged: // whenever properties are sent in-room, they can be broadcasted as event (which we handle here) // we get PLAYERproperties if actorNr > 0 or ROOMproperties if actorNumber is not set or 0 int targetActorNr = 0; if (photonEvent.Parameters.ContainsKey(ParameterCode.TargetActorNr)) { targetActorNr = (int)photonEvent[ParameterCode.TargetActorNr]; } Hashtable props = (Hashtable)photonEvent[ParameterCode.Properties]; if (targetActorNr > 0) { this.ReadoutProperties(null, props, targetActorNr); } else { this.ReadoutProperties(props, null, 0); } break; case EventCode.AppStats: // only the master server sends these in (1 minute) intervals this.PlayersInRoomsCount = (int)photonEvent[ParameterCode.PeerCount]; this.RoomsCount = (int)photonEvent[ParameterCode.GameCount]; this.PlayersOnMasterCount = (int)photonEvent[ParameterCode.MasterPeerCount]; break; case EventCode.LobbyStats: string[] names = photonEvent[ParameterCode.LobbyName] as string[]; byte[] types = photonEvent[ParameterCode.LobbyType] as byte[]; int[] peers = photonEvent[ParameterCode.PeerCount] as int[]; int[] rooms = photonEvent[ParameterCode.GameCount] as int[]; this.lobbyStatistics.Clear(); for (int i = 0; i < names.Length; i++) { TypedLobbyInfo info = new TypedLobbyInfo(); info.Name = names[i]; info.Type = (LobbyType)types[i]; info.PlayerCount = peers[i]; info.RoomCount = rooms[i]; this.lobbyStatistics.Add(info); } break; } if (this.OnEventAction != null) this.OnEventAction(photonEvent); }
/// <summary> /// Makes RoomInfo comparable (by name). /// </summary> public override bool Equals(object other) { RoomInfo otherRoomInfo = other as RoomInfo; return(otherRoomInfo != null && this.name.Equals(otherRoomInfo.name)); }
/// <summary> /// Uses the photonEvent's provided by the server to advance the internal state and call ops as needed. /// </summary> /// <remarks>This method is essential to update the internal state of a LoadBalancingClient. Overriding methods must call base.OnEvent.</remarks> public virtual void OnEvent(EventData photonEvent) { switch (photonEvent.Code) { case EventCode.GameList: case EventCode.GameListUpdate: if (photonEvent.Code == EventCode.GameList) { this.RoomInfoList = new Dictionary<string, RoomInfo>(); } Hashtable games = (Hashtable)photonEvent[ParameterCode.GameList]; foreach (string gameName in games.Keys) { RoomInfo game = new RoomInfo(gameName, (Hashtable)games[gameName]); if (game.removedFromList) { this.RoomInfoList.Remove(gameName); } else { this.RoomInfoList[gameName] = game; } } break; case EventCode.Join: int actorNr = (int)photonEvent[ParameterCode.ActorNr]; // actorNr (a.k.a. playerNumber / ID) of sending player bool isLocal = this.LocalPlayer.ID == actorNr; Hashtable actorProperties = (Hashtable)photonEvent[ParameterCode.PlayerProperties]; if (!isLocal) { Player newPlayer = this.CreatePlayer(string.Empty, actorNr, false, actorProperties); this.CurrentRoom.StorePlayer(newPlayer); } else { // in this player's own join event, we get a complete list of players in the room, so check if we know each of the int[] actorsInRoom = (int[])photonEvent[ParameterCode.ActorList]; foreach (int actorNrToCheck in actorsInRoom) { if (this.LocalPlayer.ID != actorNrToCheck && !this.CurrentRoom.Players.ContainsKey(actorNrToCheck)) { this.CurrentRoom.StorePlayer(this.CreatePlayer(string.Empty, actorNrToCheck, false, null)); } } } break; case EventCode.Leave: int actorID = (int)photonEvent[ParameterCode.ActorNr]; this.CurrentRoom.RemovePlayer(actorID); break; case EventCode.PropertiesChanged: // whenever properties are sent in-room, they can be broadcasted as event (which we handle here) // we get PLAYERproperties if actorNr > 0 or ROOMproperties if actorNumber is not set or 0 int targetActorNr = 0; if (photonEvent.Parameters.ContainsKey(ParameterCode.TargetActorNr)) { targetActorNr = (int)photonEvent[ParameterCode.TargetActorNr]; } Hashtable props = (Hashtable)photonEvent[ParameterCode.Properties]; if (targetActorNr > 0) { this.ReadoutProperties(null, props, targetActorNr); } else { this.ReadoutProperties(props, null, 0); } break; case EventCode.AppStats: // only the master server sends these in (1 minute) intervals this.PlayersInRoomsCount = (int)photonEvent[ParameterCode.PeerCount]; this.RoomsCount = (int)photonEvent[ParameterCode.GameCount]; this.PlayersOnMasterCount = (int)photonEvent[ParameterCode.MasterPeerCount]; break; } }