Exemple #1
0
        private static ServerEvent ParseByNamedRegex(RefreshPacket refreshPacket, string input, string regexWithNamedGroups,
                                                     EventType eventType)
        {
            var regex = new Regex(regexWithNamedGroups);
            var match = regex.Match(input);

            if (!match.Success)
            {
                return(null);
            }

            var props = regex.GetGroupNames()
                        .Except(new [] { "0" })
                        .Select(name => (name, match.Groups[(string)name].Value))
                        .ToArray();

            return(new ServerEvent(refreshPacket, eventType, props));
        }
Exemple #2
0
        public static ServerEvent Parse(string input, RefreshPacket refreshPacket)
        {
            if (refreshPacket?.PlayerName == null)
            {
                return(ServerEvent.NoRefreshFrame(input));
            }

            Func <RefreshPacket, string, ServerEvent>[] handlers =
            {
                ParsePlayerLeavesTeam,
                ParsePlayerSays,
                ParseAddressIsRequestingGame,
                ParsePlayerJoiningGame,
                ParsePlayerJoinsTeam,
                ParsePlayerKillsPlayer,
                ParsePlayerCapturesFlag,
                ParsePlayerReturnsFlag,
                ParsePlayerScoresForTeam,
                ParseNextMap,
                ParseTimeLeft,
                ParseCommandRequest,
            };

            foreach (var handler in handlers)
            {
                var result = handler(refreshPacket, input);
                if (result == null)
                {
                    continue;
                }

                if (PlayerNameMatches(result, refreshPacket.PlayerName))
                {
                    return(result);
                }
                else
                {
                    Console.WriteLine($"Tried {result.EventType} but player name doesn't match");
                }
            }

            return(ServerEvent.Unknown(input));
        }
Exemple #3
0
        public RefreshPacket ParseRefreshPacket(byte[] packet, int offset = 0)
        {
            int           i = offset;
            byte          length;
            RefreshPacket tempPacket = new RefreshPacket();

            for (int k = 0; k < 32; k++)
            {
                length = packet[i];
                i++;
                for (int j = 0; j < 24; j++)
                {
                    tempPacket.PlayerName[k] += Convert.ToChar(packet[i]);
                    i++;
                }
                tempPacket.PlayerName[k] = left(tempPacket.PlayerName[k], length);
            }
            for (int k = 0; k < 32; k++)
            {
                tempPacket.Team[k] = packet[i];
                i++;
            }
            for (int k = 0; k < 32; k++)
            {
                tempPacket.Kills[k] = packet[i] + (packet[i + 1] * 256);
                i += 2;
            }
            for (int k = 0; k < 32; k++)
            {
                tempPacket.Deaths[k] = packet[i] + (packet[i + 1] * 256);
                i += 2;
            }
            for (int k = 0; k < 32; k++)
            {
                tempPacket.Ping[k] = packet[i];
                i++;
            }
            for (int k = 0; k < 32; k++)
            {
                tempPacket.Number[k] = packet[i];
                i++;
            }
            for (int k = 0; k < 32; k++)
            {
                for (int j = 0; j < 4; j++)
                {
                    tempPacket.IP[k, j] = packet[i];
                    i++;
                }
            }
            for (int k = 0; k < 4; k++)
            {
                tempPacket.TeamScore[k] = packet[i] + (packet[i + 1] * 256);
                i += 2;
            }
            length = packet[i];
            i++;
            for (int k = 0; k < 16; k++)
            {
                tempPacket.MapName += Convert.ToChar(packet[i]);
                i++;
            }
            tempPacket.MapName = left(tempPacket.MapName, length);
            for (int k = 0; k < 4; k++)
            {
                //You can use getTime() to return the time limit as a string in "MM:SS" format.
                tempPacket.TimeLimit += Convert.ToInt64(packet[i] * (Math.Pow(256, k)));
                i++;
            }
            for (int k = 0; k < 4; k++)
            {
                //You can use getTime() to return the time left as a string in "MM:SS" format.
                tempPacket.CurrentTime += Convert.ToInt64(packet[i] * (Math.Pow(256, k)));
                i++;
            }
            tempPacket.KillLimit = packet[i] + (packet[i + 1] * 256);
            i += 2;
            tempPacket.GameStyle = packet[i];


            return(tempPacket);
        }
Exemple #4
0
 public ServerEvent(RefreshPacket refreshPacket, EventType type, params (string, string)[] props)
Exemple #5
0
 private static ServerEvent ParseAddressIsRequestingGame(RefreshPacket refreshPacket, string input) => ParseByNamedRegex(
     refreshPacket, input,
     @"(?<address>[\d\.:]+)\|(?<hwid>[a-zA-Z0-9]+) requesting game\.\.\.",
     EventType.AddressIsRequestingGame);
Exemple #6
0
 private static ServerEvent ParseTimeLeft(RefreshPacket refreshPacket, string input) => ParseByNamedRegex(
     refreshPacket, input,
     @"^Time Left: (?<timeleft>.+)",
     EventType.TimeLeft);
Exemple #7
0
 private static ServerEvent ParseNextMap(RefreshPacket refreshPacket, string input) => ParseByNamedRegex(
     refreshPacket, input,
     @"Next map: (?<map>.+)",
     EventType.NextMap);
Exemple #8
0
 private static ServerEvent ParseCommandRequest(RefreshPacket refreshPacket, string input) => ParseByNamedRegex(
     refreshPacket, input,
     @"^\/(?<command>\w+?)\((?<ip>[\d\.]+)\[(?<name>.+?)\]\)",
     EventType.CommandRequest);
Exemple #9
0
 private static ServerEvent ParsePlayerScoresForTeam(RefreshPacket refreshPacket, string input) => ParseByNamedRegex(
     refreshPacket, input,
     @"(?<name>.+) scores for (?<team>\w+) Team",
     EventType.PlayerScoresForTeam);
Exemple #10
0
 private static ServerEvent ParsePlayerSays(RefreshPacket refreshPacket, string input) => ParseByNamedRegex(
     refreshPacket, input,
     @"^\[(?<name>.+?)\] (?<what>.+)$",
     EventType.PlayerSays);
Exemple #11
0
 private static ServerEvent ParsePlayerReturnsFlag(RefreshPacket refreshPacket, string input) => ParseByNamedRegex(
     refreshPacket, input,
     @"(?<name>.+) returned the (?<flag>\w+) Flag",
     EventType.PlayerReturnsFlag);
Exemple #12
0
 private static ServerEvent ParsePlayerKillsPlayer(RefreshPacket refreshPacket, string input) => ParseByNamedRegex(
     refreshPacket, input,
     @"\((?<killerindex>\d+?)\) (?<killer>.+) killed \((?<victimindex>\d+?)\) (?<victim>.+) with (?<weapon>.+)",
     EventType.PlayerKillsPlayer);
Exemple #13
0
 private static ServerEvent ParsePlayerLeavesTeam(RefreshPacket refreshPacket, string input) => ParseByNamedRegex(
     refreshPacket, input,
     @"(?<formername>.+) has left (?<team>\w+) team\.",
     EventType.PlayerLeavesTeam);
Exemple #14
0
 private static ServerEvent ParsePlayerJoinsTeam(RefreshPacket refreshPacket, string input) => ParseByNamedRegex(
     refreshPacket, input,
     @"(?<name>.+) has joined (?<team>\w+) team\.",
     EventType.PlayerJoinsTeam);
Exemple #15
0
 private static ServerEvent ParsePlayerJoiningGame(RefreshPacket refreshPacket, string input) => ParseByNamedRegex(
     refreshPacket, input,
     @"(?<name>.+) joining game \((?<address>[\d\.:]+)\) HWID:(?<hwid>[a-zA-Z0-9]+)",
     EventType.PlayerJoiningGame);