private void HandleState(MultiplayerGame game, MultiplayerGameState multiplayerGameState, Action action) { var subscription = game.GameStateObservable.Where(state => state == multiplayerGameState) .Subscribe(state => action()); _gameSubscriptions.AddResourceRequiringCleanup(subscription); }
/// <summary> /// Despawns the current platform when entering a lobby and changing back when leaving /// </summary> private void OnMultiplayerGameStateModelDidChange(MultiplayerGameState multiplayerGameState) { CustomPlatform platform; switch (multiplayerGameState) { case MultiplayerGameState.None: _assetLoader.ToggleHeart(_config.ShowHeart); platform = _config.ShowInMenu ? _config.ShufflePlatforms ? RandomPlatform : _platformManager.SingleplayerPlatform : _platformManager.DefaultPlatform; break; case MultiplayerGameState.Lobby when _prevGameState != MultiplayerGameState.Game: _assetLoader.ToggleHeart(false); platform = _platformManager.DefaultPlatform; break; default: return; } _prevGameState = multiplayerGameState; _ = ChangeToPlatformAsync(platform); }
public MultiplayerBase(string address, int port, PGGI.PGGIProvider provider) { ISpriteBatchService spriteService = Atom.Shared.Globals.Engine.GetService<ISpriteBatchService>(); IInputService inputService = Atom.Shared.Globals.Engine.GetService<IInputService>(); contract = inputService.CreateContract(); contract.Enabled = true; contract.SubscribedTouchEvents = TouchStates.OnDoubleTap | TouchStates.OnDrag | TouchStates.OnTap; contract.TouchEventHandler += contract_TouchEventHandler; spriteBatch = spriteService.SpriteBatch; SelectionState = SelectionState.Selection; GameState = MultiplayerGameState.Connecting; GameCounter = 0; client = new Client(); client.OnConnection += new EventHandler<ConnectionArgs>(ClientOnConnection); client.OnPacketRecieved += new EventHandler<PacketRecievedArgs>(ClientOnPacket); Packet ConnectionPacket = new Packet(); ConnectionPacket.Write(provider.PGGI); ConnectionPacket.Write(provider.Token); client.Connect(new System.Net.DnsEndPoint(address, port), ConnectionPacket); Syncing = false; FramesToSpin = int.MaxValue; Manager = new MultiplayerGameManager(); Content = new ContentManager(Atom.Shared.Globals.Engine, "Content"); Fleet = Content.Load<Texture2D>("Graphics/Fleets/1"); }
/// <summary> /// Despawns the current platform when entering a lobby and changing back when leaving /// </summary> // ReSharper disable once AsyncVoidMethod private async void OnMultiplayerGameStateModelDidChange(MultiplayerGameState multiplayerGameState) { CustomPlatform?platform = multiplayerGameState switch { MultiplayerGameState.None when _prevGameState == MultiplayerGameState.Lobby => _platformManager.MenuPlatform, MultiplayerGameState.Lobby when _prevGameState == MultiplayerGameState.None => _platformManager.DefaultPlatform, _ => null }; _prevGameState = multiplayerGameState; if (platform is null) { return; } await ChangeToPlatformAsync(platform); }
public void Clear() { _state = MultiplayerGameState.InActive; /*int i; * * gameState = INACTIVE; * nextState = INACTIVE; * pingUpdateTime = 0; * vote = VOTE_NONE; * voteTimeOut = 0; * voteExecTime = 0; * nextStateSwitch = 0; * matchStartedTime = 0; * currentTourneyPlayer[0] = -1; * currentTourneyPlayer[1] = -1; * one = two = three = false; * * lastWinner = -1; * currentMenu = 0; * bCurrentMenuMsg = false; * nextMenu = 0; * pureReady = false; * scoreBoard = NULL; * spectateGui = NULL; * guiChat = NULL; * mainGui = NULL; * msgmodeGui = NULL; * if(mapList) * { * uiManager->FreeListGUI(mapList); * mapList = NULL; * } * fragLimitTimeout = 0; * memset(&switchThrottle, 0, sizeof(switchThrottle)); * voiceChatThrottle = 0;*/ for (int i = 0; i < ChatNotifyCount; i++) { _chatHistory[i].Line = string.Empty; } /*warmupText.Clear(); * voteValue.Clear(); * voteString.Clear(); * startFragLimit = -1;*/ }
public void Clear() { _state = MultiplayerGameState.InActive; /*int i; gameState = INACTIVE; nextState = INACTIVE; pingUpdateTime = 0; vote = VOTE_NONE; voteTimeOut = 0; voteExecTime = 0; nextStateSwitch = 0; matchStartedTime = 0; currentTourneyPlayer[0] = -1; currentTourneyPlayer[1] = -1; one = two = three = false; lastWinner = -1; currentMenu = 0; bCurrentMenuMsg = false; nextMenu = 0; pureReady = false; scoreBoard = NULL; spectateGui = NULL; guiChat = NULL; mainGui = NULL; msgmodeGui = NULL; if(mapList) { uiManager->FreeListGUI(mapList); mapList = NULL; } fragLimitTimeout = 0; memset(&switchThrottle, 0, sizeof(switchThrottle)); voiceChatThrottle = 0;*/ for(int i = 0; i < ChatNotifyCount; i++) { _chatHistory[i].Line = string.Empty; } /*warmupText.Clear(); voteValue.Clear(); voteString.Clear(); startFragLimit = -1;*/ }
public new void HandleGameStateDidChange(MultiplayerGameState newGameState) { base.HandleGameStateDidChange(newGameState); MPState.CurrentGameState = newGameState; MPEvents.RaiseGameStateChanged(_lobbyGameState, newGameState); }
internal static void RaiseGameStateChanged(object sender, MultiplayerGameState state) => GameStateChanged.RaiseEventSafe(sender, state, nameof(GameStateChanged));
// uploads the game state and adds it to the data base private void UploadGameState(bool ForceUpload = false) { if (!MultiplayerMatch) return; // upload only in multiplayer matches if (!ForceUpload && !AllowedToOperate()) return; // multiplayer: aborts current action if the user is not allowed to move GameState++; // increment game state counter GameScreen.UpdateMatchState(GameState); Game GameCopy = ObjectTools.DeepCopy<Game>(this.Game); // upload new game version new Thread(() => { // needs to be in a separate thread to keep the ui responsive // thread settings Thread.CurrentThread.IsBackground = true; Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; MultiplayerGameState MultiplayerGameState = new MultiplayerGameState() { // TODO: transmit only those object which changed since the last game state has been received BuildingOwners = GameCopy.Map.GetBuildingsOwnersList(), Units = GameCopy.Units, Turn = GameCopy.Turn, Crusaders = GameCopy.Crusaders, Saracens = GameCopy.Saracens, Rounds = GameCopy.Rounds, Over = GameCopy.Over }; // save data to file Data.SaveMultiplayerGameState( MatchId.ToString() + "_" + GameState.ToString(), MultiplayerGameState); // upload the file Server.UploadCurrentGameState(MatchId, GameState, ref UploadTraffic); // update the database (add info that a new file is available) Server.UpdateGameStateInDataBase(MatchId, GameState); Control.MainWindow.Dispatcher.BeginInvoke( // in gui thread (Action)(() => { // refresh traffic label GameScreen.Label_Multiplayer_TrafficUpload.Content = UploadTraffic.ToString(); })); }).Start(); // start thread }
void WebClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { if (e.Result != null) { IsolatedStorageFileStream fs = new IsolatedStorageFileStream(string.Format(@"MultiplayerMaps\map{0}", Map), System.IO.FileMode.Create, storage); e.Result.CopyTo(fs); fs.Flush(); fs.Dispose(); e.Result.Dispose(); List<Planet> planets = (LoadMap(string.Format(@"MultiplayerMaps\map{0}", Map))); foreach (Planet p in planets) Manager.AddPlanet(p); GameState = MultiplayerGameState.Ready; Thread.Sleep(1000); Packet ready = new Packet(); ready.Write((byte)0xFE); client.SendPacket(ready); } }
protected void ClientOnPacket(object sender, PacketRecievedArgs e) { e.Drop = true; byte Type = e.Packet.ReadByte(); switch (Type) { case 0: int Owner = e.Packet.ReadInt(); int SimulationTick = e.Packet.ReadInt(); int Count = e.Packet.ReadInt(); for (int i = 0; i < Count; i++) { int OriginID = e.Packet.ReadInt(); int DestinationID = e.Packet.ReadInt(); SendRequest r = new SendRequest(); r.SimulationTick = SimulationTick; r.Owner = Owner == 1 ? VelesConflict.Gameplay.PlayerType.Player1 : VelesConflict.Gameplay.PlayerType.Player2; r.Origin = OriginID; r.Destination = DestinationID; Manager.QueueAction(r); } break; case 0xFB: GameState = MultiplayerGameState.Waiting; KillGame(true); break; case 0xFD: GameState = MultiplayerGameState.Downloading; Map = e.Packet.ReadInt(); if (!storage.DirectoryExists("MultiplayerMaps")) { storage.CreateDirectory("MultiplayerMaps"); } if (storage.FileExists(string.Format(@"MultiplayerMaps\map{0}", Map))) { List<Planet> planets = (LoadMap(string.Format(@"MultiplayerMaps\map{0}", Map))); foreach (Planet p in planets) Manager.AddPlanet(p); GameState = MultiplayerGameState.Ready; Thread.Sleep(1000); Packet ready = new Packet(); ready.Write((byte)0xFE); client.SendPacket(ready); } else { string MapAddress = string.Format(@"http://www.velesconflict.com/maps/map{0}.xml", Map); WebClient = new WebClient(); WebClient.OpenReadCompleted += new OpenReadCompletedEventHandler(WebClient_OpenReadCompleted); WebClient.OpenReadAsync(new Uri(MapAddress)); } break; case 0xFC: Player = (VelesConflict.Gameplay.PlayerType)e.Packet.ReadByte(); break; case 0xFF: GameCounter = 0; GameState = MultiplayerGameState.Game; Syncing = true; FramesToSpin = 120 - (client.Ping() / 2 + 17 / 2) / 17; break; } e.Packet.ResetPointer(); }
protected void ClientOnConnection(object sender, ConnectionArgs e) { byte Type = e.Packet.ReadByte(); switch (Type) { case 0xFC: GameState = MultiplayerGameState.Waiting; byte pType = e.Packet.ReadByte(); Player = pType == 1 ? VelesConflict.Gameplay.PlayerType.Player1 : VelesConflict.Gameplay.PlayerType.Player2; break; } }