示例#1
0
 public Dsreplay(DsReplayDto dto)
 {
     Dsplayers = dto.DSPlayer.Select(s => new Dsplayer()
     {
         Breakpoints = s.Breakpoints.Select(b => new Breakpoint()
         {
             Breakpoint1      = b.Breakpoint,
             Gas              = b.Gas,
             Income           = b.Income,
             Army             = b.Army,
             Kills            = b.Kills,
             Upgrades         = b.Upgrades,
             Tier             = b.Tier,
             Mid              = b.Mid,
             DsUnitsString    = b.dsUnitsString,
             DbUnitsString    = b.dbUnitsString,
             DbUpgradesString = b.dbUpgradesString
         }).ToList(),
         Pos       = (byte)s.POS,
         Realpos   = (byte)s.REALPOS,
         Name      = s.NAME,
         Race      = (byte)DSData.GetCommander(s.RACE),
         Opprace   = (byte)DSData.GetCommander(s.OPPRACE),
         Win       = s.WIN,
         Team      = (byte)s.TEAM,
         Killsum   = s.KILLSUM,
         Income    = s.INCOME,
         Pduration = s.PDURATION,
         Army      = s.ARMY,
         Gas       = (byte)s.GAS,
         isPlayer  = s.isPlayer
     }).ToList();
     Middles = dto.Middle.Select(m => new Middle()
     {
         Gameloop = m.Gameloop,
         Team     = (byte)m.Team
     }).ToList();
     Replay      = dto.REPLAY;
     Gametime    = dto.GAMETIME;
     Winner      = (sbyte)dto.WINNER;
     Duration    = dto.DURATION;
     Minkillsum  = dto.MINKILLSUM;
     Maxkillsum  = dto.MAXKILLSUM;
     Minarmy     = dto.MINARMY;
     Minincome   = dto.MININCOME;
     Maxleaver   = dto.MAXLEAVER;
     Playercount = (byte)dto.PLAYERCOUNT;
     Reported    = (byte)dto.REPORTED;
     Isbrawl     = dto.ISBRAWL;
     Gamemode    = (byte)DSData.GetGameMode(dto.GAMEMODE);
     Version     = dto.VERSION;
     Hash        = dto.HASH;
     Replaypath  = dto.REPLAYPATH;
     Objective   = dto.OBJECTIVE;
     Upload      = dto.Upload;
     Bunker      = dto.Bunker;
     Cannon      = dto.Cannon;
     Mid1        = dto.Mid1;
     Mid2        = dto.Mid2;
 }
示例#2
0
        private void InsertReplay(DsReplayDto replay, List <string> playerNames)
        {
            var dbReplay = new Dsreplay(replay);

            dbReplay.Dsplayers.Where(x => playerNames.Contains(x.Name)).ToList().ForEach(x => x.isPlayer = true);
            ReplayFilter.SetDefaultFilter(new List <Dsreplay>()
            {
                dbReplay
            });
            DbService.SetMid(dbReplay);
            insertService.AddReplay(dbReplay);
        }
示例#3
0
    private static DsReplayDto?GetReplayDto(Sc2Replay replay)
    {
        if (replay.Details == null || replay.TrackerEvents == null)
        {
            return(null);
        }

        DsReplayDto replayDto = new DsReplayDto();

        ParseDetails(replayDto, replay.Details);
        ParseTrackerEvents(replayDto, replay.TrackerEvents);

        return(replayDto);
    }
示例#4
0
 private async Task ProduceReplays(List <string> replayPaths, CancellationToken token)
 {
     try
     {
         ParallelOptions po = new ParallelOptions()
         {
             MaxDegreeOfParallelism = Threads,
             CancellationToken      = token
         };
         await Parallel.ForEachAsync(replayPaths, po, async (data, token) =>
         {
             Interlocked.Increment(ref producerCount);
             logger.LogInformation($"working on {Path.GetFileName(data)}");
             DsReplayDto replayDto = null;
             await Task.Run(() => { replayDto = DsDecodeService.DecodeReplay(AppPath, data, token); }, token);
             if (replayDto != null)
             {
                 InsertReplay(replayDto, PlayerNames);
                 Interlocked.Increment(ref decodeCount);
             }
             else
             {
                 FailedReplays.Add(data);
             }
             Interlocked.Decrement(ref producerCount);
             po.CancellationToken.ThrowIfCancellationRequested();
         });
     }
     catch (OperationCanceledException)
     {
         insertService.Cancel();
     }
     catch (Exception ex)
     {
         logger.LogError(ex.Message);
     }
     finally
     {
         PrducerFinished();
     }
     logger.LogInformation($"producer job finished.");
 }
示例#5
0
    private static void ParseTrackerUnitEvents(DsReplayDto replay, ICollection <SUnitBornEvent> bornEvents, ICollection <SUnitDiedEvent> diedEvents, ICollection <SUnitTypeChangeEvent> changeEvents)
    {
        SUnitBornEvent?nexusBornEvent     = null;
        SUnitBornEvent?planetaryBornEvent = null;

        List <SUnitBornEvent> Refineries = new List <SUnitBornEvent>();
        List <SUnitBornEvent> Units      = new List <SUnitBornEvent>();

        int i = 0;

        foreach (SUnitBornEvent bornEvent in bornEvents)
        {
            i++;
            DSPlayerDto?player = null;
            bool        noStagingAreaNextSpawn = false;
            if (replay.GAMETIME < new DateTime(2019, 03, 24, 21, 46, 15))
            {
                noStagingAreaNextSpawn = true;
            }

            if (bornEvent.UnitTypeName.StartsWith("Worker"))
            {
                player = replay.DSPlayer.SingleOrDefault(f => f.POS == bornEvent.ControlPlayerId);
                if (player == null)
                {
                    player = replay.DSPlayer.SingleOrDefault(s => s.REALPOS == bornEvent.ControlPlayerId - 1);
                    if (player == null)
                    {
                        continue;
                    }
                    else
                    {
                        player.POS = bornEvent.ControlPlayerId;
                    }
                }
                player.REALPOS = 0;
                player.RACE    = bornEvent.UnitTypeName[6..];
示例#6
0
        private void DecodeReplay(string replayPath, CancellationToken cancellationToken)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            Interlocked.Increment(ref activeThreads);

            string id = Path.GetFileNameWithoutExtension(replayPath);

            logger.LogDebug($"Decoding replay {id} on {activeThreads} threads.");
            try
            {
                dynamic MPQArchive = scriptScope.GetVariable("MPQArchive");

                var archive  = MPQArchive(replayPath);
                var contents = archive.header["user_data_header"]["content"];
                var versions = scriptScope.GetVariable("versions");

                dynamic header = null;
                lock (lockObject)
                {
                    header = versions.latest().decode_replay_header(contents);
                }
                var baseBuild = header["m_version"]["m_baseBuild"];
                var protocol  = versions.build(baseBuild);

                // details
                var details_enc = archive.read_file("replay.details");

                lib.Models.DSReplay replay = null;
                var details_dec            = protocol.decode_replay_details(details_enc);
                replay = DetailsService.GetDetails(details_dec);

                if (replay == null)
                {
                    throw new Exception($"Decoding details for {id} failed.");
                }
                replay.REPLAYPATH = replayPath;
                logger.LogDebug($"Got replay details with {replay.DSPlayer.Count} player.");

                // trackerevents
                var trackerevents_enc = archive.read_file("replay.tracker.events");
                var trackerevents_dec = protocol.decode_replay_tracker_events(trackerevents_enc);

                TrackerEventsService.GetTrackerEvents(replay, trackerevents_dec);

                Initialize.Replay(replay, false);

                var         json      = JsonSerializer.Serialize(replay);
                DsReplayDto newreplay = JsonSerializer.Deserialize <DsReplayDto>(json, new JsonSerializerOptions()
                {
                    PropertyNameCaseInsensitive = true
                });
                newreplay.VERSION = Version.ToString();
                Replays.Add(new Dsreplay(newreplay));
            }
            catch (Exception e)
            {
                FailedReplays.Add(replayPath);
                logger.LogError($"Failed decoding replay {id}: {e.Message}");
            }
            finally
            {
                Interlocked.Decrement(ref activeThreads);
                Interlocked.Increment(ref replaysDone);
            }
        }
示例#7
0
 private static void ParseUpgradeEvents(DsReplayDto replay, ICollection <SUpgradeEvent> upgradeEvetns)
 {
     foreach (SUpgradeEvent upgradeEvent in upgradeEvetns)
     {
     }
 }
示例#8
0
 private static void ParseTrackerEvents(DsReplayDto replay, TrackerEvents trackerEvents)
 {
     ParseTrackerUnitEvents(replay, trackerEvents.SUnitBornEvents, trackerEvents.SUnitDiedEvents, trackerEvents.SUnitTypeChangeEvents);
     ParseUpgradeEvents(replay, trackerEvents.SUpgradeEvents);
 }