public static Asteroid CreateNewRandomAsteroid(ServerMgr mgr, bool headingRight) { Random randomGenerator = mgr.GetRandomGenerator(); Asteroid s; int chance = randomGenerator.Next(100); if (chance <= SharedDef.ASTEROID_GOLD_CHANCE) { s = new Asteroid(null, IdMgr.GetNewId(0)); s.AsteroidType = AsteroidType.GOLDEN; s.TextureId = randomGenerator.Next(1, 6); s.Radius = randomGenerator.Next(SharedDef.MIN_ASTEROID_RADIUS, SharedDef.MAX_ASTEROID_RADIUS); s.Gold = (s.Radius / 2) * SharedDef.GOLD_ASTEROID_BONUS_MULTIPLY; } else if (chance <= SharedDef.ASTEROID_UNSTABLE_CHANCE) { s = new UnstableAsteroid(null, IdMgr.GetNewId(0)); s.AsteroidType = AsteroidType.UNSTABLE; s.TextureId = randomGenerator.Next(1, 6); s.Radius = randomGenerator.Next(SharedDef.MIN_ASTEROID_RADIUS, SharedDef.MAX_ASTEROID_RADIUS); s.Gold = s.Radius / 2; } else { s = new Asteroid(null, IdMgr.GetNewId(0)); s.AsteroidType = AsteroidType.NORMAL; s.TextureId = randomGenerator.Next(1, 18); s.Radius = randomGenerator.Next(SharedDef.MIN_ASTEROID_RADIUS, SharedDef.MAX_ASTEROID_RADIUS); s.Gold = s.Radius / 2; } s.IsHeadingRight = headingRight; s.Direction = headingRight ? new Vector(1, 0) : new Vector(-1, 0); s.Position = GetRandomPositionInOrbitArea(randomGenerator, s.Radius); s.Color = Color.FromRgb((byte)randomGenerator.Next(40, 255), (byte)randomGenerator.Next(40, 255), (byte)randomGenerator.Next(40, 255)); s.Rotation = mgr.GetRandomGenerator().Next(360); SphereCollisionShape cs = new SphereCollisionShape(); cs.Center = s.Center; cs.Radius = s.Radius; s.CollisionShape = cs; CreateAsteroidControls(mgr, s); return(s); }
private static Asteroid CreateAsteroidControls(ServerMgr mgr, Asteroid s) { NewtonianMovementControl nmc = new NewtonianMovementControl(); nmc.Speed = mgr.GetRandomGenerator().Next(SharedDef.MIN_ASTEROID_SPEED * 10, SharedDef.MAX_ASTEROID_SPEED * 10) / 10.0f; s.AddControl(nmc); LinearRotationControl lrc = new LinearRotationControl(); lrc.RotationSpeed = mgr.GetRandomGenerator().Next(SharedDef.MIN_ASTEROID_ROTATION_SPEED, SharedDef.MAX_ASTEROID_ROTATION_SPEED) / 10.0f; s.AddControl(lrc); s.AddControl(new StickySphereCollisionShapeControl()); return(s); }
public GameManager(ServerMgr serverMgr, List <Player> players) { this.serverMgr = serverMgr; this.players = players; if (serverMgr.TournamentSettings == null) { serverMgr.TournamentSettings = new TournamentSettings(true); } CreateMatchManager(serverMgr.TournamentSettings.MMType); tournamentPlayerIds = new SortedSet <string>(); if (serverMgr.GameType == Gametype.TOURNAMENT_GAME) { players.ForEach(p => tournamentPlayerIds.Add(p.Data.HashId)); } matchCreated = false; }
private bool FindAvailableServerManager(NetConnection netConnection, Gametype type, int serverId) { if (connections.Count == 0) { return(false); } // vzdycky vytvorit novy manager pro solo hru if (type == Gametype.SOLO_GAME) { return(false); } foreach (KeyValuePair <NetConnection, ServerMgr> pair in connections) { if (type == Gametype.MULTIPLAYER_GAME) { Logger.Info("quick game mgr plr count: " + pair.Value.GetPlayerCount()); if (pair.Value.GameType == Gametype.MULTIPLAYER_GAME && pair.Value.GetPlayerCount() == 1) { mgr = pair.Value; return(true); } } else // Tournament { // TODO: nahlasit uzivateli chybu kdyz je pozadovany manager uz zaplneny if (pair.Value.GameType == Gametype.TOURNAMENT_GAME && pair.Value.GetPlayerCount() < SharedDef.MAX_TOURNAMENT_PLAYERS) { if (serverId == pair.Value.Id && !pair.Value.IsGameRunning() && pair.Value.TournamentSettings.PlayedMatches <= 0) { mgr = pair.Value; return(true); } } } } // nenalezen zadny vhodny manager return(false); }
private void CreateNewServerMgr(Gametype type) { mgr = new ServerMgr(); mgr.Init(type, server); if (GameStartedCallback != null) { GameStartedCallback(type == Gametype.TOURNAMENT_GAME); } mgr.CloseCallback = ManagerClosed; Thread serverThread = new Thread(new ThreadStart(mgr.Run)); serverThread.IsBackground = false; serverThread.Name = "Server Thread"; serverThread.Start(); switch (type) { case Gametype.SOLO_GAME: // v solo se nastavi tournament settings primo pres herni aplikaci break; case Gametype.MULTIPLAYER_GAME: { TournamentSettings s = new TournamentSettings(); s.MMType = MatchManagerType.QUICK_GAME; s.Level = GameLevel.BASIC_MAP; s.RoundCount = 1; s.BotCount = 0; mgr.Enqueue(new Action(() => mgr.TournamentSettings = s)); } break; case Gametype.TOURNAMENT_GAME: // v tournamentu se poslou setting pozdeji, az je hrac potvrdi break; } }
private void ManagerClosed(ServerMgr mgr) { // TODO: volano z vlakna manageru if (GameEndedCallback != null) { GameEndedCallback(mgr.GameType == Gametype.TOURNAMENT_GAME); } List <NetConnection> connectionsForRemoval = new List <NetConnection>(); foreach (KeyValuePair <NetConnection, ServerMgr> pair in connections) { if (pair.Value == mgr) { connectionsForRemoval.Add(pair.Key); } } foreach (NetConnection con in connectionsForRemoval) { connections.Remove(con); } }
public static StatPowerUp CreateStatPowerUp(ServerMgr mgr, DeviceType type) { Random randomGenerator = mgr.GetRandomGenerator(); StatPowerUp s = new StatPowerUp(null, IdMgr.GetNewId(0)); s.Size = new Size(20, 20); bool headingRight = randomGenerator.Next(10) > 5 ? true : false; s.Position = GetPositionOnEdgeOfLowerOrbitArea(randomGenerator, headingRight, (int)s.Size.Width / 2); s.Direction = headingRight ? new Vector(1, 0) : new Vector(-1, 0); s.Rotation = mgr.GetRandomGenerator().Next(360); s.PowerUpType = type; SquareCollisionShape cs = new SquareCollisionShape(); cs.Position = s.Position; cs.Size = s.Size; cs.Rotation = s.Rotation; s.CollisionShape = cs; NewtonianMovementControl nmc = new NewtonianMovementControl(); nmc.Speed = mgr.GetRandomGenerator().Next(SharedDef.MIN_POWERUP_SPEED * 10, SharedDef.MAX_POWERUP_SPEED * 10) / 10.0f; s.AddControl(nmc); LinearRotationControl lrc = new LinearRotationControl(); lrc.RotationSpeed = mgr.GetRandomGenerator().Next(SharedDef.MIN_ASTEROID_ROTATION_SPEED, SharedDef.MAX_ASTEROID_ROTATION_SPEED) / 10.0f; s.AddControl(lrc); s.AddControl(new StickySquareCollisionShapeControl()); s.AddControl(new StatPowerUpCollisionReactionControl()); return(s); }
private void GotMessage(object peer) { server = peer as NetServer; NetIncomingMessage msg = server.ReadMessage(); switch (msg.MessageType) { case NetIncomingMessageType.VerboseDebugMessage: case NetIncomingMessageType.DebugMessage: case NetIncomingMessageType.WarningMessage: case NetIncomingMessageType.ErrorMessage: Logger.Debug(msg.ReadString()); break; case NetIncomingMessageType.UnconnectedData: PacketType packetType = (PacketType)msg.ReadInt32(); switch (packetType) { case PacketType.AVAILABLE_TOURNAMENTS_REQUEST: if (!CheckVersion(msg.ReadString(), msg.SenderEndPoint)) { break; } SendAvailableTournamentsResponse(msg.SenderEndPoint); break; case PacketType.AVAILABLE_RECONNECT_REQUEST: CheckAvailableReconnect(msg.SenderEndPoint, msg.ReadString()); break; } break; case NetIncomingMessageType.ConnectionApproval: if (msg.ReadInt32() != (int)PacketType.PLAYER_CONNECT) { break; } string clientVersion = msg.ReadString(); if (!CheckVersion(clientVersion, msg.SenderEndPoint)) { msg.SenderConnection.Deny("version mismatch"); break; } Gametype type = (Gametype)msg.ReadByte(); int serverId = msg.ReadInt32(); string name = msg.ReadString(); string playerHashId = msg.ReadString(); // v pripade ze jeho connection je uz prirazene k nejakemu manageru if (connections.TryGetValue(msg.SenderConnection, out mgr)) { mgr.Enqueue(new Action(() => mgr.PlayerConnectionApproval(msg, name, playerHashId))); Logger.Info("Player " + name + " has manager assigned already (during ConnectionApproval)"); return; } if (PlayerConnectedCallback != null) { PlayerConnectedCallback(); } mgr = GetServerForReconnectionIfAny(playerHashId); // novy manager se vytvori pokud je zakladan novy turnaj (id 0) nebo pokud neni nalezen vhodny server if (mgr == null && ((type == Gametype.TOURNAMENT_GAME && serverId == 0) || !FindAvailableServerManager(msg.SenderConnection, type, serverId))) { CreateNewServerMgr(type); } connections.Add(msg.SenderConnection, mgr); mgr.Enqueue(new Action(() => mgr.PlayerConnectionApproval(msg, name, playerHashId))); return; //musi se provest return, jinak je zprava zrecyklovana jeste pred zpracovanim, o recyklaci se stara ServerMgr case NetIncomingMessageType.Data: if (!connections.TryGetValue(msg.SenderConnection, out mgr)) { Logger.Warn("received data message from unknown connection -> skipped: " + msg.SenderConnection); break; } mgr.EnqueueReceivedMessage(msg); return; //musi se provest return, jinak je zprava zrecyklovana jeste pred zpracovanim, o recyklaci se stara ServerMgr case NetIncomingMessageType.StatusChanged: switch (msg.SenderConnection.Status) { case NetConnectionStatus.None: case NetConnectionStatus.InitiatedConnect: case NetConnectionStatus.RespondedAwaitingApproval: case NetConnectionStatus.RespondedConnect: break; case NetConnectionStatus.Disconnected: case NetConnectionStatus.Disconnecting: if (PlayerDisconnectedCallback != null) { PlayerDisconnectedCallback(); } ServerMgr tempMgr = null; if (!connections.TryGetValue(msg.SenderConnection, out tempMgr)) { Logger.Warn("disconnecting unknown connection -> skipped: " + msg.SenderConnection); break; } long uid = msg.SenderConnection.RemoteUniqueIdentifier; tempMgr.Enqueue(new Action(() => tempMgr.PlayerDisconnected(uid))); connections.Remove(msg.SenderConnection); //msg.SenderConnection.Disconnect("x"); break; case NetConnectionStatus.Connected: break; } // NOTE: Disconnecting and Disconnected are not instant unless client is shutdown with disconnect() //Logger.Debug(msg.SenderConnection.ToString() + " status changed to: " + msg.SenderConnection.Status); break; default: Logger.Debug("non-handled message type: " + msg.MessageType); break; } server.Recycle(msg); }