private IEnumerator triggerTubeRace(PartyGameLobbyMmoItemTeamDefinition lobbyData, int templateId, int minutesBetweenLaunches, TubeRaceDefinition raceDefinition)
        {
            while (true)
            {
                yield return(new WaitForSeconds(minutesBetweenLaunches * 60 - lobbyData.LobbyLengthInSeconds));

                PartygameLobbyMmoItem cpItem = new PartygameLobbyMmoItem
                {
                    CreatorId            = -1L,
                    gameTemplateId       = templateId,
                    Id                   = new CPMMOItemId(generateMMOItemId(), CPMMOItemId.CPMMOItemParent.WORLD),
                    playerData           = "{\"Players\":[]}",
                    timeStartedInSeconds = DateTime.UtcNow.GetTimeInSeconds(),
                    timeToLive           = lobbyData.LobbyLengthInSeconds
                };
                processEvent(GameServerEvent.SERVER_ITEM_ADDED, cpItem);
                CPMMOItemPosition position = default(CPMMOItemPosition);
                position.Id       = cpItem.Id;
                position.Position = lobbyData.LobbyLocation;
                processEvent(GameServerEvent.SERVER_ITEM_MOVED, position);
                TubeRaceWorldObject worldObject = new TubeRaceWorldObject(cpItem, processEvent, partyGameSessionManager, raceDefinition);
                worldObjects.Add(worldObject);
                yield return(new WaitForSeconds(lobbyData.LobbyLengthInSeconds));

                worldObject.StartRace();
                worldObjects.Remove(worldObject);
                processEvent(GameServerEvent.SERVER_ITEM_REMOVED, cpItem.Id);
            }
        }
            public void StartSession()
            {
                PartyGameStartEventV2 partyGameStartEventV = default(PartyGameStartEventV2);

                partyGameStartEventV.sessionId  = sessionId;
                partyGameStartEventV.templateId = cpItem.gameTemplateId;
                partyGameStartEventV.playerData = TubeRaceWorldObject.getPlayerData(userScores.Keys);
                processEvent(GameServerEvent.PARTY_GAME_START_V2, partyGameStartEventV);
                PartyGameMessageEvent partyGameMessageEvent = default(PartyGameMessageEvent);

                partyGameMessageEvent.sessionId = sessionId;
                partyGameMessageEvent.type      = 10;
                partyGameMessageEvent.message   = "{\"ModifierLayoutId\":" + UnityEngine.Random.Range(0, 3) + "}";
                processEvent(GameServerEvent.PARTY_GAME_MESSAGE, partyGameMessageEvent);
                foreach (long key in userScores.Keys)
                {
                    PlayerLocomotionStateEvent playerLocomotionStateEvent = default(PlayerLocomotionStateEvent);
                    playerLocomotionStateEvent.SessionId = key;
                    playerLocomotionStateEvent.State     = LocomotionState.Racing;
                    processEvent(GameServerEvent.USER_LOCO_STATE_CHANGED, playerLocomotionStateEvent);
                }
                timer.Start();
            }