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>(); }
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; }
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); }
public void OnEndGameReport(MediusEndGameReport report) { Console.WriteLine($"---------------------------------------"); Console.WriteLine($"----- END GAME REPORT {GameName} {Id} -----"); Console.WriteLine($"----- {report} -----"); Console.WriteLine($"---------------------------------------"); WorldStatus = MediusWorldStatus.WorldClosed; }
public void OnEndGameReport(MediusEndGameReport report) { WorldStatus = MediusWorldStatus.WorldClosed; // Send to plugins Program.Plugins.OnEvent(PluginEvent.MEDIUS_GAME_ON_ENDED, new OnGameArgs() { Game = this }); }
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; } }
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; } }
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>(); }
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}"); }
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; } }