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);
        }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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;
            }
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 8
0
        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);
        }