/// <summary> /// User pressed a key in the message textfield. /// </summary> /// <param name="e">The event</param> public void OnKeyPressed(KeyEvent e) { if (e.key.ToString() == "Enter") { ChatServerConnectionManager chat = ChatServerConnectionManager.GetInstance(); String message = chat.user.username + ": " + messageTextField.text; messageTextField.text = ""; // AddMessageToLog(message); Packet packet = new Packet(); packet.SetHeader(Headers.CHAT_MESSAGE); packet.AddInt(chat.user.channelID); packet.AddString(message); chat.SendPacket(packet); } }
/// <summary> /// Manage all units and buildings etc to be in sync with the rest of the players in the /// multiplayer game. /// </summary> public void Synchronize() { int objectsSynced = 0; while (objectsSynced < maxObjectsPerFrame && unitList.Count > 0) { // Sync this unit. Unit unit = unitList.First.Value; if (!unit.multiplayerData.isCreated) { // Notify the rest of the world of the creation of this unit. Packet newUnitPacket = new Packet(UnitHeaders.GAME_NEW_UNIT); // Get this packet going before the other one newUnitPacket.AddInt(unit.player.multiplayerID); newUnitPacket.AddInt(unit.multiplayerData.serverID); newUnitPacket.AddInt(unit.multiplayerData.GetObjectType()); // Notify everyone else that we have created a unit GameServerConnectionManager.GetInstance().SendPacket(newUnitPacket); unit.multiplayerData.isCreated = true; } Packet p = new Packet(UnitHeaders.GAME_UNIT_LOCATION); p.AddInt(unit.multiplayerData.serverID); p.AddInt(unit.multiplayerData.moveTarget.X); p.AddInt(unit.multiplayerData.moveTarget.Y); p.AddInt((int)unit.x); p.AddInt((int)unit.y); unit.multiplayerData.lastPulse = new TimeSpan(DateTime.UtcNow.Ticks).TotalMilliseconds; GameServerConnectionManager.GetInstance().SendPacket(p); Console.Out.WriteLine("Synchronised " + unit); unitList.RemoveFirst(); objectsSynced++; } while (objectsSynced < maxObjectsPerFrame && buildingList.Count > 0) { Building building = buildingList.First.Value; if (!building.multiplayerData.isCreated) { // Notify the rest of the world of the creation of this unit. Packet newBuildingPacket = new Packet(BuildingHeaders.GAME_NEW_BUILDING); // Get this packet going before the other one newBuildingPacket.AddInt(building.p.multiplayerID); newBuildingPacket.AddInt(building.multiplayerData.serverID); newBuildingPacket.AddInt(building.multiplayerData.GetObjectType()); newBuildingPacket.AddInt(building.constructedBy.multiplayerData.serverID); // Notify everyone else that we have created a unit GameServerConnectionManager.GetInstance().SendPacket(newBuildingPacket); building.multiplayerData.isCreated = true; } Packet movePacket = new Packet(BuildingHeaders.GAME_BUILDING_LOCATION); movePacket.AddInt(building.multiplayerData.serverID); movePacket.AddInt((int)building.x); movePacket.AddInt((int)building.y); GameServerConnectionManager.GetInstance().SendPacket(movePacket); buildingList.RemoveFirst(); objectsSynced++; } while (objectsSynced < maxObjectsPerFrame && eventList.Count > 0) { DamageEvent e = eventList.First.Value; Packet damagePacket = new Packet(); if (e.by is Arrow) { Arrow arrow = (Arrow)e.by; damagePacket.SetHeader(UnitHeaders.GAME_UNIT_RANGED_DAMAGE); damagePacket.AddInt(arrow.multiplayerData.serverID); damagePacket.AddInt(e.source.multiplayerData.serverID); damagePacket.AddInt(e.target.multiplayerData.serverID); } else if (e.by is MeleeSwing) { MeleeSwing swing = (MeleeSwing)e.by; damagePacket.SetHeader(UnitHeaders.GAME_UNIT_MELEE_DAMAGE); damagePacket.AddInt(EncodeMeleeSwing(swing.type)); damagePacket.AddInt(e.source.multiplayerData.serverID); damagePacket.AddInt(e.target.multiplayerData.serverID); } GameServerConnectionManager.GetInstance().SendPacket(damagePacket); eventList.RemoveFirst(); objectsSynced++; } while (objectsSynced < maxObjectsPerFrame && projectileList.Count > 0) { Projectile toSync = projectileList.First.Value; if (toSync is Arrow && !toSync.multiplayerData.isCreated) { Packet newArrowPacket = new Packet(UnitHeaders.GAME_UNIT_RANGED_SHOT); newArrowPacket.AddInt(toSync.multiplayerData.serverID); newArrowPacket.AddInt(toSync.parent.multiplayerData.serverID); newArrowPacket.AddInt(toSync.target.multiplayerData.serverID); GameServerConnectionManager.GetInstance().SendPacket(newArrowPacket); toSync.multiplayerData.isCreated = true; } projectileList.RemoveFirst(); objectsSynced++; } }
public void DataReceived(Packet p) { ChatServerConnectionManager manager = ChatServerConnectionManager.GetInstance(); switch (p.GetHeader()) { case Headers.NEW_USER: { int userID = PacketUtil.DecodePacketInt(p, 0); String username = PacketUtil.DecodePacketString(p, 4); User user = new User(username); user.id = userID; user.channelID = manager.user.channelID; ParentComponent menu = MenuManager.GetInstance().GetCurrentlyDisplayedMenu(); if (menu is GameLobby) { GameLobby lobby = ((GameLobby)menu); lobby.UserJoined(user); } break; } case Headers.USER_LEFT: { int userID = PacketUtil.DecodePacketInt(p, 0); User user = UserManager.GetInstance().GetUserByID(userID); if (user != null) { ParentComponent menu = MenuManager.GetInstance().GetCurrentlyDisplayedMenu(); if (menu is GameLobby) { GameLobby lobby = ((GameLobby)menu); lobby.UserLeft(user); } } break; } // Client received an ID for creating a game. case Headers.GAME_ID: { int gameID = PacketUtil.DecodePacketInt(p, 0); MultiplayerLobby lobby = ((MultiplayerLobby)MenuManager.GetInstance().GetCurrentlyDisplayedMenu()); String gameName = lobby.gameNameInput.textfield.text; MenuManager.GetInstance().ShowMenu(MenuManager.Menu.GameLobby); GameLobby gameLobby = (GameLobby)MenuManager.GetInstance().GetCurrentlyDisplayedMenu(); gameLobby.multiplayerGame = new MultiplayerGame(gameID, gameName, ""); gameLobby.multiplayerGame.host = manager.user; break; } case Headers.SERVER_CREATE_GAME: { ParentComponent menu = MenuManager.GetInstance().GetCurrentlyDisplayedMenu(); if (menu is GameLobby) { // Confirmation that the game was created? idk } else if (menu is MultiplayerLobby) { MultiplayerGame game = new MultiplayerGame( PacketUtil.DecodePacketInt(p, 0), PacketUtil.DecodePacketString(p, 4), "<No map selected yet>"); MultiplayerLobby lobby = (MultiplayerLobby)menu; lobby.AddGame(game); } break; } case Headers.SERVER_DESTROY_GAME: { int gameID = PacketUtil.DecodePacketInt(p, 0); ParentComponent menu = MenuManager.GetInstance().GetCurrentlyDisplayedMenu(); if (menu is GameLobby) { MenuManager.GetInstance().ShowMenu(MenuManager.Menu.MultiplayerLobby); XNAMessageDialog dialog = XNAMessageDialog.CreateDialog("The host has disconnected.", XNAMessageDialog.DialogType.OK); // When OK is pressed .. get back to the lobby. dialog.button1.onClickListeners += delegate(XNAButton source) { // Change channel Packet leftGamePacket = new Packet(Headers.CLIENT_LEFT_GAME); ChatServerConnectionManager.GetInstance().SendPacket(leftGamePacket); }; } else if (menu is MultiplayerLobby) { MultiplayerLobby lobby = (MultiplayerLobby)menu; lobby.RemoveGameByID(gameID); } break; } case Headers.GAME_MAP_CHANGED: { ParentComponent menu = MenuManager.GetInstance().GetCurrentlyDisplayedMenu(); if (menu is MultiplayerLobby) { MultiplayerLobby lobby = (MultiplayerLobby)menu; MultiplayerGame game = lobby.GetGameByID(PacketUtil.DecodePacketInt(p, 0)); if (game != null) { game.mapname = PacketUtil.DecodePacketString(p, 4); } } break; } case Headers.SERVER_REQUEST_JOIN: { ParentComponent menu = MenuManager.GetInstance().GetCurrentlyDisplayedMenu(); if (menu is GameLobby) { GameLobby lobby = (GameLobby)menu; Packet newPacket = new Packet(); if (lobby.IsFull()) newPacket.SetHeader(Headers.CLIENT_GAME_FULL); else newPacket.SetHeader(Headers.CLIENT_OK_JOIN); newPacket.AddInt(PacketUtil.DecodePacketInt(p, 0)); newPacket.AddInt(PacketUtil.DecodePacketInt(p, 4)); manager.SendPacket(newPacket); } break; } case Headers.CLIENT_OK_JOIN: { // Packet newPacket = new Packet(Headers.CLIENT_CHANNEL); // newPacket.AddInt(PacketUtil.DecodePacketInt(p, 0)); MenuManager.GetInstance().ShowMenu(MenuManager.Menu.GameLobby); // manager.SendPacket(newPacket); break; } case Headers.CLIENT_GAME_FULL: { XNAMessageDialog.CreateDialog("The game is full.", XNAMessageDialog.DialogType.OK); break; } case Headers.GAME_COLOR_CHANGED: { int userID = PacketUtil.DecodePacketInt(p, 4); int colorID = PacketUtil.DecodePacketInt(p, 8); ParentComponent menu = MenuManager.GetInstance().GetCurrentlyDisplayedMenu(); if (menu is GameLobby) { GameLobby lobby = (GameLobby)menu; UserDisplayPanel panel = lobby.GetDisplayPanelByUserId(userID); if (panel != null) { panel.SelectColor(colorID); } else { Console.Out.WriteLine("Tried to change the color of a user that doesn't exist!"); } } break; } case Headers.GAME_TEAM_CHANGED: { int userID = PacketUtil.DecodePacketInt(p, 4); int teamID = PacketUtil.DecodePacketInt(p, 8); ParentComponent menu = MenuManager.GetInstance().GetCurrentlyDisplayedMenu(); if (menu is GameLobby) { GameLobby lobby = (GameLobby)menu; UserDisplayPanel panel = lobby.GetDisplayPanelByUserId(userID); if (panel != null) { panel.teamDropdown.SelectItem(teamID - 1); } else { Console.Out.WriteLine("Tried to change the team of a user that doesn't exist!"); } } break; } case Headers.GAME_READY_CHANGED: { int userID = PacketUtil.DecodePacketInt(p, 4); int readyState = PacketUtil.DecodePacketInt(p, 8); ParentComponent menu = MenuManager.GetInstance().GetCurrentlyDisplayedMenu(); if (menu is GameLobby) { GameLobby lobby = (GameLobby)menu; UserDisplayPanel panel = lobby.GetDisplayPanelByUserId(userID); if (panel != null) { panel.readyCheckBox.selected = readyState != 0; } else { Console.Out.WriteLine("Tried to change the ready state of a user that doesn't exist!"); } } break; } case Headers.GAME_KICK_CLIENT: { MenuManager.GetInstance().ShowMenu(MenuManager.Menu.MultiplayerLobby); XNAMessageDialog dialog = XNAMessageDialog.CreateDialog("You have been kicked by the host.", XNAMessageDialog.DialogType.OK); break; } case Headers.SERVER_GAME_START: { ParentComponent menu = MenuManager.GetInstance().GetCurrentlyDisplayedMenu(); int seconds = PacketUtil.DecodePacketInt(p, 0); if (seconds != 0) { if (menu is GameLobby) { GameLobby lobby = (GameLobby)menu; lobby.AddMessageToLog("Game will start in " + seconds); lobby.leaveGameButton.visible = false; } } else if (menu is GameLobby) { GameLobby lobby = ((GameLobby)menu); Game1.GetInstance().multiplayerGame = new MultiplayerGame(ChatServerConnectionManager.GetInstance().user.channelID, "<Gamename>", "<Mapname>"); StateManager.GetInstance().gameState = StateManager.State.GameInit; MenuManager.GetInstance().ShowMenu(MenuManager.Menu.MultiPlayerLoadMenu); StateManager.GetInstance().gameState = StateManager.State.GameLoading; // Loading will start now // See Game1.cs for sending the packet that the game is done loading (update loop) } break; } case Headers.DONE_LOADING: { int playerID = PacketUtil.DecodePacketInt(p, 0); Console.Out.WriteLine("Done loading packet received! -> " + playerID); Game1.GetInstance().GetPlayerByMultiplayerID(playerID).doneLoading = true; for (int i = 0; i < Game1.GetInstance().players.Count(); i++) { if (!Game1.GetInstance().players.ElementAt(i).doneLoading) return; } StateManager.GetInstance().gameState = StateManager.State.GameRunning; // int count = 0; Game1.CURRENT_PLAYER.SpawnStartUnits(); /*foreach (Player player in Game1.GetInstance().players) { player.SpawnStartUnits(); count++; }*/ break; } case Headers.LOADING_PROGRESS: { int userID = PacketUtil.DecodePacketInt(p, 0); int percentage = PacketUtil.DecodePacketInt(p, 4); User user = Game1.GetInstance().multiplayerGame.GetUserByID(userID); MPLoadScreen loadScreen = ((MPLoadScreen)MenuManager.GetInstance().GetCurrentlyDisplayedMenu()); // It may be null for a split second after the loading finishes if( loadScreen != null ) loadScreen.SetPercentageDone(user, percentage); break; } case Headers.LOADING_WHAT: { int userID = PacketUtil.DecodePacketInt(p, 0); String what = PacketUtil.DecodePacketString(p, 4); User user = Game1.GetInstance().multiplayerGame.GetUserByID(userID); MPLoadScreen loadScreen = ((MPLoadScreen)MenuManager.GetInstance().GetCurrentlyDisplayedMenu()); // It may be null for a split second after the loading finishes if (loadScreen != null) loadScreen.SetLoadingWhat(user, what); break; } case Headers.MAP_POSITION_CHANGED: { int userID = PacketUtil.DecodePacketInt(p, 0); int mapIndex = PacketUtil.DecodePacketInt(p, 4); GameLobby lobby = (GameLobby)MenuManager.GetInstance().GetCurrentlyDisplayedMenu(); lobby.mapPreviewPanel.playerLocationGroup.OnPlayerIndexChangedMP( userID, mapIndex); break; } } }