Beispiel #1
0
 public static string GetProtocolAsString(udtProtocol protocol)
 {
     switch(protocol)
     {
         case udtProtocol.Dm68: return "68 (Quake 3's last protocol)";
         case udtProtocol.Dm73: return "73 (Quake Live's old protocol)";
         case udtProtocol.Dm90: return "90 (Quake Live's current protocol)";
         default: return "?";
     }
 }
Beispiel #2
0
        private static bool ConvertDemosImpl(ref udtParseArg parseArg, udtProtocol outProtocol, List<MapConversionRule> mapRules, List<string> filePaths, int maxThreadCount)
        {
            var resources = new ArgumentResources();
            var errorCodeArray = new Int32[filePaths.Count];
            var filePathArray = new IntPtr[filePaths.Count];
            for(var i = 0; i < filePaths.Count; ++i)
            {
                var filePath = Marshal.StringToHGlobalAnsi(Path.GetFullPath(filePaths[i]));
                filePathArray[i] = filePath;
                resources.GlobalAllocationHandles.Add(filePath);
            }

            var pinnedFilePaths = new PinnedObject(filePathArray);
            var pinnedErrorCodes = new PinnedObject(errorCodeArray);
            resources.PinnedObjects.Add(pinnedFilePaths);
            resources.PinnedObjects.Add(pinnedErrorCodes);
            var multiParseArg = new udtMultiParseArg();
            multiParseArg.FileCount = (UInt32)filePathArray.Length;
            multiParseArg.FilePaths = pinnedFilePaths.Address;
            multiParseArg.OutputErrorCodes = pinnedErrorCodes.Address;
            multiParseArg.MaxThreadCount = (UInt32)maxThreadCount;

            var conversionArg = new udtProtocolConversionArg();
            conversionArg.OutputProtocol = (UInt32)outProtocol;
            conversionArg.MapRules = IntPtr.Zero;
            conversionArg.MapRuleCount = 0;
            if(mapRules.Count > 0)
            {
                var mapRuleArray = new udtMapConversionRule[mapRules.Count];
                for(var i = 0; i < mapRules.Count; ++i)
                {
                    var inputName = Marshal.StringToHGlobalAnsi(mapRules[i].InputName);
                    var outputName = Marshal.StringToHGlobalAnsi(mapRules[i].OutputName);
                    mapRuleArray[i].InputName = inputName;
                    mapRuleArray[i].OutputName = outputName;
                    mapRuleArray[i].PositionOffsetX = mapRules[i].OffsetX;
                    mapRuleArray[i].PositionOffsetY = mapRules[i].OffsetY;
                    mapRuleArray[i].PositionOffsetZ = mapRules[i].OffsetZ;
                    resources.GlobalAllocationHandles.Add(inputName);
                    resources.GlobalAllocationHandles.Add(outputName);
                }
                var pinnedMapRules = new PinnedObject(mapRuleArray);
                resources.PinnedObjects.Add(pinnedMapRules);
                conversionArg.MapRules = pinnedMapRules.Address;
                conversionArg.MapRuleCount = (UInt32)mapRuleArray.Length;
            }

            var result = udtErrorCode.OperationFailed;
            try
            {
                result = udtConvertDemoFiles(ref parseArg, ref multiParseArg, ref conversionArg);
            }
            finally
            {
                resources.Free();
            }

            return result != udtErrorCode.None;
        }
Beispiel #3
0
        public static bool ConvertDemos(ref udtParseArg parseArg, udtProtocol outProtocol, List<MapConversionRule> mapRules, List<string> filePaths, int maxThreadCount)
        {
            var timer = new Stopwatch();
            timer.Start();

            var fileCount = filePaths.Count;
            if(fileCount <= MaxBatchSizeConverting)
            {
                var result = ConvertDemosImpl(ref parseArg, outProtocol, mapRules, filePaths, maxThreadCount);
                PrintExecutionTime(timer);
                return result;
            }

            var oldProgressCb = parseArg.ProgressCb;
            var progressBase = 0.0f;
            var progressRange = 0.0f;
            var fileIndex = 0;

            var newParseArg = parseArg;
            newParseArg.ProgressCb = delegate(float progress, IntPtr userData)
            {
                var realProgress = progressBase + progressRange * progress;
                oldProgressCb(realProgress, userData);
            };

            var batchCount = (fileCount + MaxBatchSizeConverting - 1) / MaxBatchSizeConverting;
            var filesPerBatch = fileCount / batchCount;
            for(int i = 0; i < batchCount; ++i)
            {
                progressBase = (float)fileIndex / (float)fileCount;
                var currentFileCount = (i == batchCount - 1) ? (fileCount - fileIndex) : filesPerBatch;
                var currentFiles = filePaths.GetRange(fileIndex, currentFileCount);
                progressRange = (float)currentFileCount / (float)fileCount;
                fileIndex += currentFileCount;

                ConvertDemosImpl(ref newParseArg, outProtocol, mapRules, currentFiles, maxThreadCount);

                if(Marshal.ReadInt32(parseArg.CancelOperation) != 0)
                {
                    break;
                }
            }

            PrintExecutionTime(timer);

            return true;
        }
Beispiel #4
0
 private static extern Int32 udtIsValidProtocol(udtProtocol protocol);
Beispiel #5
0
 private static extern UInt32 udtGetSizeOfIdEntityState(udtProtocol protocol);
Beispiel #6
0
 private static extern UInt32 udtGetSizeOfidClientSnapshot(udtProtocol protocol);
Beispiel #7
0
 private static extern IntPtr udtGetFileExtensionByProtocol(udtProtocol protocol);