public override void Deserialize(BinaryReader reader)
        {
            //
            base.Deserialize(reader);

            //
            reader.ReadBytes(3);
            StatusCode       = reader.Read <MediusCallbackStatus>();
            ApplicationID    = reader.ReadInt32();
            MinPlayers       = reader.ReadInt32();
            MaxPlayers       = reader.ReadInt32();
            GameLevel        = reader.ReadInt32();
            PlayerSkillLevel = reader.ReadInt32();
            PlayerCount      = reader.ReadInt32();
            GameStats        = reader.ReadBytes(MediusConstants.GAMESTATS_MAXLEN);
            GameName         = reader.ReadString(MediusConstants.GAMENAME_MAXLEN);
            RulesSet         = reader.ReadInt32();
            GenericField1    = reader.ReadInt32();
            GenericField2    = reader.ReadInt32();
            GenericField3    = reader.ReadInt32();
//             GenericField4 = reader.ReadInt32();
//             GenericField5 = reader.ReadInt32();
//             GenericField6 = reader.ReadInt32();
//             GenericField7 = reader.ReadInt32();
//             GenericField8 = reader.ReadInt32();
            WorldStatus  = reader.Read <MediusWorldStatus>();
            GameHostType = reader.Read <MediusGameHostType>();
        }
Example #2
0
 public Game(ClientObject client, MediusCreateGameRequest createGame, DMEObject dmeServer)
 {
     Id                = IdCounter++;
     ApplicationId     = createGame.ApplicationID;
     GameName          = createGame.GameName;
     MinPlayers        = createGame.MinPlayers;
     MaxPlayers        = createGame.MaxPlayers;
     GameLevel         = createGame.GameLevel;
     PlayerSkillLevel  = createGame.PlayerSkillLevel;
     RulesSet          = createGame.RulesSet;
     GenericField1     = createGame.GenericField1;
     GenericField2     = createGame.GenericField2;
     GenericField3     = createGame.GenericField3;
     GamePassword      = createGame.GamePassword;
     SpectatorPassword = createGame.SpectatorPassword;
     GameHostType      = createGame.GameHostType;
     Attributes        = createGame.Attributes;
     WorldStatus       = MediusWorldStatus.WorldPendingCreation;
     utcTimeCreated    = DateTime.UtcNow;
     utcTimeEmpty      = null;
     DMEServer         = dmeServer;
     ChannelId         = client.CurrentChannelId;
     ChatChannel       = Program.GetChannelById(ChannelId);
     ChatChannel?.RegisterGame(this);
     Host = client;
 }
Example #3
0
        public override void Deserialize(BinaryReader reader)
        {
            //
            base.Deserialize(reader);

            //
            MessageID = reader.Read <MessageId>();

            //
            reader.ReadBytes(3);
            StatusCode    = reader.Read <MediusCallbackStatus>();
            MediusWorldID = reader.ReadInt32();
            PlayerCount   = reader.ReadUInt16();
            MinPlayers    = reader.ReadUInt16();
            MaxPlayers    = reader.ReadUInt16();
            reader.ReadBytes(2);
            GameLevel        = reader.ReadInt32();
            PlayerSkillLevel = reader.ReadInt32();
            RulesSet         = reader.ReadInt32();
            GenericField1    = reader.ReadInt32();
            GenericField2    = reader.ReadInt32();
            GenericField3    = reader.ReadInt32();
            SecurityLevel    = reader.Read <MediusWorldSecurityLevelType>();
            WorldStatus      = reader.Read <MediusWorldStatus>();
            GameHostType     = reader.Read <MediusGameHostType>();
            GameName         = reader.ReadString(Constants.GAMENAME_MAXLEN);
            GameStats        = reader.ReadBytes(Constants.GAMESTATS_MAXLEN);
            EndOfList        = reader.ReadBoolean();
            reader.ReadBytes(3);
        }
Example #4
0
        public void OnEndGameReport(MediusEndGameReport report)
        {
            Console.WriteLine($"---------------------------------------");
            Console.WriteLine($"----- END GAME REPORT {GameName} {Id} -----");
            Console.WriteLine($"----- {report} -----");
            Console.WriteLine($"---------------------------------------");

            WorldStatus = MediusWorldStatus.WorldClosed;
        }
Example #5
0
        public void OnEndGameReport(MediusEndGameReport report)
        {
            WorldStatus = MediusWorldStatus.WorldClosed;

            // Send to plugins
            Program.Plugins.OnEvent(PluginEvent.MEDIUS_GAME_ON_ENDED, new OnGameArgs()
            {
                Game = this
            });
        }
Example #6
0
        public void OnWorldReport(MediusWorldReport report)
        {
            // Ensure report is for correct game world
            if (report.MediusWorldID != Id)
            {
                return;
            }

            GameName         = report.GameName;
            MinPlayers       = report.MinPlayers;
            MaxPlayers       = report.MaxPlayers;
            GameLevel        = report.GameLevel;
            PlayerSkillLevel = report.PlayerSkillLevel;
            RulesSet         = report.RulesSet;
            GenericField1    = report.GenericField1;
            GenericField2    = report.GenericField2;
            GenericField3    = report.GenericField3;

            // Once the world has been closed then we force it closed.
            // This is because when the host hits 'Play Again' they tell the server the world has closed (EndGameReport)
            // but the existing clients tell the server the world is still active.
            // This gives the host a "Game Name Already Exists" when they try to remake with the same name.
            // This just fixes that. At the cost of the game not showing after a host leaves a game.
            if (WorldStatus != MediusWorldStatus.WorldClosed)
            {
                // When game starts, send game mode payload
                if (report.WorldStatus == MediusWorldStatus.WorldActive && WorldStatus != MediusWorldStatus.WorldActive)
                {
                    if (CustomGamemode != null)
                    {
                        CustomGamemode.Apply(Clients.Select(x => x.Client));
                    }
                    else
                    {
                        Gamemode.Disable(Clients.Select(x => x.Client));
                    }
                }

                WorldStatus = report.WorldStatus;
            }
        }
Example #7
0
        public void Tick()
        {
            // Remove timedout clients
            for (int i = 0; i < Clients.Count; ++i)
            {
                var client = Clients[i];

                if (client == null || client.Client == null || !client.Client.IsConnected || client.Client.CurrentGame?.Id != Id)
                {
                    Clients.RemoveAt(i);
                    --i;
                }
            }

            // Auto close when everyone leaves or if host fails to connect after timeout time
            if (!utcTimeEmpty.HasValue && Clients.Count(x => x.InGame) == 0 && (hasHostJoined || (DateTime.UtcNow - utcTimeCreated).TotalSeconds > Program.Settings.GameTimeoutSeconds))
            {
                utcTimeEmpty = DateTime.UtcNow;
                WorldStatus  = MediusWorldStatus.WorldClosed;
            }
        }
Example #8
0
        public override void Deserialize(BinaryReader reader)
        {
            //
            base.Deserialize(reader);

            //
            SessionKey = reader.ReadString(MediusConstants.SESSIONKEY_MAXLEN);
            reader.ReadBytes(3);
            MediusWorldID    = reader.ReadInt32();
            PlayerCount      = reader.ReadInt32();
            GameName         = reader.ReadString(MediusConstants.GAMENAME_MAXLEN);
            GameStats        = reader.ReadBytes(MediusConstants.GAMESTATS_MAXLEN);
            MinPlayers       = reader.ReadInt32();
            MaxPlayers       = reader.ReadInt32();
            GameLevel        = reader.ReadInt32();
            PlayerSkillLevel = reader.ReadInt32();
            RulesSet         = reader.ReadInt32();
            GenericField1    = reader.ReadInt32();
            GenericField2    = reader.ReadInt32();
            GenericField3    = reader.ReadInt32();
            WorldStatus      = reader.Read <MediusWorldStatus>();
        }
Example #9
0
        public Game(ClientObject client, IMediusRequest createGame, Channel chatChannel, DMEObject dmeServer)
        {
            if (createGame is MediusCreateGameRequest r)
            {
                FromCreateGameRequest(r);
            }
            else if (createGame is MediusCreateGameRequest1 r1)
            {
                FromCreateGameRequest1(r1);
            }

            Id = IdCounter++;

            WorldStatus    = MediusWorldStatus.WorldPendingCreation;
            utcTimeCreated = DateTime.UtcNow;
            utcTimeEmpty   = null;
            DMEServer      = dmeServer;
            ChatChannel    = chatChannel;
            ChatChannel?.RegisterGame(this);
            Host = client;

            Logger.Info($"Game {Id}:{GameName}: Created by {client}");
        }
Example #10
0
        public void OnWorldReport0(MediusWorldReport0 report)
        {
            // Ensure report is for correct game world
            if (report.MediusWorldID != Id)
            {
                return;
            }

            GameName         = report.GameName;
            MinPlayers       = report.MinPlayers;
            MaxPlayers       = report.MaxPlayers;
            GameLevel        = report.GameLevel;
            PlayerSkillLevel = report.PlayerSkillLevel;
            RulesSet         = report.RulesSet;
            GenericField1    = report.GenericField1;
            GenericField2    = report.GenericField2;
            GenericField3    = report.GenericField3;

            // Once the world has been closed then we force it closed.
            // This is because when the host hits 'Play Again' they tell the server the world has closed (EndGameReport)
            // but the existing clients tell the server the world is still active.
            // This gives the host a "Game Name Already Exists" when they try to remake with the same name.
            // This just fixes that. At the cost of the game not showing after a host leaves a game.
            if (WorldStatus != MediusWorldStatus.WorldClosed)
            {
                // When game starts, send custom gamemode payload
                if (report.WorldStatus == MediusWorldStatus.WorldActive && WorldStatus != MediusWorldStatus.WorldActive)
                {
                    // Send to plugins
                    Program.Plugins.OnEvent(PluginEvent.MEDIUS_GAME_ON_STARTED, new OnGameArgs()
                    {
                        Game = this
                    });

                    /*
                     * var payloads = new List<BaseScertMessage>();
                     *
                     * // Add payloads and set payload defs
                     * int count = CustomGamemode == null ? 0 : 1;
                     * byte[] moduleDefinitions = new byte[16 * (count + 1)];
                     * for (int i = 0; i < count; ++i)
                     * {
                     *  if (i == 0 && CustomGamemode != null)
                     *  {
                     *      payloads.AddRange(CustomGamemode.GetPayload());
                     *      CustomGamemode.SetModuleEntry(moduleDefinitions, i * 16, true);
                     *  }
                     * }
                     *
                     * // Add module definitions payload
                     * payloads.Add(new RT_MSG_SERVER_MEMORY_POKE()
                     * {
                     *  Address = 0x000CF000,
                     *  Payload = moduleDefinitions
                     * });
                     *
                     * // Send
                     * foreach (var client in Clients.Select(x => x.Client))
                     *  client.Queue(payloads);
                     */
                }

                WorldStatus = report.WorldStatus;
            }
        }