protected override void RunReactive() { for (int i = 0; i < ReactedEntitiesCount; i++) { var entity = ReactedEntities[i]; var roomData = _world.GetComponent <RoomData> (entity); if (roomData.value.ContainsKey(RoomDataConstants.PlayerRole)) { var roles = Extensions.DeserializeToPlayerRoles(roomData.value[RoomDataConstants.PlayerRole] as byte[]); _gameState.UpdateRoles(roles); foreach (var playerRole in roles) { var actorNumber = playerRole.Key; var role = playerRole.Value; if (_playerCache.Entities.TryGetValue(actorNumber, out var playerEntity)) { var roleComponent = _world.EnsureComponent <Role> (playerEntity, out var isNew); if (!isNew) { if (roleComponent.value != role) { _world.MarkComponentAsUpdated <Role> (playerEntity); } } else { _world.MarkComponentAsUpdated <Role> (playerEntity); } roleComponent.value = role; } } stringBuilder.Clear(); stringBuilder.AppendLine("Roles"); var values = Enum.GetValues(typeof(PlayerRole)) as PlayerRole[]; for (int j = 1; j < values.Length; j++) { var role = values[j]; var playerWithRole = _gameState.GetPlayerWithRole(role); stringBuilder.Append($"{role} = {( playerWithRole == -1 ? "-" : playerWithRole.ToString() )}"); if (playerWithRole == _photonServer.LocalPlayer.ID) { stringBuilder.Append("(me)"); } stringBuilder.AppendLine(); } SceneDescription.UI.GameUI.Roles.text = stringBuilder.ToString(); } } }
private void Try(PlayerRole newRole) { if (_photonServer.CurrentRoom != null && _photonServer.LocalPlayer != null) { var id = _photonServer.LocalPlayer.ID; if (_gameState.Roles.TryGetValue(id, out var role)) { if (role != newRole) { var playerWithRole = _gameState.GetPlayerWithRole(newRole); if (playerWithRole == -1) { _photonServer.OpRaiseEvent(GameEventCode.ChangeRole, (byte)newRole, true, toServerOnly); } } } } }
private void OnEventAction(EventData obj) { UnityEngine.Debug.Log("Event: " + obj.Code + " " + obj.Parameters.ToStringFull()); switch (obj.Code) { case EventCode.Join: CreatePlayer((int)obj.Parameters[ParameterCode.ActorNr]); break; case EventCode.Leave: DeletePlayer((int)obj.Parameters[ParameterCode.ActorNr]); if (obj.Parameters.ContainsKey(ParameterCode.MasterClientId)) { var masterClient = (int)obj.Parameters[ParameterCode.MasterClientId]; if (masterClient == PhotonServer.LocalPlayer.ID) { var gamePlayer = _world.GetComponent <GamePlayer> (PlayerCache.Entities[masterClient]); if (!gamePlayer.isMaster) { _world.CreateEntityWith <MakeMaster> (out _); gamePlayer.isMaster = true; } } } break; case EventCode.PropertiesChanged: if (obj.Parameters.ContainsKey(ParameterCode.TargetActorNr) && (int)obj.Parameters[ParameterCode.TargetActorNr] == 0 && obj.Parameters.ContainsKey(ParameterCode.Properties)) { //todo update global state var data = obj.Parameters[ParameterCode.Properties] as Hashtable; _world.CreateEntityWith <RoomData> (out var roomData); roomData.value = data; } break; case GameEventCode.ChangeRole: { var actorNumber = (int)obj.Parameters[ParameterCode.ActorNr]; var newRole = (PlayerRole)obj.Parameters[ParameterCode.Data]; var otherPlayer = _gameState.GetPlayerWithRole(newRole); if (otherPlayer == -1) { AssignRoleSystem.SetPlayerToRole(PhotonServer, _gameState, actorNumber, newRole); } } break; case GameEventCode.SpawnAsteroids: { var newAsteroids = obj.Parameters[ParameterCode.Data] as AsteroidDesc[]; _world.CreateEntityWith <SpawnAsteroids> (out var spawnAsteroids); spawnAsteroids.value = newAsteroids; } break; case GameEventCode.KillAsteroids: { var asteroidIds = obj.Parameters[ParameterCode.Data] as int[]; _world.CreateEntityWith <KillAsteroids> (out var killAsteroids); killAsteroids.value = asteroidIds; } break; case GameEventCode.DamageByAsteroids: { var asteroidIds = obj.Parameters[ParameterCode.Data] as int[]; _world.CreateEntityWith <KillAsteroids> (out var killAsteroids); killAsteroids.value = asteroidIds; killAsteroids.WithEffect = true; } break; case GameEventCode.ShootAsteroid: { var asteroidId = (int)obj.Parameters[ParameterCode.Data]; if (asteroidId != -1) { _world.CreateEntityWith <KillAsteroids> (out var killAsteroids); killAsteroids.value = new [] { asteroidId }; killAsteroids.WithEffect = true; } _world.CreateEntityWith <ShootRay> (out var shootRay); shootRay.AsteroidTarget = asteroidId; } break; case GameEventCode.ChangeShootCamera: { var target = (Vector3)obj.Parameters[ParameterCode.Data]; _world.CreateEntityWith <ChangeShootTarget> (out var shootTarget); shootTarget.value = target; } break; } }