├── .gitattributes
├── .gitignore
├── CSGO-Analyzer.sln
├── Common
├── Common.csproj
├── Properties
│ └── AssemblyInfo.cs
└── Stringify.cs
├── DemoParser-Console
├── App.config
├── DemoParser-Console.csproj
├── Program.cs
└── Properties
│ └── AssemblyInfo.cs
├── DemoParser-Model
├── DemoParser-Model.csproj
├── Frag.cs
├── Game.cs
├── Models
│ ├── PlayerRatingData.cs
│ ├── ScoreBoard.cs
│ └── ScoreBoardLine.cs
├── Observers
│ ├── GameObserver.cs
│ ├── Observer.cs
│ └── ScoreboardObserver.cs
├── Player.cs
├── Properties
│ └── AssemblyInfo.cs
├── Round.cs
├── Services
│ ├── IRatingService.cs
│ ├── IScoreBoardService.cs
│ ├── IScoreCalculatorService.cs
│ ├── ISteamIdConverter.cs
│ ├── RatingService.cs
│ ├── ScoreBoardService.cs
│ └── ScoreCalculatorService.cs
└── Team.cs
├── DemoParser-UI
├── App.config
├── App.xaml
├── App.xaml.cs
├── DemoParser-UI.csproj
├── MainWindow.xaml
├── MainWindow.xaml.cs
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ ├── Settings.Designer.cs
│ └── Settings.settings
└── Resources
│ └── Flags
│ ├── AD.png
│ ├── AE.png
│ ├── AF.png
│ ├── AG.png
│ ├── AI.png
│ ├── AL.png
│ ├── AM.png
│ ├── AN.png
│ ├── AO.png
│ ├── AQ.png
│ ├── AR.png
│ ├── AS.png
│ ├── AT.png
│ ├── AU.png
│ ├── AW.png
│ ├── AX.png
│ ├── AZ.png
│ ├── BA.png
│ ├── BB.png
│ ├── BD.png
│ ├── BE.png
│ ├── BF.png
│ ├── BG.png
│ ├── BH.png
│ ├── BI.png
│ ├── BJ.png
│ ├── BL.png
│ ├── BM.png
│ ├── BN.png
│ ├── BO.png
│ ├── BR.png
│ ├── BS.png
│ ├── BT.png
│ ├── BW.png
│ ├── BY.png
│ ├── BZ.png
│ ├── CA.png
│ ├── CC.png
│ ├── CD.png
│ ├── CF.png
│ ├── CG.png
│ ├── CH.png
│ ├── CI.png
│ ├── CK.png
│ ├── CL.png
│ ├── CM.png
│ ├── CN.png
│ ├── CO.png
│ ├── CR.png
│ ├── CU.png
│ ├── CV.png
│ ├── CW.png
│ ├── CX.png
│ ├── CY.png
│ ├── CZ.png
│ ├── DE.png
│ ├── DJ.png
│ ├── DK.png
│ ├── DM.png
│ ├── DO.png
│ ├── DZ.png
│ ├── EC.png
│ ├── EE.png
│ ├── EG.png
│ ├── EH.png
│ ├── ER.png
│ ├── ES.png
│ ├── ET.png
│ ├── EU.png
│ ├── FI.png
│ ├── FJ.png
│ ├── FK.png
│ ├── FM.png
│ ├── FO.png
│ ├── FR.png
│ ├── GA.png
│ ├── GB.png
│ ├── GD.png
│ ├── GE.png
│ ├── GG.png
│ ├── GH.png
│ ├── GI.png
│ ├── GL.png
│ ├── GM.png
│ ├── GN.png
│ ├── GQ.png
│ ├── GR.png
│ ├── GS.png
│ ├── GT.png
│ ├── GU.png
│ ├── GW.png
│ ├── GY.png
│ ├── HK.png
│ ├── HN.png
│ ├── HR.png
│ ├── HT.png
│ ├── HU.png
│ ├── IC.png
│ ├── ID.png
│ ├── IE.png
│ ├── IL.png
│ ├── IM.png
│ ├── IN.png
│ ├── IQ.png
│ ├── IR.png
│ ├── IS.png
│ ├── IT.png
│ ├── JE.png
│ ├── JM.png
│ ├── JO.png
│ ├── JP.png
│ ├── KE.png
│ ├── KG.png
│ ├── KH.png
│ ├── KI.png
│ ├── KM.png
│ ├── KN.png
│ ├── KP.png
│ ├── KR.png
│ ├── KW.png
│ ├── KY.png
│ ├── KZ.png
│ ├── LA.png
│ ├── LB.png
│ ├── LC.png
│ ├── LI.png
│ ├── LK.png
│ ├── LR.png
│ ├── LS.png
│ ├── LT.png
│ ├── LU.png
│ ├── LV.png
│ ├── LY.png
│ ├── MA.png
│ ├── MC.png
│ ├── MD.png
│ ├── ME.png
│ ├── MF.png
│ ├── MG.png
│ ├── MH.png
│ ├── MK.png
│ ├── ML.png
│ ├── MM.png
│ ├── MN.png
│ ├── MO.png
│ ├── MP.png
│ ├── MQ.png
│ ├── MR.png
│ ├── MS.png
│ ├── MT.png
│ ├── MU.png
│ ├── MV.png
│ ├── MW.png
│ ├── MX.png
│ ├── MY.png
│ ├── MZ.png
│ ├── NA.png
│ ├── NC.png
│ ├── NE.png
│ ├── NF.png
│ ├── NG.png
│ ├── NI.png
│ ├── NL.png
│ ├── NO.png
│ ├── NP.png
│ ├── NR.png
│ ├── NU.png
│ ├── NZ.png
│ ├── OM.png
│ ├── PA.png
│ ├── PE.png
│ ├── PF.png
│ ├── PG.png
│ ├── PH.png
│ ├── PK.png
│ ├── PL.png
│ ├── PN.png
│ ├── PR.png
│ ├── PS.png
│ ├── PT.png
│ ├── PW.png
│ ├── PY.png
│ ├── QA.png
│ ├── RO.png
│ ├── RS.png
│ ├── RU.png
│ ├── RW.png
│ ├── SA.png
│ ├── SB.png
│ ├── SC.png
│ ├── SD.png
│ ├── SE.png
│ ├── SG.png
│ ├── SH.png
│ ├── SI.png
│ ├── SK.png
│ ├── SL.png
│ ├── SM.png
│ ├── SN.png
│ ├── SO.png
│ ├── SR.png
│ ├── SS.png
│ ├── ST.png
│ ├── SV.png
│ ├── SY.png
│ ├── SZ.png
│ ├── TC.png
│ ├── TD.png
│ ├── TF.png
│ ├── TG.png
│ ├── TH.png
│ ├── TJ.png
│ ├── TK.png
│ ├── TL.png
│ ├── TM.png
│ ├── TN.png
│ ├── TO.png
│ ├── TR.png
│ ├── TT.png
│ ├── TV.png
│ ├── TW.png
│ ├── TZ.png
│ ├── UA.png
│ ├── UG.png
│ ├── US.png
│ ├── UY.png
│ ├── UZ.png
│ ├── VA.png
│ ├── VC.png
│ ├── VE.png
│ ├── VG.png
│ ├── VI.png
│ ├── VN.png
│ ├── VU.png
│ ├── WF.png
│ ├── WS.png
│ ├── YE.png
│ ├── YT.png
│ ├── ZA.png
│ ├── ZM.png
│ └── ZW.png
├── DemoParser
├── DataTables
│ ├── DataTableParser.cs
│ ├── SendTable.cs
│ ├── SendTableProperty.cs
│ └── ServerClass.cs
├── DemoHeader.cs
├── DemoMessageType.cs
├── DemoParser-Core.csproj
├── DemoParser.cs
├── Entities
│ ├── Equipment.cs
│ ├── Player.cs
│ └── Team.cs
├── Events
│ ├── Events.cs
│ └── EventsManager.cs
├── Helper.cs
├── Messages
│ ├── gcmessages.cs
│ ├── netmessages.cs
│ ├── steammessages.cs
│ └── usermessages.cs
├── Packets
│ ├── DemoPacketParser.cs
│ ├── Entity.cs
│ ├── Handlers
│ │ ├── CreateStringTableUserInfoHandler.cs
│ │ ├── GameEventHandler.cs
│ │ ├── GenericCreateStringTablesHandler.cs
│ │ ├── PacketEntitiesHandler.cs
│ │ ├── UpdateStringTableUserInfoHandler.cs
│ │ └── UserMessageHandler.cs
│ ├── IMessageParser.cs
│ └── PropertyDecoder.cs
├── Properties
│ └── AssemblyInfo.cs
├── Streams
│ ├── BitStream
│ │ ├── BitArrayStream.cs
│ │ ├── BitStreamUtil.cs
│ │ ├── DebugBitStream.cs
│ │ ├── IBitStream.cs
│ │ ├── ManagedBitStream.cs
│ │ └── UnsafeBitStream.cs
│ └── LimitStream.cs
├── StringTables
│ └── StringTableParser.cs
├── Structs.cs
└── packages.config
├── License.txt
├── PacketInspector
├── App.config
├── App.xaml
├── App.xaml.cs
├── MainWindow.xaml
├── MainWindow.xaml.cs
├── PacketInspector.csproj
└── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ ├── Settings.Designer.cs
│ └── Settings.settings
├── README.md
└── TODO.txt
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | # Custom for Visual Studio
5 | *.cs diff=csharp
6 | *.sln merge=union
7 | *.csproj merge=union
8 | *.vbproj merge=union
9 | *.fsproj merge=union
10 | *.dbproj merge=union
11 |
12 | # Standard to msysgit
13 | *.doc diff=astextplain
14 | *.DOC diff=astextplain
15 | *.docx diff=astextplain
16 | *.DOCX diff=astextplain
17 | *.dot diff=astextplain
18 | *.DOT diff=astextplain
19 | *.pdf diff=astextplain
20 | *.PDF diff=astextplain
21 | *.rtf diff=astextplain
22 | *.RTF diff=astextplain
23 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.sln.docstates
8 |
9 | # Build results
10 | [Dd]ebug/
11 | [Dd]ebugPublic/
12 | [Rr]elease/
13 | [Rr]eleases/
14 | x64/
15 | x86/
16 | build/
17 | bld/
18 | [Bb]in/
19 | [Oo]bj/
20 |
21 | # Roslyn cache directories
22 | *.ide/
23 |
24 | # MSTest test Results
25 | [Tt]est[Rr]esult*/
26 | [Bb]uild[Ll]og.*
27 |
28 | #NUNIT
29 | *.VisualState.xml
30 | TestResult.xml
31 |
32 | # Build Results of an ATL Project
33 | [Dd]ebugPS/
34 | [Rr]eleasePS/
35 | dlldata.c
36 |
37 | *_i.c
38 | *_p.c
39 | *_i.h
40 | *.ilk
41 | *.meta
42 | *.obj
43 | *.pch
44 | *.pdb
45 | *.pgc
46 | *.pgd
47 | *.rsp
48 | *.sbr
49 | *.tlb
50 | *.tli
51 | *.tlh
52 | *.tmp
53 | *.tmp_proj
54 | *.log
55 | *.vspscc
56 | *.vssscc
57 | .builds
58 | *.pidb
59 | *.svclog
60 | *.scc
61 |
62 | # Chutzpah Test files
63 | _Chutzpah*
64 |
65 | # Visual C++ cache files
66 | ipch/
67 | *.aps
68 | *.ncb
69 | *.opensdf
70 | *.sdf
71 | *.cachefile
72 |
73 | # Visual Studio profiler
74 | *.psess
75 | *.vsp
76 | *.vspx
77 |
78 | # TFS 2012 Local Workspace
79 | $tf/
80 |
81 | # Guidance Automation Toolkit
82 | *.gpState
83 |
84 | # ReSharper is a .NET coding add-in
85 | _ReSharper*/
86 | *.[Rr]e[Ss]harper
87 | *.DotSettings.user
88 |
89 | # JustCode is a .NET coding addin-in
90 | .JustCode
91 |
92 | # TeamCity is a build add-in
93 | _TeamCity*
94 |
95 | # DotCover is a Code Coverage Tool
96 | *.dotCover
97 |
98 | # NCrunch
99 | _NCrunch_*
100 | .*crunch*.local.xml
101 |
102 | # MightyMoose
103 | *.mm.*
104 | AutoTest.Net/
105 |
106 | # Web workbench (sass)
107 | .sass-cache/
108 |
109 | # Installshield output folder
110 | [Ee]xpress/
111 |
112 | # DocProject is a documentation generator add-in
113 | DocProject/buildhelp/
114 | DocProject/Help/*.HxT
115 | DocProject/Help/*.HxC
116 | DocProject/Help/*.hhc
117 | DocProject/Help/*.hhk
118 | DocProject/Help/*.hhp
119 | DocProject/Help/Html2
120 | DocProject/Help/html
121 |
122 | # Click-Once directory
123 | publish/
124 |
125 | # Publish Web Output
126 | *.[Pp]ublish.xml
127 | *.azurePubxml
128 | # TODO: Comment the next line if you want to checkin your web deploy settings
129 | # but database connection strings (with potential passwords) will be unencrypted
130 | *.pubxml
131 | *.publishproj
132 |
133 | # NuGet Packages
134 | *.nupkg
135 | # The packages folder can be ignored because of Package Restore
136 | **/packages/*
137 | # except build/, which is used as an MSBuild target.
138 | !**/packages/build/
139 | # If using the old MSBuild-Integrated Package Restore, uncomment this:
140 | #!**/packages/repositories.config
141 |
142 | # Windows Azure Build Output
143 | csx/
144 | *.build.csdef
145 |
146 | # Windows Store app package directory
147 | AppPackages/
148 |
149 | # Others
150 | sql/
151 | *.Cache
152 | ClientBin/
153 | [Ss]tyle[Cc]op.*
154 | ~$*
155 | *~
156 | *.dbmdl
157 | *.dbproj.schemaview
158 | *.pfx
159 | *.publishsettings
160 | node_modules/
161 |
162 | # RIA/Silverlight projects
163 | Generated_Code/
164 |
165 | # Backup & report files from converting an old project file
166 | # to a newer Visual Studio version. Backup files are not needed,
167 | # because we have git ;-)
168 | _UpgradeReport_Files/
169 | Backup*/
170 | UpgradeLog*.XML
171 | UpgradeLog*.htm
172 |
173 | # SQL Server files
174 | *.mdf
175 | *.ldf
176 |
177 | # Business Intelligence projects
178 | *.rdl.data
179 | *.bim.layout
180 | *.bim_*.settings
181 |
182 | # Microsoft Fakes
183 | FakesAssemblies/
184 |
185 | # =========================
186 | # Operating System Files
187 | # =========================
188 |
189 | # OSX
190 | # =========================
191 |
192 | .DS_Store
193 | .AppleDouble
194 | .LSOverride
195 |
196 | # Icon must end with two \r
197 | Icon
198 |
199 | # Thumbnails
200 | ._*
201 |
202 | # Files that might appear on external disk
203 | .Spotlight-V100
204 | .Trashes
205 |
206 | # Directories potentially created on remote AFP share
207 | .AppleDB
208 | .AppleDesktop
209 | Network Trash Folder
210 | Temporary Items
211 | .apdisk
212 |
213 | # Windows
214 | # =========================
215 |
216 | # Windows image file caches
217 | Thumbs.db
218 | ehthumbs.db
219 |
220 | # Folder config file
221 | Desktop.ini
222 |
223 | # Recycle Bin used on file shares
224 | $RECYCLE.BIN/
225 |
226 | # Windows Installer files
227 | *.cab
228 | *.msi
229 | *.msm
230 | *.msp
231 |
--------------------------------------------------------------------------------
/CSGO-Analyzer.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Express 2013 for Windows Desktop
4 | VisualStudioVersion = 12.0.30501.0
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DemoParser-Core", "DemoParser\DemoParser-Core.csproj", "{ACB37CB0-3D65-4A1D-9740-8F635E3E822F}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csproj", "{CD0B93A7-CE91-4D0B-8D6B-671CED9FAB87}"
9 | EndProject
10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DemoParser-UI", "DemoParser-UI\DemoParser-UI.csproj", "{58E55DE0-72D2-4BE5-A8BB-9EBF0A4FCF61}"
11 | EndProject
12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DemoParser-Model", "DemoParser-Model\DemoParser-Model.csproj", "{2914F7C3-8329-4B3A-B170-C13044D6DE4F}"
13 | EndProject
14 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PacketInspector", "PacketInspector\PacketInspector.csproj", "{E1199FFC-F420-49A8-B22E-45A0BF556FDB}"
15 | EndProject
16 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DemoParser-Console", "DemoParser-Console\DemoParser-Console.csproj", "{5BB2FE69-7CB0-44B7-8B5A-D2DC1D05B748}"
17 | EndProject
18 | Global
19 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
20 | Debug|Any CPU = Debug|Any CPU
21 | Release|Any CPU = Release|Any CPU
22 | EndGlobalSection
23 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
24 | {ACB37CB0-3D65-4A1D-9740-8F635E3E822F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
25 | {ACB37CB0-3D65-4A1D-9740-8F635E3E822F}.Debug|Any CPU.Build.0 = Debug|Any CPU
26 | {ACB37CB0-3D65-4A1D-9740-8F635E3E822F}.Release|Any CPU.ActiveCfg = Release|Any CPU
27 | {ACB37CB0-3D65-4A1D-9740-8F635E3E822F}.Release|Any CPU.Build.0 = Release|Any CPU
28 | {CD0B93A7-CE91-4D0B-8D6B-671CED9FAB87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
29 | {CD0B93A7-CE91-4D0B-8D6B-671CED9FAB87}.Debug|Any CPU.Build.0 = Debug|Any CPU
30 | {CD0B93A7-CE91-4D0B-8D6B-671CED9FAB87}.Release|Any CPU.ActiveCfg = Release|Any CPU
31 | {CD0B93A7-CE91-4D0B-8D6B-671CED9FAB87}.Release|Any CPU.Build.0 = Release|Any CPU
32 | {58E55DE0-72D2-4BE5-A8BB-9EBF0A4FCF61}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
33 | {58E55DE0-72D2-4BE5-A8BB-9EBF0A4FCF61}.Debug|Any CPU.Build.0 = Debug|Any CPU
34 | {58E55DE0-72D2-4BE5-A8BB-9EBF0A4FCF61}.Release|Any CPU.ActiveCfg = Release|Any CPU
35 | {58E55DE0-72D2-4BE5-A8BB-9EBF0A4FCF61}.Release|Any CPU.Build.0 = Release|Any CPU
36 | {2914F7C3-8329-4B3A-B170-C13044D6DE4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
37 | {2914F7C3-8329-4B3A-B170-C13044D6DE4F}.Debug|Any CPU.Build.0 = Debug|Any CPU
38 | {2914F7C3-8329-4B3A-B170-C13044D6DE4F}.Release|Any CPU.ActiveCfg = Release|Any CPU
39 | {2914F7C3-8329-4B3A-B170-C13044D6DE4F}.Release|Any CPU.Build.0 = Release|Any CPU
40 | {E1199FFC-F420-49A8-B22E-45A0BF556FDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
41 | {E1199FFC-F420-49A8-B22E-45A0BF556FDB}.Debug|Any CPU.Build.0 = Debug|Any CPU
42 | {E1199FFC-F420-49A8-B22E-45A0BF556FDB}.Release|Any CPU.ActiveCfg = Release|Any CPU
43 | {E1199FFC-F420-49A8-B22E-45A0BF556FDB}.Release|Any CPU.Build.0 = Release|Any CPU
44 | {5BB2FE69-7CB0-44B7-8B5A-D2DC1D05B748}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
45 | {5BB2FE69-7CB0-44B7-8B5A-D2DC1D05B748}.Debug|Any CPU.Build.0 = Debug|Any CPU
46 | {5BB2FE69-7CB0-44B7-8B5A-D2DC1D05B748}.Release|Any CPU.ActiveCfg = Release|Any CPU
47 | {5BB2FE69-7CB0-44B7-8B5A-D2DC1D05B748}.Release|Any CPU.Build.0 = Release|Any CPU
48 | EndGlobalSection
49 | GlobalSection(SolutionProperties) = preSolution
50 | HideSolutionNode = FALSE
51 | EndGlobalSection
52 | EndGlobal
53 |
--------------------------------------------------------------------------------
/Common/Common.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {CD0B93A7-CE91-4D0B-8D6B-671CED9FAB87}
8 | Library
9 | Properties
10 | Common
11 | Common
12 | v4.5
13 | 512
14 |
15 |
16 | true
17 | full
18 | false
19 | bin\Debug\
20 | DEBUG;TRACE
21 | prompt
22 | 4
23 |
24 |
25 | pdbonly
26 | true
27 | bin\Release\
28 | TRACE
29 | prompt
30 | 4
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
53 |
--------------------------------------------------------------------------------
/Common/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("Common")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("Common")]
13 | [assembly: AssemblyCopyright("Copyright © 2014")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("8660cb70-f47a-44a9-bae1-4b3cd6687dd4")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/Common/Stringify.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Text;
3 |
4 | namespace Common
5 | {
6 | public abstract class Stringify
7 | {
8 | public override string ToString()
9 | {
10 | PropertyInfo[] propertyInfos = this.GetType().GetProperties();
11 |
12 | var sb = new StringBuilder();
13 |
14 | foreach (var info in propertyInfos)
15 | {
16 | sb.AppendLine(info.Name + ": " + info.GetValue(this, null).ToString());
17 | }
18 |
19 | return sb.ToString();
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/DemoParser-Console/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/DemoParser-Console/DemoParser-Console.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {5BB2FE69-7CB0-44B7-8B5A-D2DC1D05B748}
8 | Exe
9 | Properties
10 | DemoParser_Console
11 | DemoParser-Console
12 | v4.5
13 | 512
14 | publish\
15 | true
16 | Disk
17 | false
18 | Foreground
19 | 7
20 | Days
21 | false
22 | false
23 | true
24 | 0
25 | 1.0.0.%2a
26 | false
27 | false
28 | true
29 |
30 |
31 | AnyCPU
32 | true
33 | full
34 | false
35 | bin\Debug\
36 | DEBUG;TRACE
37 | prompt
38 | 4
39 |
40 |
41 | AnyCPU
42 | pdbonly
43 | true
44 | bin\Release\
45 | TRACE
46 | prompt
47 | 4
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | {cd0b93a7-ce91-4d0b-8d6b-671ced9fab87}
68 | Common
69 |
70 |
71 | {acb37cb0-3d65-4a1d-9740-8f635e3e822f}
72 | DemoParser-Core
73 |
74 |
75 |
76 |
77 | False
78 | Microsoft .NET Framework 4.5 %28x86 and x64%29
79 | true
80 |
81 |
82 | False
83 | .NET Framework 3.5 SP1 Client Profile
84 | false
85 |
86 |
87 | False
88 | .NET Framework 3.5 SP1
89 | false
90 |
91 |
92 |
93 |
100 |
--------------------------------------------------------------------------------
/DemoParser-Console/Program.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.IO;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace DemoParser_Console
10 | {
11 | class Program
12 | {
13 | static void Main(string[] args)
14 | {
15 | DateTime begin;
16 | DateTime end;
17 |
18 | Stream inputStream = new FileStream(args[0], FileMode.Open);
19 |
20 | Console.WriteLine("Parsing...");
21 |
22 | begin = DateTime.Now;
23 |
24 | DemoParser parser = new DemoParser(inputStream);
25 | parser.ParseDemo(true);
26 |
27 | end = DateTime.Now;
28 |
29 | Console.WriteLine(String.Format("Started: {0}", begin.ToString("HH:mm:ss.ffffff")));
30 | Console.WriteLine(String.Format("Finished: {0}", end.ToString("HH:mm:ss.ffffff")));
31 | Console.WriteLine(String.Format("\nTotal: {0}", (end - begin)));
32 |
33 | Console.ReadKey();
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/DemoParser-Console/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("DemoParser-Console")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("DemoParser-Console")]
13 | [assembly: AssemblyCopyright("Copyright © 2014")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("0174a68a-3200-4c36-a0c9-7c0c85eff85b")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/DemoParser-Model/DemoParser-Model.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {2914F7C3-8329-4B3A-B170-C13044D6DE4F}
8 | Library
9 | Properties
10 | DemoParser_Model
11 | DemoParser-Model
12 | v4.5
13 | 512
14 |
15 |
16 | true
17 | full
18 | false
19 | bin\Debug\
20 | DEBUG;TRACE
21 | prompt
22 | 4
23 |
24 |
25 | pdbonly
26 | true
27 | bin\Release\
28 | TRACE
29 | prompt
30 | 4
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | {cd0b93a7-ce91-4d0b-8d6b-671ced9fab87}
60 | Common
61 |
62 |
63 | {acb37cb0-3d65-4a1d-9740-8f635e3e822f}
64 | DemoParser-Core
65 |
66 |
67 |
68 |
75 |
--------------------------------------------------------------------------------
/DemoParser-Model/Frag.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DemoParser_Model
8 | {
9 | public class Frag
10 | {
11 | public Player Killer { get; set; }
12 | public Player Victim { get; set; }
13 | public Player Assist { get; set; }
14 | public bool Headshot { get; set; }
15 | public bool Penetrated { get; set; }
16 | public string Weapon { get; set; }
17 |
18 | public Frag() { }
19 |
20 | public Frag(Player killer, Player victim, bool headshot, bool penetrated, string weapon)
21 | {
22 | this.Killer = killer;
23 | this.Victim = victim;
24 | this.Headshot = headshot;
25 | this.Penetrated = penetrated;
26 | this.Weapon = weapon;
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/DemoParser-Model/Game.cs:
--------------------------------------------------------------------------------
1 | using Common;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace DemoParser_Model
9 | {
10 | public class Game : Stringify
11 | {
12 | public DateTime Date { get; set; }
13 | public string Map { get; set; }
14 | public float Duration { get; set; }
15 |
16 | public List Teams { get; set; }
17 | public List Players { get; set; }
18 | public List Frags { get; set; }
19 | public List Rounds { get; set; }
20 |
21 | public bool IsStarted { get; set; }
22 |
23 | public Game()
24 | {
25 | this.Teams = new List();
26 | this.Rounds = new List();
27 | this.Players = new List();
28 | this.Frags = new List();
29 |
30 | this.IsStarted = false;
31 | }
32 |
33 | public Game(DateTime date, string map, float duration) : this()
34 | {
35 | this.Date = date;
36 | this.Duration = duration;
37 | this.Map = map;
38 | }
39 |
40 | public Team GetTeam(int teamId)
41 | {
42 | return Teams.Find(t => t.Id == teamId);
43 | }
44 |
45 | public Player GetPlayer(long steamId)
46 | {
47 | return Players.Find(p => p.SteamId == steamId);
48 | }
49 |
50 | public void AddPlayer(Player player)
51 | {
52 | Player existingPlayer = GetPlayer(player.SteamId);
53 |
54 | if (existingPlayer == null)
55 | {
56 | Players.Add(player);
57 | }
58 | else
59 | {
60 | existingPlayer.Team = player.Team;
61 | }
62 | }
63 |
64 | public void AddTeam(Team team)
65 | {
66 | Team existingTeam = GetTeam(team.Id);
67 |
68 | if (existingTeam == null)
69 | Teams.Add(team);
70 | }
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/DemoParser-Model/Models/PlayerRatingData.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace DemoParser_Model.Models
3 | {
4 | public class PlayerRatingData
5 | {
6 | public int Kills { get; set; }
7 | public int Deaths { get; set; }
8 |
9 | public int _1K { get; set; }
10 | public int _2K { get; set; }
11 | public int _3K { get; set; }
12 | public int _4K { get; set; }
13 | public int _5K { get; set; }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/DemoParser-Model/Models/ScoreBoard.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DemoParser_Model.Models
8 | {
9 | public class ScoreBoard
10 | {
11 | private List lines;
12 |
13 | public ScoreBoard()
14 | {
15 | this.lines = new List();
16 | }
17 |
18 | public void AddLine(ScoreBoardLine line)
19 | {
20 | this.lines.Add(line);
21 | }
22 |
23 | public IReadOnlyList GetLines()
24 | {
25 | return lines;
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/DemoParser-Model/Models/ScoreBoardLine.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DemoParser_Model.Models
8 | {
9 | public class ScoreBoardLine
10 | {
11 | public string TeamName { get; set; }
12 | public string PlayerName { get; set; }
13 | public int Kills { get; set; }
14 | public int Assist { get; set; }
15 | public int Deaths { get; set; }
16 | //public int Score { get { return (2 * Kills + Assist); } } TODO compute CSGO Score (bomb plant/defuse)
17 | public int Mvp { get; set; }
18 | public int Headshot { get; set; }
19 | public double HSR { get { return Math.Round((double)Headshot / Kills, 2); } }
20 | public double KDR { get { return Math.Round((double)Kills / Deaths, 2); } }
21 | public int KDdiff { get { return Kills - Deaths; } }
22 | public int _1K { get; set; }
23 | public int _2K { get; set; }
24 | public int _3K { get; set; }
25 | public int _4K { get; set; }
26 | public int _5K { get; set; }
27 | //public int _1vX { get; set; }
28 | public double Rating { get; set; }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/DemoParser-Model/Observers/GameObserver.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core;
2 | using DemoParser_Core.Events;
3 | using System;
4 | using System.Linq;
5 |
6 | namespace DemoParser_Model.Observers
7 | {
8 | public class GameObserver : Observer
9 | {
10 | protected Game game;
11 |
12 | public GameObserver(DemoParser demoParser) : base(demoParser)
13 | {
14 | this.game = new Game();
15 |
16 | var eventsManager = parser.EventsManager;
17 |
18 | eventsManager.HeaderParsed += eventsManager_HeaderParsed;
19 | eventsManager.TeamParsed += eventsManager_TeamParsed;
20 | eventsManager.PlayerParsed += eventsManager_PlayerParsed;
21 |
22 | eventsManager.MatchStarted += eventsManager_MatchStarted;
23 | eventsManager.MatchEnded += eventsManager_MatchEnded;
24 | eventsManager.PlayerKilled += eventsManager_PlayerKilled;
25 | eventsManager.RoundStart += eventsManager_RoundStart;
26 | eventsManager.RoundMvp += eventsManager_RoundMvp;
27 | eventsManager.RoundEnd += eventsManager_RoundEnd;
28 |
29 | eventsManager.BombPlanted += eventsManager_BombPlanted;
30 | eventsManager.BombDefused += eventsManager_BombDefused;
31 | eventsManager.BombExploded += eventsManager_BombExploded;
32 | }
33 |
34 | protected virtual void eventsManager_BombExploded(object sender, BombEventArgs e)
35 | {
36 |
37 | }
38 |
39 | protected virtual void eventsManager_BombDefused(object sender, BombEventArgs e)
40 | {
41 |
42 | }
43 |
44 | protected virtual void eventsManager_BombPlanted(object sender, BombEventArgs e)
45 | {
46 |
47 | }
48 |
49 | protected virtual void eventsManager_PlayerParsed(object sender, PlayerParsedEventArgs e)
50 | {
51 | if (e.Player.Team != null)
52 | {
53 | Team team = game.GetTeam(e.Player.Team.Id);
54 | Player player = new Player(e.Player.Name, e.Player.SteamID, team);
55 |
56 | team.AddPlayer(player);
57 | game.AddPlayer(player);
58 | }
59 | else
60 | {
61 | Player player = new Player(e.Player.Name, e.Player.SteamID, null);
62 | game.AddPlayer(player);
63 | }
64 | }
65 |
66 | protected virtual void eventsManager_TeamParsed(object sender, TeamParsedEventArgs e)
67 | {
68 | Team team = new Team(e.Team.Name, e.Team.Flag);
69 | team.Id = e.Team.Id;
70 |
71 | game.AddTeam(team);
72 | }
73 |
74 | protected virtual void eventsManager_HeaderParsed(object sender, DemoParser_Core.Events.HeaderParsedEventArgs e)
75 | {
76 | game.Map = e.Header.MapName;
77 | game.Duration = e.Header.PlaybackTime;
78 | game.Date = DateTime.Now;
79 | }
80 |
81 | protected virtual void eventsManager_MatchStarted(object sender, MatchStartedEventArgs e)
82 | {
83 | game.IsStarted = true;
84 |
85 | game.Rounds.Clear();
86 | game.Rounds.Add(new Round());
87 | }
88 |
89 | protected virtual void eventsManager_MatchEnded(object sender, MatchEndedEventArgs e)
90 | {
91 |
92 | }
93 |
94 | protected virtual void eventsManager_RoundStart(object sender, RoundStartedEventArgs e)
95 | {
96 | if (game.IsStarted)
97 | {
98 | game.Rounds.Add(new Round());
99 | }
100 | }
101 |
102 | protected virtual void eventsManager_RoundEnd(object sender, RoundEndedEventArgs e)
103 | {
104 | if (game.IsStarted)
105 | {
106 | game.Rounds.Last().Winner = game.GetTeam(e.Team.Id);
107 | game.Rounds.Last().Reason = e.Reason;
108 | //game.Rounds.Last().Duration = e.
109 | }
110 | }
111 |
112 | protected virtual void eventsManager_RoundMvp(object sender, RoundMvpEventArgs e)
113 | {
114 | if (game.IsStarted)
115 | {
116 | game.Rounds.Last().Mvp = game.GetPlayer(e.Player.SteamID);
117 | game.Rounds.Last().Reason = e.Reason;
118 | }
119 | }
120 |
121 | protected virtual void eventsManager_PlayerKilled(object sender, PlayerKilledEventArgs e)
122 | {
123 | if (game.IsStarted)
124 | {
125 | Frag frag = new Frag();
126 | frag.Killer = game.GetPlayer(e.Killer.SteamID);
127 | frag.Victim = game.GetPlayer(e.Victim.SteamID);
128 | frag.Assist = (e.Assist != null) ? game.GetPlayer(e.Assist.SteamID) : null;
129 | frag.Headshot = e.Headshot;
130 | frag.Penetrated = (e.PenetratedObjects > 0) ? true : false;
131 | frag.Weapon = e.Weapon.OriginalString;
132 |
133 | game.Rounds.Last().Frags.Add(frag);
134 | game.GetPlayer(e.Killer.SteamID).Frags.Add(frag);
135 | game.Frags.Add(frag);
136 | }
137 | }
138 | }
139 | }
140 |
--------------------------------------------------------------------------------
/DemoParser-Model/Observers/Observer.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core;
2 |
3 | namespace DemoParser_Model.Observers
4 | {
5 | public abstract class Observer
6 | {
7 | protected DemoParser parser;
8 |
9 | public Observer(DemoParser demoParser)
10 | {
11 | this.parser = demoParser;
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/DemoParser-Model/Observers/ScoreboardObserver.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core;
2 | using DemoParser_Core.Events;
3 | using DemoParser_Model.Models;
4 | using DemoParser_Model.Services;
5 |
6 | namespace DemoParser_Model.Observers
7 | {
8 | public class ScoreboardObserver : GameObserver
9 | {
10 | private IScoreBoardService scoreBoardService = new ScoreBoardService();
11 |
12 | public ScoreBoard scoreBoard = new ScoreBoard();
13 |
14 | public ScoreboardObserver(DemoParser demoParser) : base(demoParser)
15 | {
16 |
17 | }
18 |
19 | protected override void eventsManager_MatchEnded(object sender, MatchEndedEventArgs e)
20 | {
21 | this.scoreBoard = scoreBoardService.GetScoreBoard(this.game);
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/DemoParser-Model/Player.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DemoParser_Model
8 | {
9 | public class Player
10 | {
11 | public string Name { get; set; }
12 | public long SteamId { get; set; } // Unique
13 | public Team Team { get; set; }
14 | public List Frags { get; set; }
15 |
16 | public Player(string name, long steamId, Team team)
17 | {
18 | this.Name = name;
19 | this.SteamId = steamId;
20 | this.Team = team;
21 | this.Frags = new List();
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/DemoParser-Model/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("DemoParser-Model")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("DemoParser-Model")]
13 | [assembly: AssemblyCopyright("Copyright © 2014")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("f05d4494-842d-493e-b8a1-6e2427a1aad7")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/DemoParser-Model/Round.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DemoParser_Model
8 | {
9 | public class Round
10 | {
11 | public float Duration { get; set; }
12 | public Team Winner { get; set; }
13 | public int Reason { get; set; }
14 | public Player Mvp { get; set; }
15 | public List Frags { get; set; }
16 |
17 | public Round()
18 | {
19 | this.Frags = new List();
20 | }
21 |
22 | public Round(float duration, Team winner, int reason, Player mvp) : this()
23 | {
24 | this.Duration = duration;
25 | this.Winner = winner;
26 | this.Reason = reason;
27 | this.Mvp = mvp;
28 | this.Frags = new List();
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/DemoParser-Model/Services/IRatingService.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Model.Models;
2 |
3 | namespace DemoParser_Model.Services
4 | {
5 | public interface IRatingService
6 | {
7 | double ComputeRating(int numberOfRounds, PlayerRatingData playerData);
8 |
9 | double ComputeRating(Game game, Player player);
10 |
11 | PlayerRatingData ComputeRatingData(Game game, Player player);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/DemoParser-Model/Services/IScoreBoardService.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Model.Models;
2 |
3 | namespace DemoParser_Model.Services
4 | {
5 | public interface IScoreBoardService
6 | {
7 | ScoreBoard GetScoreBoard(Game game); // OrderType : Team, KDR, Rating, ...
8 | ScoreBoardLine GetScoreBoardLine(Game game, Player player);
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/DemoParser-Model/Services/IScoreCalculatorService.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DemoParser_Model.Services
8 | {
9 | public interface IScoreCalculatorService
10 | {
11 | int ComputeScore(Game game, Player player);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/DemoParser-Model/Services/ISteamIdConverter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DemoParser_Model.Services
8 | {
9 | public interface ISteamIdConverter
10 | {
11 | long ConvertSteamId(String steamId);
12 | String ConvertSteamId(long steamId);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/DemoParser-Model/Services/RatingService.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Model.Models;
2 | using System;
3 | using System.Linq;
4 |
5 | namespace DemoParser_Model.Services
6 | {
7 | public class RatingService : IRatingService
8 | {
9 | public const double AVERAGE_KPR = 0.679; // (average kills per round)
10 | public const double AVERAGE_SPR = 0.317; // (average survived rounds per round)
11 | public const double AVERAGE_RMK = 1.277; // (average value calculated from rounds with multiple kills: (1K + 4*2K + 9*3K + 16*4K + 25*5K)/Rounds)
12 |
13 | public enum RatingMethod { HLTV_ORG, CSGO, BuRner };
14 |
15 | public double ComputeRating(int numberOfRounds, PlayerRatingData playerData, RatingMethod method)
16 | {
17 | switch (method)
18 | {
19 | case RatingMethod.HLTV_ORG: return ComputeRating(numberOfRounds, playerData);
20 | case RatingMethod.CSGO: throw new NotImplementedException(); // TODO (score in csgo scoreboard)
21 | case RatingMethod.BuRner: throw new NotImplementedException(); //TODO (assists, clutch)
22 | default: throw new ArgumentException();
23 | }
24 | }
25 |
26 | ///
27 | /// Compute rating of a player based on the rating formula by hltv.org
28 | ///
29 | ///
30 | ///
31 | ///
32 | public double ComputeRating(int numberOfRounds, PlayerRatingData playerData)
33 | {
34 | int Rounds = numberOfRounds;
35 |
36 | double KillRating = playerData.Kills / (double)Rounds / (double)AVERAGE_KPR; // Kills/Rounds/AverageKPR
37 | double SurvivalRating = (Rounds - playerData.Deaths) / (double)Rounds / (double)AVERAGE_SPR; // (Rounds-Deaths)/Rounds/AverageSPR
38 | double RoundsWithMultipleKillsRating = (playerData._1K + 4 * playerData._2K + 9 * playerData._3K + 16 * playerData._4K + 25 * playerData._5K) / (double)Rounds / (double)AVERAGE_RMK; // (1K + 4*2K + 9*3K + 16*4K + 25*5K)/Rounds/AverageRMK
39 |
40 | return Math.Round((KillRating + 0.7 * SurvivalRating + RoundsWithMultipleKillsRating) / 2.7, 3);
41 | }
42 |
43 | public double ComputeRating(Game game, Player player)
44 | {
45 | PlayerRatingData playerData = ComputeRatingData(game, player);
46 |
47 | return ComputeRating(game.Rounds.Count, playerData);
48 | }
49 |
50 | public PlayerRatingData ComputeRatingData(Game game, Player player)
51 | {
52 | PlayerRatingData data = new PlayerRatingData();
53 |
54 | int fragByRound;
55 |
56 | foreach (Round round in game.Rounds)
57 | {
58 | fragByRound = 0;
59 |
60 | foreach (Frag frag in round.Frags)
61 | {
62 | if (frag.Killer.SteamId == player.SteamId)
63 | {
64 | data.Kills++;
65 | fragByRound++;
66 | }
67 |
68 | if (frag.Victim.SteamId == player.SteamId)
69 | {
70 | data.Deaths++;
71 | }
72 | }
73 |
74 | switch (fragByRound)
75 | {
76 | case 1: data._1K++; break;
77 | case 2: data._2K++; break;
78 | case 3: data._3K++; break;
79 | case 4: data._4K++; break;
80 | case 5: data._5K++; break;
81 | }
82 | }
83 |
84 | return data;
85 | }
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/DemoParser-Model/Services/ScoreBoardService.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Model.Models;
2 |
3 | namespace DemoParser_Model.Services
4 | {
5 | public class ScoreBoardService : IScoreBoardService
6 | {
7 | private IRatingService ratingService = new RatingService();
8 |
9 | public ScoreBoard GetScoreBoard(Game game) // OrderType : Team, KDR, Rating, ...
10 | {
11 | ScoreBoard scoreBoard = new ScoreBoard();
12 |
13 | foreach (Player player in game.Players)
14 | {
15 | if (player.Frags.Count == 0) //TODO change to IsSpectator
16 | continue;
17 |
18 | scoreBoard.AddLine(GetScoreBoardLine(game, player));
19 | }
20 |
21 | return scoreBoard;
22 | }
23 |
24 | public ScoreBoardLine GetScoreBoardLine(Game game, Player player)
25 | {
26 | ScoreBoardLine line = new ScoreBoardLine();
27 |
28 | line.PlayerName = player.Name;
29 | line.TeamName = (player.Team != null) ? player.Team.Name : string.Empty;
30 |
31 | foreach (Round round in game.Rounds)
32 | {
33 | foreach (Frag frag in round.Frags)
34 | {
35 | if (frag.Killer.SteamId == player.SteamId)
36 | {
37 | line.Kills++;
38 |
39 | if (frag.Headshot)
40 | {
41 | line.Headshot++;
42 | }
43 | }
44 |
45 | if (frag.Assist != null && frag.Assist.SteamId == player.SteamId)
46 | {
47 | line.Assist++;
48 | }
49 |
50 | if (frag.Victim.SteamId == player.SteamId)
51 | {
52 | line.Deaths++;
53 | }
54 | }
55 |
56 | if (round.Mvp != null && round.Mvp.SteamId == player.SteamId)
57 | {
58 | line.Mvp++;
59 | }
60 | }
61 |
62 | PlayerRatingData data = ratingService.ComputeRatingData(game, player);
63 | line._1K = data._1K;
64 | line._2K = data._2K;
65 | line._3K = data._3K;
66 | line._4K = data._4K;
67 | line._5K = data._5K;
68 |
69 | line.Rating = ratingService.ComputeRating(game.Rounds.Count, data);
70 |
71 | return line;
72 | }
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/DemoParser-Model/Services/ScoreCalculatorService.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DemoParser_Model.Services
8 | {
9 | public class ScoreCalculatorService : IScoreCalculatorService
10 | {
11 | public int ComputeScore(Game game, Player player)
12 | {
13 | /*
14 | 2 points for a bomb plant. (Terrorist Only)
15 | 2 points if that bomb explodes. (Terrorist Only)
16 | 2 points for a kill.
17 | 1 point for an assist.
18 | 5 points for defusing a bomb. (Counter-Terrorist Only)
19 | 2 points for rescuing a hostage. (Counter-Terrorist Only)
20 | -1 point for killing a teammate.
21 | -1 point for committing suicide.
22 | */
23 | return 0;
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/DemoParser-Model/Team.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DemoParser_Model
8 | {
9 | public class Team
10 | {
11 | public int Id { get; set; }
12 |
13 | public string Name { get; set; }
14 | public string Flag { get; set; }
15 | public int Score { get; set; }
16 | public int[] Scores { get; set; }
17 | public HashSet Players { get; set; }
18 |
19 | public Team()
20 | {
21 | this.Players = new HashSet();
22 | }
23 |
24 | public Team(string name, string flag) : this()
25 | {
26 | this.Name = name;
27 | this.Flag = flag;
28 | this.Score = 0;
29 | }
30 |
31 | public void AddPlayer(Player player)
32 | {
33 | if (!Players.Contains(player))
34 | Players.Add(player);
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/DemoParser-UI/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/DemoParser-UI/App.xaml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/DemoParser-UI/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Configuration;
4 | using System.Data;
5 | using System.Linq;
6 | using System.Threading.Tasks;
7 | using System.Windows;
8 |
9 | namespace demoinfogo_ui
10 | {
11 | ///
12 | /// Interaction logic for App.xaml
13 | ///
14 | public partial class App : Application
15 | {
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/DemoParser-UI/MainWindow.xaml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/DemoParser-UI/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Resources;
3 | using System.Runtime.CompilerServices;
4 | using System.Runtime.InteropServices;
5 | using System.Windows;
6 |
7 | // General Information about an assembly is controlled through the following
8 | // set of attributes. Change these attribute values to modify the information
9 | // associated with an assembly.
10 | [assembly: AssemblyTitle("DemoParser-UI")]
11 | [assembly: AssemblyDescription("")]
12 | [assembly: AssemblyConfiguration("")]
13 | [assembly: AssemblyCompany("")]
14 | [assembly: AssemblyProduct("DemoParser-UI")]
15 | [assembly: AssemblyCopyright("Copyright © 2014")]
16 | [assembly: AssemblyTrademark("")]
17 | [assembly: AssemblyCulture("")]
18 |
19 | // Setting ComVisible to false makes the types in this assembly not visible
20 | // to COM components. If you need to access a type in this assembly from
21 | // COM, set the ComVisible attribute to true on that type.
22 | [assembly: ComVisible(false)]
23 |
24 | //In order to begin building localizable applications, set
25 | //CultureYouAreCodingWith in your .csproj file
26 | //inside a . For example, if you are using US english
27 | //in your source files, set the to en-US. Then uncomment
28 | //the NeutralResourceLanguage attribute below. Update the "en-US" in
29 | //the line below to match the UICulture setting in the project file.
30 |
31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
32 |
33 |
34 | [assembly: ThemeInfo(
35 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
36 | //(used if a resource is not found in the page,
37 | // or application resource dictionaries)
38 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
39 | //(used if a resource is not found in the page,
40 | // app, or any theme specific resource dictionaries)
41 | )]
42 |
43 |
44 | // Version information for an assembly consists of the following four values:
45 | //
46 | // Major Version
47 | // Minor Version
48 | // Build Number
49 | // Revision
50 | //
51 | // You can specify all the values or you can default the Build and Revision Numbers
52 | // by using the '*' as shown below:
53 | // [assembly: AssemblyVersion("1.0.*")]
54 | [assembly: AssemblyVersion("1.0.0.0")]
55 | [assembly: AssemblyFileVersion("1.0.0.0")]
56 |
--------------------------------------------------------------------------------
/DemoParser-UI/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.18444
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace DemoParser_UI.Properties
12 | {
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources
26 | {
27 |
28 | private static global::System.Resources.ResourceManager resourceMan;
29 |
30 | private static global::System.Globalization.CultureInfo resourceCulture;
31 |
32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
33 | internal Resources()
34 | {
35 | }
36 |
37 | ///
38 | /// Returns the cached ResourceManager instance used by this class.
39 | ///
40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
41 | internal static global::System.Resources.ResourceManager ResourceManager
42 | {
43 | get
44 | {
45 | if ((resourceMan == null))
46 | {
47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DemoParser_UI.Properties.Resources", typeof(Resources).Assembly);
48 | resourceMan = temp;
49 | }
50 | return resourceMan;
51 | }
52 | }
53 |
54 | ///
55 | /// Overrides the current thread's CurrentUICulture property for all
56 | /// resource lookups using this strongly typed resource class.
57 | ///
58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
59 | internal static global::System.Globalization.CultureInfo Culture
60 | {
61 | get
62 | {
63 | return resourceCulture;
64 | }
65 | set
66 | {
67 | resourceCulture = value;
68 | }
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/DemoParser-UI/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.18444
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace DemoParser_UI.Properties
12 | {
13 |
14 |
15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
18 | {
19 |
20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
21 |
22 | public static Settings Default
23 | {
24 | get
25 | {
26 | return defaultInstance;
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/DemoParser-UI/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AD.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AF.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AF.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AI.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AL.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AN.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AO.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AQ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AQ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AS.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AT.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AU.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AU.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AW.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AW.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AX.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/AZ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/AZ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BA.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BB.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BD.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BF.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BF.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BH.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BH.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BI.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BJ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BJ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BL.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BN.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BO.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BS.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BT.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BW.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BW.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BY.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/BZ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/BZ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CA.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CC.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CD.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CF.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CF.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CH.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CH.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CI.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CK.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CK.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CL.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CN.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CO.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CU.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CU.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CV.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CV.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CW.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CW.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CX.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CY.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/CZ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/CZ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/DE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/DE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/DJ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/DJ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/DK.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/DK.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/DM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/DM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/DO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/DO.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/DZ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/DZ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/EC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/EC.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/EE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/EE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/EG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/EG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/EH.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/EH.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/ER.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/ER.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/ES.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/ES.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/ET.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/ET.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/EU.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/EU.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/FI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/FI.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/FJ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/FJ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/FK.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/FK.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/FM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/FM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/FO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/FO.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/FR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/FR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GA.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GB.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GD.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GH.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GH.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GI.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GL.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GN.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GQ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GQ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GS.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GT.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GU.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GU.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GW.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GW.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/GY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/GY.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/HK.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/HK.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/HN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/HN.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/HR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/HR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/HT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/HT.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/HU.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/HU.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/IC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/IC.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/ID.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/ID.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/IE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/IE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/IL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/IL.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/IM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/IM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/IN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/IN.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/IQ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/IQ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/IR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/IR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/IS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/IS.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/IT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/IT.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/JE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/JE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/JM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/JM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/JO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/JO.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/JP.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/JP.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/KE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/KE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/KG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/KG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/KH.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/KH.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/KI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/KI.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/KM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/KM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/KN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/KN.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/KP.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/KP.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/KR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/KR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/KW.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/KW.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/KY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/KY.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/KZ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/KZ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/LA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/LA.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/LB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/LB.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/LC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/LC.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/LI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/LI.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/LK.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/LK.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/LR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/LR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/LS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/LS.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/LT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/LT.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/LU.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/LU.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/LV.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/LV.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/LY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/LY.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MA.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MC.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MD.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/ME.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/ME.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MF.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MF.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MH.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MH.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MK.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MK.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/ML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/ML.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MN.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MO.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MP.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MP.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MQ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MQ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MS.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MT.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MU.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MU.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MV.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MV.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MW.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MW.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MX.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MY.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/MZ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/MZ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/NA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/NA.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/NC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/NC.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/NE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/NE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/NF.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/NF.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/NG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/NG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/NI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/NI.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/NL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/NL.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/NO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/NO.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/NP.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/NP.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/NR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/NR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/NU.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/NU.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/NZ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/NZ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/OM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/OM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PA.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PF.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PF.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PH.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PH.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PK.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PK.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PL.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PN.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PS.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PT.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PW.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PW.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/PY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/PY.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/QA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/QA.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/RO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/RO.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/RS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/RS.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/RU.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/RU.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/RW.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/RW.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SA.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SB.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SC.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SD.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SH.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SH.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SI.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SK.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SK.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SL.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SN.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SO.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SS.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/ST.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/ST.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SV.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SV.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SY.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/SZ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/SZ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TC.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TD.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TF.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TF.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TH.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TH.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TJ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TJ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TK.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TK.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TL.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TN.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TO.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TR.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TT.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TV.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TV.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TW.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TW.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/TZ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/TZ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/UA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/UA.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/UG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/UG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/US.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/US.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/UY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/UY.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/UZ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/UZ.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/VA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/VA.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/VC.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/VC.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/VE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/VE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/VG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/VG.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/VI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/VI.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/VN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/VN.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/VU.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/VU.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/WF.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/WF.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/WS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/WS.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/YE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/YE.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/YT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/YT.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/ZA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/ZA.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/ZM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/ZM.png
--------------------------------------------------------------------------------
/DemoParser-UI/Resources/Flags/ZW.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CSGO-Analysis/CSGO-Analyzer/ec22c311f81bc6ab3bed477e860033ed5fbcce6f/DemoParser-UI/Resources/Flags/ZW.png
--------------------------------------------------------------------------------
/DemoParser/DataTables/SendTable.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 | using System.Diagnostics;
8 |
9 | namespace DemoParser_Core.DataTables
10 | {
11 | class SendTable
12 | {
13 | List properties = new List();
14 | public List Properties
15 | {
16 | get { return properties; }
17 | }
18 |
19 | public string Name { get; set; }
20 |
21 | public SendTable (Messages.CSVCMsg_SendTable dataTable)
22 | {
23 | Parse (dataTable);
24 | }
25 |
26 | private void Parse (Messages.CSVCMsg_SendTable dataTable)
27 | {
28 | this.Name = dataTable.net_table_name;
29 |
30 | foreach (var prop in dataTable.props) {
31 | SendTableProperty property = new SendTableProperty () {
32 | DataTableName = prop.dt_name,
33 | HighValue = prop.high_value,
34 | LowValue = prop.low_value,
35 | Name = prop.var_name,
36 | NumberOfBits = prop.num_bits,
37 | NumberOfElements = prop.num_elements,
38 | Priority = prop.priority,
39 | RawFlags = prop.flags,
40 | RawType = prop.type
41 | };
42 |
43 | properties.Add (property);
44 | }
45 | }
46 | }
47 |
48 |
49 | }
50 |
51 |
--------------------------------------------------------------------------------
/DemoParser/DataTables/SendTableProperty.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace DemoParser_Core.DataTables
4 | {
5 | public class SendTableProperty
6 | {
7 | public SendPropertyFlags Flags { get { return (SendPropertyFlags)RawFlags; } }
8 |
9 | public int RawFlags { get; set; }
10 |
11 | public string Name { get; set; }
12 |
13 | public string DataTableName { get; set; }
14 |
15 | public float LowValue { get; set; }
16 |
17 | public float HighValue { get; set; }
18 |
19 | public int NumberOfBits { get; set; }
20 |
21 | public int NumberOfElements { get; set; }
22 |
23 | public int Priority { get; set; }
24 |
25 | public int RawType { get; set; }
26 |
27 | public SendPropertyType Type {
28 | get {
29 | return (SendPropertyType)RawType;
30 | }
31 | }
32 | }
33 |
34 | public enum SendPropertyType
35 | {
36 | Int = 0,
37 | Float = 1,
38 | Vector = 2,
39 | VectorXY = 3,
40 | String = 4,
41 | Array = 5,
42 | DataTable = 6,
43 | Int64 = 7,
44 | };
45 |
46 |
47 | [Flags]
48 | public enum SendPropertyFlags
49 | {
50 | ///
51 | /// Unsigned integer data.
52 | ///
53 | Unsigned = (1 << 0),
54 | ///
55 | /// If this is set, the float/vector is treated like a world coordinate.
56 | /// Note that the bit count is ignored in this case.
57 | ///
58 | Coord = (1 << 1),
59 | ///
60 | /// For floating point, don't scale into range, just take value as is
61 | ///
62 | NoScale = (1 << 2),
63 | ///
64 | /// For floating point, limit high value to range minus one bit unit
65 | ///
66 | RoundDown = (1 << 3),
67 | ///
68 | /// For floating point, limit low value to range minus one bit unit
69 | ///
70 | RoundUp = (1 << 4),
71 | ///
72 | /// If this is set, the vector is treated like a normal (only valid for vectors)
73 | ///
74 | Normal = (1 << 5),
75 | ///
76 | /// This is an exclude prop (not excludED, but it points at another prop to be excluded).
77 | ///
78 | Exclude = (1 << 6),
79 | ///
80 | /// Use XYZ/Exponent encoding for vectors.
81 | ///
82 | XYZE = (1 << 7),
83 | ///
84 | /// This tells us that the property is inside an array, so it shouldn't be put into the
85 | /// flattened property list. Its array will point at it when it needs to.
86 | ///
87 | InsideArray = (1 << 8),
88 | ///
89 | /// Set for datatable props using one of the default datatable proxies like
90 | /// SendProxy_DataTableToDataTable that always send the data to all clients.
91 | ///
92 | ProxyAlwaysYes = (1 << 9),
93 | ///
94 | /// Set automatically if SPROP_VECTORELEM is used.
95 | ///
96 | IsVectorElement = (1 << 10),
97 | ///
98 | /// Set automatically if it's a datatable with an offset of 0 that doesn't change the pointer
99 | /// (ie: for all automatically-chained base classes).
100 | /// In this case, it can get rid of this SendPropDataTable altogether and spare the
101 | /// trouble of walking the hierarchy more than necessary.
102 | ///
103 | Collapsible = (1 << 11),
104 | ///
105 | /// Like SPROP_COORD, but special handling for multiplayer games
106 | ///
107 | CoordMp = (1 << 12),
108 | ///
109 | /// Like SPROP_COORD, but special handling for multiplayer games where the fractional component only gets a 3 bits instead of 5
110 | ///
111 | CoordMpLowPrecision = (1 << 13),
112 | ///
113 | /// SPROP_COORD_MP, but coordinates are rounded to integral boundaries
114 | ///
115 | CoordMpIntegral = (1 << 14),
116 |
117 | ///
118 | /// Like SPROP_COORD, but special encoding for cell coordinates that can't be negative, bit count indicate maximum value
119 | ///
120 | CellCoord = (1 << 15),
121 |
122 | ///
123 | /// Like SPROP_CELL_COORD, but special handling where the fractional component only gets a 3 bits instead of 5
124 | ///
125 | CellCoordLowPrecision = (1 << 16),
126 |
127 | ///
128 | /// SPROP_CELL_COORD, but coordinates are rounded to integral boundaries
129 | ///
130 | CellCoordIntegral = (1 << 17),
131 |
132 | ///
133 | /// this is an often changed field, moved to head of sendtable so it gets a small index
134 | ///
135 | ChangesOften = (1 << 18),
136 |
137 | ///
138 | /// use var int encoded (google protobuf style), note you want to include SPROP_UNSIGNED if needed, its more efficient
139 | ///
140 | VarInt = (1 << 19)
141 | }
142 | }
143 |
144 |
--------------------------------------------------------------------------------
/DemoParser/DataTables/ServerClass.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core.Messages;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace DemoParser_Core.DataTables
9 | {
10 | class ServerClass
11 | {
12 | public int ClassID;
13 | public int DataTableID;
14 | public string Name;
15 | public string DTName;
16 |
17 | public List flattenedProps = new List();
18 |
19 | public override string ToString()
20 | {
21 | return Name + "|" + DTName;
22 | }
23 | }
24 |
25 | public class FlattenedPropEntry
26 | {
27 | public SendTableProperty Prop { get; private set; }
28 | public SendTableProperty ArrayElementProp { get; private set; }
29 |
30 | public FlattenedPropEntry(SendTableProperty prop, SendTableProperty arrayElementProp)
31 | {
32 | this.Prop = prop;
33 | this.ArrayElementProp = arrayElementProp;
34 | }
35 |
36 | };
37 |
38 | class ExcludeEntry
39 | {
40 | public ExcludeEntry( string varName, string dtName, string excludingDT )
41 | {
42 | VarName = varName;
43 | DTName = dtName;
44 | ExcludingDT = excludingDT;
45 | }
46 |
47 | public string VarName { get; private set; }
48 | public string DTName { get; private set; }
49 | public string ExcludingDT { get; private set; }
50 | }
51 |
52 | }
53 |
--------------------------------------------------------------------------------
/DemoParser/DemoHeader.cs:
--------------------------------------------------------------------------------
1 | using Common;
2 | using System;
3 | using System.IO;
4 |
5 | namespace DemoParser_Core
6 | {
7 | public class DemoHeader : Stringify
8 | {
9 | const int MAX_OSPATH = 260;
10 |
11 | public string Filestamp { get; private set; } // Should be HL2DEMO
12 | public int DemoProtocol { get; private set; } // Should be DEMO_PROTOCOL
13 | public int NetworkProtocol { get; private set; } // Should be PROTOCOL_VERSION
14 | public string ServerName { get; private set; } // Name of server
15 | public string ClientName { get; private set; } // Name of client who recorded the game
16 | public string MapName { get; private set; } // Name of map
17 | public string GameDirectory { get; private set; } // Name of game directory (com_gamedir)
18 | public float PlaybackTime { get; private set; } // Time of track (in seconds)
19 | public int PlaybackTicks { get; private set; } // # of ticks in track
20 | public int PlaybackFrames { get; private set; } // # of frames in track
21 | public int SignonLength { get; private set; } // length of sigondata in bytes
22 |
23 | public float TickRate
24 | {
25 | get { return this.PlaybackTicks / this.PlaybackTime; }
26 | }
27 |
28 | public float TickTime
29 | {
30 | get { return this.PlaybackTime / this.PlaybackTicks; }
31 | }
32 |
33 | public double FrameRate
34 | {
35 | get { return Math.Round((double)this.PlaybackFrames / this.PlaybackTime); }
36 | }
37 |
38 | public float FrameTime
39 | {
40 | get { return this.PlaybackTime / this.PlaybackFrames; }
41 | }
42 |
43 | public static DemoHeader ParseFrom(BinaryReader reader)
44 | {
45 | return new DemoHeader()
46 | {
47 | Filestamp = reader.ReadCString(8),
48 | DemoProtocol = reader.ReadInt32(),
49 | NetworkProtocol = reader.ReadInt32(),
50 | ServerName = reader.ReadCString(MAX_OSPATH),
51 | ClientName = reader.ReadCString(MAX_OSPATH),
52 | MapName = reader.ReadCString(MAX_OSPATH),
53 | GameDirectory = reader.ReadCString(MAX_OSPATH),
54 | PlaybackTime = reader.ReadSingle(),
55 | PlaybackTicks = reader.ReadInt32(),
56 | PlaybackFrames = reader.ReadInt32(),
57 | SignonLength = reader.ReadInt32(),
58 | };
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/DemoParser/DemoMessageType.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 |
6 | namespace DemoParser_Core
7 | {
8 | ///
9 | /// From hl2sdk-csgo/public/demofile/demoformat.h
10 | ///
11 | public enum DemoMessageType
12 | {
13 | ///
14 | /// it's a startup message, process as fast as possible
15 | ///
16 | Signon = 1,
17 |
18 | ///
19 | // it's a normal network packet that we stored off
20 | ///
21 | Packet,
22 |
23 | ///
24 | /// sync client clock to demo tick
25 | ///
26 | Synctick,
27 |
28 | ///
29 | /// Console Command
30 | ///
31 | ConsoleCommand,
32 |
33 | ///
34 | /// user input command
35 | ///
36 | UserCommand,
37 |
38 | ///
39 | /// network data tables
40 | ///
41 | DataTables,
42 |
43 | ///
44 | /// end of time.
45 | ///
46 | Stop,
47 |
48 | ///
49 | /// a blob of binary data understood by a callback function
50 | ///
51 | CustomData,
52 |
53 | ///
54 | /// network string tables
55 | ///
56 | StringTables,
57 |
58 | ///
59 | /// Last Command
60 | ///
61 | LastCommand = StringTables,
62 |
63 | ///
64 | /// First Command
65 | ///
66 | FirstCommand = Signon
67 | };
68 | }
69 |
--------------------------------------------------------------------------------
/DemoParser/DemoParser-Core.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {ACB37CB0-3D65-4A1D-9740-8F635E3E822F}
8 | Library
9 | Properties
10 | DemoParser_Core
11 | DemoParser-Core
12 | v4.5
13 | 512
14 |
15 |
16 | AnyCPU
17 | true
18 | full
19 | false
20 | bin\Debug\
21 | DEBUG;TRACE
22 | prompt
23 | 4
24 | true
25 | true
26 | false
27 |
28 |
29 | AnyCPU
30 | pdbonly
31 | true
32 | bin\Release\
33 | TRACE
34 | prompt
35 | 4
36 | true
37 | false
38 |
39 |
40 |
41 | ..\packages\protobuf-net.2.0.0.668\lib\net40\protobuf-net.dll
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 | {cd0b93a7-ce91-4d0b-8d6b-671ced9fab87}
91 | Common
92 |
93 |
94 |
95 |
102 |
--------------------------------------------------------------------------------
/DemoParser/DemoParser.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core.DataTables;
2 | using DemoParser_Core.Entities;
3 | using DemoParser_Core.Events;
4 | using DemoParser_Core.Messages;
5 | using DemoParser_Core.Packets;
6 | using DemoParser_Core.StringTables;
7 | using System;
8 | using System.Collections.Generic;
9 | using System.IO;
10 | using System.Linq;
11 |
12 | namespace DemoParser_Core
13 | {
14 | public class DemoParser
15 | {
16 | internal const string DEMO_HEADER_ID = "HL2DEMO";
17 | internal const int DEMO_PROTOCOL = 4;
18 |
19 |
20 | private BinaryReader reader;
21 |
22 | internal DemoPacketParser DemoPacketsParser;
23 | internal DataTableParser DataTablesParser;
24 | internal StringTableParser StringTablesParser;
25 |
26 | public EventsManager EventsManager { get; private set; }
27 |
28 | public DemoHeader Header { get; private set; }
29 |
30 | internal Dictionary entities = new Dictionary(); // Key = entityId
31 | internal Dictionary teams = new Dictionary(3); // Key = teamNum
32 | internal Dictionary players = new Dictionary(16); // Key = userId
33 |
34 | public IReadOnlyList Teams { get { return teams.Values.ToList(); } }
35 | public IReadOnlyList Players { get { return players.Values.ToList(); } }
36 |
37 | public int CurrentTick { get; private set; }
38 | public double CurrentTime { get { return (Header != null) ? (this.CurrentTick * Header.TickTime) : 0; } }
39 |
40 |
41 | public DemoParser(Stream input)
42 | {
43 | reader = new BinaryReader(input);
44 |
45 | DemoPacketsParser = new DemoPacketParser();
46 | DataTablesParser = new DataTableParser();
47 | StringTablesParser = new StringTableParser();
48 |
49 | EventsManager = new EventsManager();
50 | }
51 |
52 | public void ParseDemo(bool fullParse)
53 | {
54 | ParseHeader();
55 |
56 | if (fullParse)
57 | {
58 | while (ParseNextTick()) { }
59 | }
60 | }
61 |
62 | private void ParseHeader()
63 | {
64 | var header = DemoHeader.ParseFrom(reader);
65 |
66 | if (header.Filestamp != DEMO_HEADER_ID)
67 | throw new NotSupportedException("Invalid file type - expecting " + DEMO_HEADER_ID);
68 |
69 | if (header.DemoProtocol != DEMO_PROTOCOL)
70 | throw new NotSupportedException("Invalid demo protocol - expecting " + DEMO_PROTOCOL);
71 |
72 | Header = header;
73 |
74 | this.EventsManager.RaiseHeaderParsed(new HeaderParsedEventArgs(header));
75 | }
76 |
77 | public bool ParseNextTick()
78 | {
79 | DemoMessageType messageType = (DemoMessageType)reader.ReadByte();
80 |
81 | this.CurrentTick = reader.ReadInt32();
82 | reader.ReadByte(); // player slot
83 |
84 | switch (messageType)
85 | {
86 | case DemoMessageType.Synctick:
87 | break;
88 | case DemoMessageType.Stop:
89 | return false;
90 | case DemoMessageType.ConsoleCommand:
91 | using (var volvo = reader.ReadVolvoPacket())
92 | break;
93 | case DemoMessageType.DataTables:
94 | using (var volvo = reader.ReadVolvoPacket())
95 | DataTablesParser.ParsePacket(volvo);
96 | break;
97 | case DemoMessageType.StringTables:
98 | using (var volvo = reader.ReadVolvoPacket())
99 | StringTablesParser.ParsePacket(volvo, this);
100 | break;
101 | case DemoMessageType.UserCommand:
102 | reader.ReadInt32();
103 | using (var volvo = reader.ReadVolvoPacket())
104 | break;
105 | case DemoMessageType.Signon:
106 | case DemoMessageType.Packet:
107 | CommandInfo.Parse(reader);
108 | reader.ReadInt32(); // SeqNrIn
109 | reader.ReadInt32(); // SeqNrOut
110 |
111 | using (var volvo = reader.ReadVolvoPacket())
112 | DemoPacketsParser.ParsePacket(volvo, this);
113 | break;
114 | default:
115 | throw new Exception("Can't handle MessageType " + messageType);
116 | }
117 |
118 | this.EventsManager.RaiseTickDone();
119 |
120 | return true;
121 | }
122 | }
123 | }
124 |
--------------------------------------------------------------------------------
/DemoParser/Entities/Player.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core.Packets;
2 | using System.ComponentModel;
3 | using System.Runtime.CompilerServices;
4 |
5 | namespace DemoParser_Core.Entities
6 | {
7 | public class Player
8 | {
9 | internal Entity Entity;
10 |
11 | public string Name { get; internal set; }
12 | public int UserID { get; internal set; }
13 | public long SteamID { get; internal set; }
14 | public Team Team { get; internal set; }
15 |
16 | public int Money { get; internal set; }
17 | public int Health { get; internal set; }
18 | public int Armor { get; internal set; }
19 | public bool HasHelmet { get; internal set; }
20 | public bool HasDefuseKit { get; internal set; }
21 |
22 | public Vector Position { get; internal set; }
23 | public Vector LastAlivePosition { get; internal set; }
24 | public Vector Velocity { get; internal set; }
25 |
26 | public float ViewDirectionX { get; internal set; }
27 | public float ViewDirectionY { get; internal set; }
28 |
29 | public bool IsAlive
30 | {
31 | get { return Health > 0; }
32 | }
33 |
34 | internal Player(Entity entity)
35 | {
36 | this.Entity = entity;
37 | }
38 |
39 | internal Player(PlayerInfo info)
40 | {
41 | Name = info.Name;
42 | UserID = info.UserID;
43 | SteamID = info.XUID;
44 | }
45 |
46 | internal void Update(PlayerInfo info)
47 | {
48 | Name = info.Name;
49 | }
50 |
51 | internal void Update(Entity entity)
52 | {
53 | this.Entity = entity;
54 |
55 | if (entity.Properties.ContainsKey("m_vecOrigin"))
56 | {
57 | this.Position = (Vector)entity.Properties["m_vecOrigin"];
58 | this.Position.Z = (float)entity.Properties.GetValueOrDefault("m_vecOrigin[2]", 0f);
59 |
60 | this.Health = (int)entity.Properties.GetValueOrDefault("m_iHealth", -1);
61 | this.Armor = (int)entity.Properties.GetValueOrDefault("m_ArmorValue", -1);
62 | this.HasDefuseKit = ((int)entity.Properties.GetValueOrDefault("m_bHasDefuser", 0)) == 1;
63 | this.HasHelmet = ((int)entity.Properties.GetValueOrDefault("m_bHasHelmet", 0)) == 1;
64 |
65 | this.Money = (int)entity.Properties.GetValueOrDefault("m_iAccount", 0);
66 |
67 | this.Velocity = new Vector();
68 | this.Velocity.X = (float)entity.Properties.GetValueOrDefault("m_vecVelocity[0]", 0f);
69 | this.Velocity.Y = (float)entity.Properties.GetValueOrDefault("m_vecVelocity[1]", 0f);
70 | this.Velocity.Z = (float)entity.Properties.GetValueOrDefault("m_vecVelocity[2]", 0f);
71 |
72 | this.ViewDirectionX = (float)entity.Properties.GetValueOrDefault("m_angEyeAngles[1]", 0f);
73 | this.ViewDirectionY = (float)entity.Properties.GetValueOrDefault("m_angEyeAngles[0]", 0f);
74 |
75 | if (this.IsAlive)
76 | {
77 | this.LastAlivePosition = this.Position;
78 | }
79 | }
80 | }
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/DemoParser/Entities/Team.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core.Packets;
2 | using System;
3 |
4 | namespace DemoParser_Core.Entities
5 | {
6 | public class Team : IComparable
7 | {
8 | internal Entity Entity;
9 |
10 | public int Id { get { return Entity.ID; } }
11 |
12 | public int Num { get; internal set; }
13 |
14 | public string Name { get; internal set; }
15 |
16 | ///
17 | /// ISO Alpha 2 country flag
18 | /// e.g. US = United States
19 | /// http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
20 | ///
21 | public string Flag { get; internal set; }
22 |
23 | public int Score { get; internal set; }
24 | public int ScoreFirstHalf { get; internal set; }
25 | public int ScoreSecondHalf { get; internal set; }
26 | public int ScoreOvertime { get; internal set; }
27 |
28 | public int[] player_array { get; internal set; }
29 |
30 | public TeamSide Side { get { return (TeamSide)Num; } }
31 |
32 | internal Team(Entity entity)
33 | {
34 | this.Entity = entity;
35 |
36 | if (entity.Properties.ContainsKey("m_iTeamNum"))
37 | {
38 | this.Num = (int)entity.Properties["m_iTeamNum"];
39 |
40 | if (entity.Properties.ContainsKey("m_szTeamname"))
41 | {
42 | this.Name = (string)entity.Properties.GetValueOrDefault("m_szClanTeamname", (string)entity.Properties["m_szTeamname"]);
43 | this.Flag = (string)entity.Properties.GetValueOrDefault("m_szTeamFlagImage", string.Empty);
44 | //this.player_array = (int[])entity.Properties.GetValueOrDefault>("\"player_array\"", new int[5]);
45 | }
46 | }
47 | }
48 |
49 | internal void Update(Entity entity)
50 | {
51 | if (entity.Properties.ContainsKey("m_iTeamNum"))
52 | {
53 | this.Num = (int)entity.Properties["m_iTeamNum"];
54 |
55 | if (entity.Properties.ContainsKey("m_szTeamname"))
56 | {
57 | this.Name = (string)entity.Properties.GetValueOrDefault("m_szClanTeamname", (string)entity.Properties["m_szTeamname"]);
58 | this.Flag = (string)entity.Properties.GetValueOrDefault("m_szTeamFlagImage", string.Empty);
59 | //this.player_array = (int[])entity.Properties.GetValueOrDefault("\"player_array\"", new int[5]);
60 | }
61 | }
62 |
63 | this.Score = (int)entity.Properties.GetValueOrDefault("m_scoreTotal", 0);
64 | this.ScoreFirstHalf = (int)entity.Properties.GetValueOrDefault("m_scoreFirstHalf", 0);
65 | this.ScoreSecondHalf = (int)entity.Properties.GetValueOrDefault("m_scoreSecondHalf", 0);
66 | this.ScoreOvertime = (int)entity.Properties.GetValueOrDefault("m_scoreOvertime", 0);
67 | }
68 |
69 | public override string ToString()
70 | {
71 | return Name;
72 | }
73 |
74 | public int CompareTo(object obj)
75 | {
76 | return Name.CompareTo(((Team)obj).Name);
77 | }
78 |
79 | public enum TeamSide
80 | {
81 | Spectator = 1,
82 | T = 2,
83 | CT = 3,
84 | }
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/DemoParser/Events/Events.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core.Entities;
2 | using System;
3 |
4 | namespace DemoParser_Core.Events
5 | {
6 | public abstract class GameEventArgs : EventArgs
7 | { }
8 |
9 | public class HeaderParsedEventArgs : EventArgs
10 | {
11 | public DemoHeader Header { get; private set; }
12 |
13 | public HeaderParsedEventArgs(DemoHeader header)
14 | {
15 | this.Header = header;
16 | }
17 | }
18 |
19 | public class TickDoneEventArgs : EventArgs
20 | { }
21 |
22 | public class TeamParsedEventArgs : EventArgs
23 | {
24 | public Team Team { get; internal set; }
25 |
26 | public TeamParsedEventArgs(Team team)
27 | {
28 | this.Team = team;
29 | }
30 | }
31 |
32 | public class TeamUpdateParsedEventArgs : EventArgs
33 | {
34 | public Team Team { get; internal set; }
35 |
36 | public TeamUpdateParsedEventArgs(Team team)
37 | {
38 | this.Team = team;
39 | }
40 | }
41 |
42 | public class PlayerParsedEventArgs : EventArgs
43 | {
44 | public Player Player { get; internal set; }
45 |
46 | public PlayerParsedEventArgs(Player player)
47 | {
48 | this.Player = player;
49 | }
50 | }
51 |
52 | public class PlayerUpdateParsedEventArgs : EventArgs
53 | {
54 | public Player Player { get; internal set; }
55 |
56 | public PlayerUpdateParsedEventArgs(Player player)
57 | {
58 | this.Player = player;
59 | }
60 | }
61 |
62 | public class MatchStartedEventArgs : EventArgs
63 | { }
64 |
65 | public class MatchEndedEventArgs : EventArgs
66 | { }
67 |
68 | public class PlayerChatEventArgs : EventArgs
69 | {
70 | public Player Player { get; internal set; }
71 | public bool TeamOnly { get; internal set; }
72 | public string Message { get; internal set; }
73 | }
74 |
75 | public class RoundStartedEventArgs : EventArgs
76 | { }
77 |
78 | public class RoundEndedEventArgs : EventArgs
79 | {
80 | public Team Team { get; internal set; }
81 | public int Reason { get; internal set; }
82 | public string Message { get; internal set; }
83 | }
84 |
85 | public class RoundOfficiallyEndedEventArgs : EventArgs
86 | { }
87 |
88 | public class RoundMvpEventArgs : EventArgs
89 | {
90 | public Player Player { get; internal set; }
91 | public int Reason { get; internal set; }
92 | }
93 |
94 | public class PlayerKilledEventArgs : EventArgs
95 | {
96 | public Player Victim { get; internal set; }
97 | public Player Killer { get; internal set; }
98 | public Player Assist { get; internal set; }
99 | public Equipment Weapon { get; internal set; }
100 | public bool Headshot { get; internal set; }
101 | public int PenetratedObjects { get; internal set; }
102 | }
103 |
104 | public class BombEventArgs : EventArgs
105 | {
106 | public Player Player { get; internal set; }
107 | public Int32 BombSite { get; internal set; }
108 | }
109 |
110 | public class WeaponFiredEventArgs : EventArgs
111 | {
112 | public Equipment Weapon { get; internal set; }
113 | public Player Player { get; internal set; }
114 | }
115 |
116 | public class NadeEventArgs : EventArgs
117 | {
118 | public Vector Position { get; internal set; }
119 | public EquipmentElement NadeType { get; internal set; }
120 | public Player ThrownBy { get; internal set; }
121 |
122 | internal NadeEventArgs ()
123 | {
124 |
125 | }
126 |
127 | internal NadeEventArgs (EquipmentElement type)
128 | {
129 | this.NadeType = type;
130 | }
131 | }
132 |
133 | public class FireEventArgs : NadeEventArgs
134 | {
135 | public FireEventArgs () : base(EquipmentElement.Incendiary)
136 | {
137 |
138 | }
139 | }
140 | public class SmokeEventArgs : NadeEventArgs
141 | {
142 | public SmokeEventArgs () : base(EquipmentElement.Smoke)
143 | {
144 |
145 | }
146 | }
147 | public class DecoyEventArgs : NadeEventArgs
148 | {
149 | public DecoyEventArgs () : base(EquipmentElement.Decoy)
150 | {
151 |
152 | }
153 | }
154 | public class FlashEventArgs : NadeEventArgs
155 | {
156 | public Player[] FlashedPlayers { get; internal set; }
157 |
158 | public FlashEventArgs () : base(EquipmentElement.Flash)
159 | {
160 |
161 | }
162 | }
163 | public class GrenadeEventArgs : NadeEventArgs
164 | {
165 | public GrenadeEventArgs () : base(EquipmentElement.HE)
166 | {
167 |
168 | }
169 | }
170 | }
171 |
172 |
--------------------------------------------------------------------------------
/DemoParser/Helper.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core.DataTables;
2 | using DemoParser_Core.Streams;
3 | using ProtoBuf;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.IO;
7 | using System.Linq;
8 | using System.Text;
9 |
10 | namespace DemoParser_Core
11 | {
12 | static class Helper
13 | {
14 | public static string ReadCString(this BinaryReader reader, int length)
15 | {
16 | return ReadCString(reader, length, Encoding.Default);
17 | }
18 |
19 | public static int ReadInt32SwapEndian(this BinaryReader reader)
20 | {
21 | return BitConverter.ToInt32(reader.ReadBytes(4).Reverse().ToArray(), 0);
22 | }
23 |
24 | public static long ReadInt64SwapEndian(this BinaryReader reader)
25 | {
26 | return BitConverter.ToInt64(reader.ReadBytes(8).Reverse().ToArray(), 0);
27 | }
28 |
29 | public static string Reverse(this string s)
30 | {
31 | char[] charArray = s.ToCharArray();
32 | Array.Reverse(charArray);
33 | return new string(charArray);
34 | }
35 |
36 | public static string ReadCString(this BinaryReader reader, int length, Encoding encoding)
37 | {
38 | return encoding.GetString(reader.ReadBytes(length)).Split(new char[] { '\0' }, 2)[0];
39 | }
40 |
41 | public static int ReadVarInt32(this BinaryReader reader)
42 | {
43 | int b = 0, count = 0, result = 0;
44 |
45 | do
46 | {
47 | if (count > 5)
48 | throw new InvalidDataException("VarInt32 out of range");
49 |
50 | b = reader.ReadByte();
51 |
52 | result |= (b & 0x7F) << (7 * count);
53 |
54 | count++;
55 | }
56 | while ((b & 0x80) != 0);
57 |
58 | return result;
59 | }
60 |
61 | public static string ReadNullTerminatedString(this BinaryReader reader)
62 | {
63 | return ReadNullTerminatedString(reader, Encoding.Default);
64 | }
65 |
66 | public static string ReadNullTerminatedString(this BinaryReader reader, Encoding encoding)
67 | {
68 | return ReadNullTerminatedString(reader, encoding, 512);
69 | }
70 |
71 |
72 | public static string ReadNullTerminatedString(this BinaryReader reader, Encoding encoding, int initialBufferSize)
73 | {
74 | List result = new List(initialBufferSize);
75 |
76 | while (true)
77 | {
78 | byte b = reader.ReadByte();
79 |
80 | if(b == 0)
81 | break;
82 |
83 | result.Add(b);
84 | }
85 |
86 | return Encoding.Default.GetString(result.ToArray());
87 | }
88 |
89 | public static IEnumerable GetFlagsOfEnum(Enum input)
90 | {
91 | foreach (Enum value in Enum.GetValues(input.GetType()))
92 | if (input.HasFlag(value))
93 | yield return value;
94 | }
95 |
96 | public static Stream ReadVolvoPacket(this BinaryReader reader)
97 | {
98 | return new LimitStream(reader.BaseStream, reader.ReadInt32());
99 | }
100 |
101 | public static T ReadProtobufMessage(this BinaryReader reader)
102 | {
103 | return ReadProtobufMessage(reader, PrefixStyle.Base128);
104 | }
105 |
106 | public static T ReadProtobufMessage(this BinaryReader reader, PrefixStyle style)
107 | {
108 | return ProtoBuf.Serializer.DeserializeWithLengthPrefix(reader.BaseStream, style);
109 | }
110 |
111 | public static IExtensible ReadProtobufMessage(this BinaryReader reader, Type T, PrefixStyle style)
112 | {
113 | var type = typeof(ProtoBuf.Serializer);
114 | var deserialize = type.GetMethod("DeserializeWithLengthPrefix", new Type[] { typeof(Stream), typeof(PrefixStyle)});
115 |
116 | deserialize = deserialize.MakeGenericMethod(T);
117 |
118 | return (IExtensible)deserialize.Invoke(null, new object[] { reader.BaseStream, style });
119 | }
120 |
121 | public static TValue GetValueOrDefault(this IDictionary dictionary, TKey key, TValue defaultValue)
122 | {
123 | TValue value;
124 | return dictionary.TryGetValue(key, out value) ? value : defaultValue;
125 | }
126 |
127 | public static TValue GetValueOrDefault(this IDictionary dictionary, TKey key, Func defaultValueProvider)
128 | {
129 | TValue value;
130 | return dictionary.TryGetValue(key, out value) ? value
131 | : defaultValueProvider();
132 | }
133 |
134 | public static bool HasFlagFast(this SendPropertyFlags flags, SendPropertyFlags check)
135 | {
136 | return (flags & check) == check;
137 | }
138 | }
139 | }
140 |
--------------------------------------------------------------------------------
/DemoParser/Packets/DemoPacketParser.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core.Messages;
2 | using DemoParser_Core.Packets.Handlers;
3 | using ProtoBuf;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.IO;
7 | using System.Linq;
8 | using System.Reflection;
9 |
10 | namespace DemoParser_Core.Packets
11 | {
12 | public class DemoPacketParser
13 | {
14 | private static readonly Dictionary MessagesCSVC = (
15 | from type in Assembly.GetExecutingAssembly().GetTypes()
16 | where type.FullName.Contains("Messages.CSVCMsg_")
17 | select type).ToDictionary(type => type.FullName);
18 |
19 | private static readonly Dictionary MessagesCNET = (
20 | from type in Assembly.GetExecutingAssembly().GetTypes()
21 | where type.FullName.Contains("Messages.CNETMsg_")
22 | select type).ToDictionary(type => type.FullName);
23 |
24 | // TODO Thread-safe
25 | private static GameEventHandler gameEventHandler = new GameEventHandler();
26 |
27 | private static readonly Dictionary ParseType = new Dictionary {
28 | //{ typeof(CSVCMsg_CreateStringTable), new GenericCreateStringTablesHandler() },
29 | { typeof(CSVCMsg_CreateStringTable), new CreateStringTableUserInfoHandler() },
30 | { typeof(CSVCMsg_UpdateStringTable), new UpdateStringTableUserInfoHandler() },
31 | { typeof(CSVCMsg_GameEventList), gameEventHandler },
32 | { typeof(CSVCMsg_GameEvent), gameEventHandler },
33 | //{ typeof(CSVCMsg_UserMessage), new UserMessageHandler() },
34 | { typeof(CSVCMsg_PacketEntities), new PacketEntitiesHandler() }
35 | };
36 |
37 | ///
38 | /// Read protobuf messages
39 | ///
40 | ///
41 | ///
42 | public void ParsePacket(Stream stream, DemoParser parser)
43 | {
44 | var reader = new BinaryReader(stream);
45 |
46 | while (stream.Position < stream.Length)
47 | {
48 | int cmd = reader.ReadVarInt32();
49 |
50 | Type toParse = null;
51 |
52 | if (Enum.IsDefined(typeof(SVC_Messages), cmd))
53 | {
54 | SVC_Messages msg = (SVC_Messages)cmd;
55 | toParse = MessagesCSVC["DemoParser_Core.Messages.CSVCMsg_" + msg.ToString().Substring(4)];
56 | }
57 | else if (Enum.IsDefined(typeof(NET_Messages), cmd))
58 | {
59 | NET_Messages msg = (NET_Messages)cmd;
60 | toParse = MessagesCNET["DemoParser_Core.Messages.CNETMsg_" + msg.ToString().Substring(4)];
61 | }
62 | else
63 | {
64 | reader.ReadBytes(reader.ReadVarInt32());
65 | continue;
66 | }
67 |
68 | IExtensible message = reader.ReadProtobufMessage(toParse, ProtoBuf.PrefixStyle.Base128);
69 |
70 | //This method apply message only to Handler able to deal with that type of message
71 | if (ParseType.ContainsKey(toParse))
72 | {
73 | ParseType[toParse].TryApplyMessage(message, parser);
74 | }
75 | }
76 | }
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/DemoParser/Packets/Entity.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core.Streams.BitStream;
2 | using DemoParser_Core.DataTables;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 |
6 | namespace DemoParser_Core.Packets
7 | {
8 | internal class Entity
9 | {
10 | public int ID { get; set; }
11 | public ServerClass ServerClass { get; set; }
12 |
13 | public Dictionary Properties { get; private set; }
14 |
15 | public Entity(int id, ServerClass serverClass)
16 | {
17 | Properties = new Dictionary();
18 | this.ID = id;
19 | this.ServerClass = serverClass;
20 | }
21 |
22 | public void ApplyUpdate(IBitStream reader)
23 | {
24 | bool newWay = reader.ReadBit();
25 | int index = -1;
26 |
27 | var entries = new List();
28 |
29 | while ((index = ReadFieldIndex(reader, index, newWay)) != -1)
30 | {
31 | entries.Add(ServerClass.flattenedProps[index]);
32 | }
33 |
34 | foreach (FlattenedPropEntry propertyEntry in entries)
35 | {
36 | Properties[propertyEntry.Prop.Name] = PropertyDecoder.DecodeProp(propertyEntry, reader);
37 | }
38 | }
39 |
40 | int ReadFieldIndex(IBitStream reader, int lastIndex, bool bNewWay)
41 | {
42 | if (bNewWay)
43 | {
44 | if (reader.ReadBit())
45 | {
46 | return lastIndex + 1;
47 | }
48 | }
49 |
50 | int ret = 0;
51 | if (bNewWay && reader.ReadBit())
52 | {
53 | ret = (int)reader.ReadInt(3); // read 3 bits
54 | }
55 | else
56 | {
57 | ret = (int)reader.ReadInt(7); // read 7 bits
58 | switch (ret & (32 | 64))
59 | {
60 | case 32:
61 | ret = (ret & ~96) | ((int)reader.ReadInt(2) << 5);
62 | break;
63 | case 64:
64 | ret = (ret & ~96) | ((int)reader.ReadInt(4) << 5);
65 | break;
66 | case 96:
67 | ret = (ret & ~96) | ((int)reader.ReadInt(7) << 5);
68 | break;
69 | }
70 | }
71 |
72 | if (ret == 0xFFF) // end marker is 4095 for cs:go
73 | {
74 | return -1;
75 | }
76 |
77 | return lastIndex + 1 + ret;
78 | }
79 |
80 | public override string ToString()
81 | {
82 | return ID + ": " + this.ServerClass;
83 | }
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/DemoParser/Packets/Handlers/CreateStringTableUserInfoHandler.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core.Messages;
2 | using DemoParser_Core.StringTables;
3 | using ProtoBuf;
4 |
5 | namespace DemoParser_Core.Packets.Handlers
6 | {
7 | ///
8 | /// Used to parse userinfo data : create PlayerInfo and add them to demoParser.RawPlayers
9 | ///
10 | class CreateStringTableUserInfoHandler : IMessageParser
11 | {
12 | public bool TryApplyMessage(IExtensible message, DemoParser parser)
13 | {
14 | var create = message as CSVCMsg_CreateStringTable;
15 |
16 | if (create != null)
17 | parser.StringTablesParser.stringTables.Add((Messages.CSVCMsg_CreateStringTable)message);
18 |
19 | if ((create == null) || (create.name != "userinfo"))
20 | return false;
21 |
22 | parser.StringTablesParser.ParseStringTableMessage(create, parser);
23 |
24 | return true;
25 | }
26 |
27 | public int Priority { get { return 0; } }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/DemoParser/Packets/Handlers/GenericCreateStringTablesHandler.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace DemoParser_Core.Packets.Handlers
8 | {
9 | class GenericCreateStringTablesHandler : IMessageParser
10 | {
11 | public bool TryApplyMessage(ProtoBuf.IExtensible message, DemoParser parser)
12 | {
13 | if (message is Messages.CSVCMsg_CreateStringTable) {
14 | parser.StringTablesParser.stringTables.Add((Messages.CSVCMsg_CreateStringTable)message);
15 | return true;
16 | }
17 |
18 | return false;
19 | }
20 |
21 | public int Priority { get { return 0; } }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/DemoParser/Packets/Handlers/PacketEntitiesHandler.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core.Streams.BitStream;
2 | using DemoParser_Core.DataTables;
3 | using DemoParser_Core.Entities;
4 | using DemoParser_Core.Messages;
5 | using System.Diagnostics;
6 | using System.IO;
7 | using DemoParser_Core.Events;
8 |
9 | namespace DemoParser_Core.Packets.Handlers
10 | {
11 | ///
12 | /// Manage lifetime of all entities, from creation to update and delete
13 | ///
14 | class PacketEntitiesHandler : IMessageParser
15 | {
16 | public int Priority { get { return 0; } }
17 |
18 | public bool TryApplyMessage(ProtoBuf.IExtensible message, DemoParser parser)
19 | {
20 | CSVCMsg_PacketEntities packetEntities = message as CSVCMsg_PacketEntities;
21 | if (packetEntities == null)
22 | return false;
23 |
24 | // TODO check
25 | // In official C++ source code, loop is from last to first entities in packetEntities -> impact ?
26 | using (IBitStream reader = BitStreamUtil.Create(packetEntities.entity_data)) {
27 | int currentEntity = -1;
28 |
29 | for (int i = 0; i < packetEntities.updated_entries; i++)
30 | {
31 | currentEntity += 1 + (int)reader.ReadUBitInt();
32 |
33 | if (!reader.ReadBit())
34 | {
35 | Entity entity;
36 |
37 | if (reader.ReadBit())
38 | // EnterPVS = add entity
39 | entity = EnterPVS(reader, currentEntity, parser);
40 | else
41 | // DeltaEnt = update entity
42 | entity = parser.entities[currentEntity];
43 |
44 | entity.ApplyUpdate(reader);
45 |
46 | UpdateModel(entity, parser);
47 |
48 | Debug.WriteLine("Entity #" + entity.ID + ": " + entity.ServerClass.Name);
49 | }
50 | else
51 | {
52 | // LeavePVS
53 | if (reader.ReadBit())
54 | {
55 | parser.entities.Remove(currentEntity);
56 | }
57 | }
58 | }
59 | }
60 |
61 | return true;
62 | }
63 |
64 | private Entity EnterPVS(IBitStream reader, int id, DemoParser parser)
65 | {
66 | int serverClassID = (int)reader.ReadInt(parser.DataTablesParser.ClassBits);
67 | reader.ReadInt(10); //Entity serial.
68 |
69 | ServerClass entityClass = parser.DataTablesParser.ServerClasses[serverClassID];
70 | Entity newEntity = new Entity(id, entityClass);
71 |
72 | parser.entities[newEntity.ID] = newEntity;
73 |
74 | /* commit on trunk
75 | using (var ms = new MemoryStream(parser.instanceBaseline[serverClassID])) {
76 | ms.Position = 0;
77 | newEntity.ApplyUpdate(BitStreamUtil.Create(ms));
78 | }*/
79 |
80 | return newEntity;
81 | }
82 |
83 | ///
84 | /// Update Team and Player lists based on entity values
85 | ///
86 | ///
87 | private void UpdateModel(Entity entity, DemoParser parser)
88 | {
89 | // Team
90 | if (entity.ServerClass.DTName == "DT_CSTeam" && entity.Properties.Count > 0)
91 | {
92 | int teamNum = (int)entity.Properties["m_iTeamNum"];
93 |
94 | if (!parser.teams.ContainsKey(teamNum))
95 | {
96 | Team team = new Team(entity);
97 | parser.teams.Add(teamNum, team);
98 | }
99 | parser.teams[teamNum].Update(entity);
100 | parser.EventsManager.RaiseTeamParsed(new TeamParsedEventArgs(parser.teams[teamNum]));
101 | }
102 | // Player
103 | else if (entity.ServerClass.DTName == "DT_CSPlayer")
104 | {
105 | // TODO WARN Player should already exists because created when stringtables are received
106 | // TODO is this really working? O_o
107 | int index = entity.ID - 1;
108 |
109 | if (!parser.entities.ContainsKey(index) || index >= parser.players.Count)
110 | return;
111 |
112 | Player p = parser.Players[index];
113 | p.Update(entity);
114 | parser.EventsManager.RaisePlayerParsed(new PlayerParsedEventArgs(p));
115 |
116 | if (p.Team == null)
117 | {
118 | if (entity.Properties.ContainsKey("m_iTeamNum") && parser.teams.ContainsKey((int)entity.Properties["m_iTeamNum"]))
119 | p.Team = parser.teams[(int)entity.Properties["m_iTeamNum"]];
120 | }
121 | }
122 | }
123 | }
124 | }
125 |
--------------------------------------------------------------------------------
/DemoParser/Packets/Handlers/UpdateStringTableUserInfoHandler.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core.Messages;
2 | using DemoParser_Core.StringTables;
3 |
4 | namespace DemoParser_Core.Packets.Handlers
5 | {
6 | class UpdateStringTableUserInfoHandler : IMessageParser
7 | {
8 | public bool TryApplyMessage(ProtoBuf.IExtensible message, DemoParser parser)
9 | {
10 | var stringTableUpdate = message as CSVCMsg_UpdateStringTable;
11 | if ((stringTableUpdate == null) || (parser.StringTablesParser.stringTables[stringTableUpdate.table_id].name != "userinfo"))
12 | return false;
13 |
14 | CSVCMsg_CreateStringTable stringTableCreate = parser.StringTablesParser.stringTables[stringTableUpdate.table_id];
15 | stringTableCreate.num_entries = stringTableUpdate.num_changed_entries;
16 | stringTableCreate.string_data = stringTableUpdate.string_data;
17 |
18 | parser.StringTablesParser.ParseStringTableMessage(stringTableCreate, parser);
19 |
20 | return true;
21 | }
22 |
23 | public int Priority { get { return 0; } }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/DemoParser/Packets/Handlers/UserMessageHandler.cs:
--------------------------------------------------------------------------------
1 | using DemoParser_Core.Messages;
2 |
3 | namespace DemoParser_Core.Packets.Handlers
4 | {
5 | public class UserMessageHandler : IMessageParser
6 | {
7 | public bool TryApplyMessage (ProtoBuf.IExtensible message, DemoParser parser)
8 | {
9 | CSVCMsg_UserMessage userMessage = message as CSVCMsg_UserMessage;
10 | if (userMessage == null)
11 | return false;
12 |
13 | var messageType = (Messages.ECstrike15UserMessages)userMessage.msg_type;
14 |
15 | return true;
16 | }
17 |
18 | public int Priority { get { return 0; } }
19 | }
20 | }
21 |
22 |
--------------------------------------------------------------------------------
/DemoParser/Packets/IMessageParser.cs:
--------------------------------------------------------------------------------
1 | using ProtoBuf;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace DemoParser_Core.Packets
9 | {
10 | ///
11 | /// A generic *singleton* object that can parse messages.
12 | ///
13 | public interface IMessageParser
14 | {
15 | ///
16 | /// Attempts to parse a given protobuf message.
17 | ///
18 | /// true if this instance was able to handle the specified message; otherwise, false.
19 | /// The protobuf Message.
20 | /// The that holds the parsing context.
21 | bool TryApplyMessage(IExtensible message, DemoParser parser);
22 |
23 | ///
24 | /// Gets this parser's priority.
25 | ///
26 | ///
27 | /// Parsers with a higher priority will run first.
28 | /// Parsers with a priority > 0 will additionally prevent other parsers from receiving a message they parsed.
29 | ///
30 | /// The priority.
31 | int Priority { get; }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/DemoParser/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("DemoParser-Core")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("DemoParser-Core")]
13 | [assembly: AssemblyCopyright("Copyright © 2014")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("6aeda32a-9bd4-49b9-85dd-3762fef77702")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/DemoParser/Streams/BitStream/BitArrayStream.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using System.Collections;
7 | using System.IO;
8 |
9 | namespace DemoParser_Core.Streams.BitStream
10 | {
11 | public class BitArrayStream : IBitStream
12 | {
13 | BitArray array;
14 |
15 | public int Position { get; private set; }
16 |
17 | public BitArrayStream()
18 | {
19 | }
20 |
21 | public BitArrayStream(byte[] data)
22 | {
23 | array = new BitArray(data);
24 | Position = 0;
25 | }
26 |
27 | public void Initialize(Stream stream)
28 | {
29 | using (var memstream = new MemoryStream(checked((int)stream.Length))) {
30 | stream.CopyTo(memstream);
31 | array = new BitArray(memstream.GetBuffer());
32 | }
33 |
34 | Position = 0;
35 | }
36 |
37 | public void Seek(int pos, SeekOrigin origin)
38 | {
39 | if (origin == SeekOrigin.Begin)
40 | Position = pos;
41 |
42 | if (origin == SeekOrigin.Current)
43 | Position += pos;
44 |
45 | if (origin == SeekOrigin.End)
46 | Position = array.Count - pos;
47 | }
48 |
49 | public uint ReadInt(int numBits)
50 | {
51 | uint result = PeekInt(numBits);
52 | Position += numBits;
53 |
54 | return result;
55 | }
56 |
57 | public uint PeekInt(int numBits)
58 | {
59 | uint result = 0;
60 | int intPos = 0;
61 |
62 | for (int i = 0; i < numBits; i++)
63 | {
64 | result |= ((array[i + Position] ? 1u : 0u) << intPos++);
65 | }
66 |
67 | return result;
68 | }
69 |
70 | public bool ReadBit()
71 | {
72 | return ReadInt(1) == 1;
73 | }
74 |
75 | public byte ReadByte()
76 | {
77 | return (byte)ReadInt(8);
78 | }
79 |
80 | public byte ReadByte(int numBits)
81 | {
82 | return (byte)ReadInt(numBits);
83 | }
84 |
85 | public byte[] ReadBytes(int length)
86 | {
87 | byte[] result = new byte[length];
88 |
89 | for (int i = 0; i < length; i++)
90 | {
91 | result[i] = this.ReadByte();
92 | }
93 |
94 | return result;
95 | }
96 |
97 | public string PeekBools(int length)
98 | {
99 | byte[] buffer = new byte[length];
100 |
101 | int idx = 0;
102 | for (int i = Position; i < Math.Min(Position + length, array.Count); i++)
103 | {
104 | if (array[i])
105 | buffer[idx++] = 49;
106 | else
107 | buffer[idx++] = 48;
108 | }
109 |
110 | return Encoding.ASCII.GetString(buffer, 0, Math.Min(length, array.Count - Position));
111 | }
112 |
113 | public int ReadSignedInt(int numBits)
114 | {
115 | // Read the int normally and then shift it back and forth to extend the sign bit.
116 | return (((int)ReadInt(numBits)) << (32 - numBits)) >> (32 - numBits);
117 | }
118 |
119 | public float ReadFloat()
120 | {
121 | return BitConverter.ToSingle(ReadBytes(4), 0);
122 | }
123 |
124 | public byte[] ReadBits(int bits)
125 | {
126 | byte[] result = new byte[(bits + 7) / 8];
127 |
128 | for (int i = 0; i < (bits / 8); i++)
129 | result[i] = this.ReadByte();
130 |
131 | if ((bits % 8) != 0)
132 | result[bits / 8] = ReadByte(bits % 8);
133 |
134 | return result;
135 | }
136 |
137 | void IDisposable.Dispose()
138 | {
139 | array = null;
140 | }
141 | }
142 | }
143 |
--------------------------------------------------------------------------------
/DemoParser/Streams/BitStream/BitStreamUtil.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Diagnostics;
4 | using System.IO;
5 | using System.Text;
6 |
7 | namespace DemoParser_Core.Streams.BitStream
8 | {
9 | public static class BitStreamUtil
10 | {
11 | ///
12 | /// Creates an instance of the preferred implementation for streams.
13 | ///
14 | public static IBitStream Create(Stream stream)
15 | {
16 | #if DEBUG
17 | byte[] data;
18 | using (var memstream = new MemoryStream(checked((int)stream.Length))) {
19 | stream.CopyTo(memstream);
20 | data = memstream.GetBuffer();
21 | }
22 |
23 | var bs1 = new BitArrayStream(data);
24 | var bs2 = new ManagedBitStream();
25 | bs2.Initialize(new MemoryStream(data));
26 | var bs3 = new UnsafeBitStream();
27 | bs3.Initialize(new MemoryStream(data));
28 | return new DebugBitStream(bs1, new DebugBitStream(bs2, bs3));
29 | #else
30 | var bs = new UnsafeBitStream();
31 | bs.Initialize(stream);
32 | return bs;
33 | #endif
34 | }
35 |
36 | ///
37 | /// Creates an instance of the preferred implementation for byte arrays.
38 | ///
39 | public static IBitStream Create(byte[] data)
40 | {
41 | #if DEBUG
42 | var bs1 = new BitArrayStream(data);
43 | var bs2 = new ManagedBitStream();
44 | bs2.Initialize(new MemoryStream(data));
45 | var bs3 = new UnsafeBitStream();
46 | bs3.Initialize(new MemoryStream(data));
47 | return new DebugBitStream(bs1, new DebugBitStream(bs2, bs3));
48 | #else
49 | var bs = new UnsafeBitStream();
50 | bs.Initialize(new MemoryStream(data));
51 | return bs;
52 | #endif
53 | }
54 |
55 | public static uint ReadUBitInt(this IBitStream bs)
56 | {
57 | uint ret = bs.ReadInt(6);
58 | switch (ret & (16 | 32))
59 | {
60 | case 16:
61 | ret = (ret & 15) | (bs.ReadInt(4) << 4);
62 | break;
63 | case 32:
64 | ret = (ret & 15) | (bs.ReadInt(8) << 4);
65 | break;
66 | case 48:
67 | ret = (ret & 15) | (bs.ReadInt(32 - 4) << 4);
68 | break;
69 | }
70 | return ret;
71 | }
72 |
73 | public static string ReadString(this IBitStream bs)
74 | {
75 | return bs.ReadString(Int32.MaxValue);
76 | }
77 |
78 | public static string ReadString(this IBitStream bs, int limit)
79 | {
80 | var result = new List(512);
81 | for (int pos = 0; pos < limit; pos++) {
82 | var b = bs.ReadByte();
83 | if ((b == 0) || (b == 10))
84 | break;
85 | result.Add(b);
86 | }
87 | return Encoding.ASCII.GetString(result.ToArray());
88 | }
89 |
90 | public static uint ReadVarInt(this IBitStream bs)
91 | {
92 | uint tmpByte = 0x80;
93 | uint result = 0;
94 | for (int count = 0; (tmpByte & 0x80) != 0; count++) {
95 | if (count > 5)
96 | throw new InvalidDataException("VarInt32 out of range");
97 | tmpByte = bs.ReadByte();
98 | result |= (tmpByte & 0x7F) << (7 * count);
99 | }
100 | return result;
101 | }
102 |
103 | [Conditional("DEBUG")]
104 | public static void AssertMaxBits(int max, int actual)
105 | {
106 | Debug.Assert(actual <= max, "trying to read too many bits", "Attempted to read {0} bits (max={1})", actual, max);
107 | }
108 | }
109 | }
110 |
111 |
--------------------------------------------------------------------------------
/DemoParser/Streams/BitStream/DebugBitStream.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 |
4 | namespace DemoParser_Core.Streams.BitStream
5 | {
6 | public class DebugBitStream : IBitStream
7 | {
8 | private readonly IBitStream A, B;
9 |
10 | public DebugBitStream(IBitStream a, IBitStream b)
11 | {
12 | this.A = a;
13 | this.B = b;
14 | }
15 |
16 | public void Initialize(System.IO.Stream stream)
17 | {
18 | throw new NotImplementedException();
19 | }
20 |
21 | void IDisposable.Dispose()
22 | {
23 | A.Dispose();
24 | B.Dispose();
25 | }
26 |
27 | private void Verify(T a, T b)
28 | {
29 | if (!a.Equals(b)) {
30 | System.Diagnostics.Debug.Assert(false);
31 | throw new InvalidOperationException();
32 | }
33 | }
34 |
35 | public uint ReadInt(int bits)
36 | {
37 | var a = A.ReadInt(bits);
38 | var b = B.ReadInt(bits);
39 | Verify(a, b);
40 | return a;
41 | }
42 |
43 | public int ReadSignedInt(int bits)
44 | {
45 | var a = A.ReadSignedInt(bits);
46 | var b = B.ReadSignedInt(bits);
47 | Verify(a, b);
48 | return a;
49 | }
50 |
51 | public uint PeekInt(int bits)
52 | {
53 | var a = A.PeekInt(bits);
54 | var b = B.PeekInt(bits);
55 | Verify(a, b);
56 | return a;
57 | }
58 |
59 | public bool ReadBit()
60 | {
61 | var a = A.ReadBit();
62 | var b = B.ReadBit();
63 | Verify(a, b);
64 | return a;
65 | }
66 |
67 | public byte[] ReadBits(int bits)
68 | {
69 | var a = A.ReadBits(bits);
70 | var b = B.ReadBits(bits);
71 | Verify(a.SequenceEqual(b), true);
72 | return a;
73 | }
74 |
75 | public byte ReadByte()
76 | {
77 | var a = A.ReadByte();
78 | var b = B.ReadByte();
79 | Verify(a, b);
80 | return a;
81 | }
82 |
83 | public byte ReadByte(int bits)
84 | {
85 | var a = A.ReadByte(bits);
86 | var b = B.ReadByte(bits);
87 | Verify(a, b);
88 | return a;
89 | }
90 |
91 | public byte[] ReadBytes(int bytes)
92 | {
93 | var a = A.ReadBytes(bytes);
94 | var b = B.ReadBytes(bytes);
95 | Verify(a.SequenceEqual(b), true);
96 | return a;
97 | }
98 |
99 | public string ReadString()
100 | {
101 | var a = A.ReadString();
102 | var b = B.ReadString();
103 | Verify(a, b);
104 | return a;
105 | }
106 |
107 | public string ReadString(int size)
108 | {
109 | var a = A.ReadString(size);
110 | var b = B.ReadString(size);
111 | Verify(a, b);
112 | return a;
113 | }
114 |
115 | public uint ReadVarInt()
116 | {
117 | var a = A.ReadVarInt();
118 | var b = B.ReadVarInt();
119 | Verify(a, b);
120 | return a;
121 | }
122 |
123 | public uint ReadUBitInt()
124 | {
125 | var a = A.ReadUBitInt();
126 | var b = B.ReadUBitInt();
127 | Verify(a, b);
128 | return a;
129 | }
130 |
131 | public float ReadFloat()
132 | {
133 | var a = A.ReadFloat();
134 | var b = B.ReadFloat();
135 | Verify(a, b);
136 | return a;
137 | }
138 | }
139 | }
140 |
141 |
--------------------------------------------------------------------------------
/DemoParser/Streams/BitStream/IBitStream.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 |
4 | namespace DemoParser_Core.Streams.BitStream
5 | {
6 | public interface IBitStream : IDisposable
7 | {
8 | void Initialize(Stream stream);
9 |
10 | uint ReadInt(int bits);
11 | uint PeekInt(int bits);
12 | int ReadSignedInt(int numBits);
13 | bool ReadBit();
14 | byte[] ReadBits(int bits);
15 | byte ReadByte();
16 | byte ReadByte(int bits);
17 | byte[] ReadBytes(int bytes);
18 | float ReadFloat();
19 | }
20 | }
21 |
22 |
--------------------------------------------------------------------------------
/DemoParser/Streams/BitStream/ManagedBitStream.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Diagnostics;
4 | using System.Collections.Generic;
5 | using System.Text;
6 |
7 | namespace DemoParser_Core.Streams.BitStream
8 | {
9 | public class ManagedBitStream : IBitStream
10 | {
11 | private static readonly int SLED = 4;
12 | private static readonly int BUFSIZE = 2048 + SLED;
13 |
14 | private int Offset;
15 | private Stream Underlying;
16 | private readonly byte[] Buffer = new byte[BUFSIZE];
17 |
18 | public int BitsInBuffer;
19 |
20 | public void Initialize(Stream underlying)
21 | {
22 | this.Underlying = underlying;
23 | RefillBuffer();
24 |
25 | Offset = SLED * 8;
26 | }
27 |
28 | private void Advance(int howMuch)
29 | {
30 | Debug.Assert(howMuch <= (SLED * 8), "can't advance that far!", "howMuch={0} Offset={1} BitsInBuffer={2}", howMuch, Offset, BitsInBuffer);
31 |
32 | Offset += howMuch;
33 | if (Offset >= BitsInBuffer)
34 | RefillBuffer();
35 | }
36 |
37 | private void RefillBuffer()
38 | {
39 | // not even Array.Copy, to hopefully achieve better optimization (just straight 32bit copy)
40 | // seriously, mono: ༼ つ◕_◕༽つ VECTORIZE PL0X ༼ つ◕_◕༽つ
41 | for (int i = 0; i < SLED; i++)
42 | Buffer[i] = Buffer[(BitsInBuffer / 8) + i];
43 |
44 | Offset -= BitsInBuffer;
45 | BitsInBuffer = 8 * Underlying.Read(Buffer, SLED, BUFSIZE - SLED);
46 | }
47 |
48 | public uint ReadInt(int numBits)
49 | {
50 | uint result = PeekInt(numBits);
51 | Advance(numBits);
52 | return result;
53 | }
54 |
55 | public uint PeekInt(int numBits)
56 | {
57 | BitStreamUtil.AssertMaxBits(32, numBits);
58 | Debug.Assert((Offset + numBits) <= (BitsInBuffer + (SLED * 8)), "gg", "This code just fell apart. We're all dead. Offset={0} numBits={1} BitsInBuffer={2}", Offset, numBits, BitsInBuffer);
59 |
60 |
61 | // _ xxxnno _
62 | // _ xxxnno _
63 | // _ xxxnno
64 |
65 |
66 | return (uint)((BitConverter.ToUInt64(Buffer, (Offset / 8) & ~3) << ((8 * 8) - (Offset % (8 * 4)) - numBits)) >> ((8 * 8) - numBits));
67 | }
68 |
69 | public int ReadSignedInt(int numBits)
70 | {
71 | BitStreamUtil.AssertMaxBits(32, numBits);
72 |
73 | // Just like PeekInt, but we cast to signed long before the shr because we need to sext
74 | var result = (int)(((long)(BitConverter.ToUInt64(Buffer, (Offset / 8) & ~3) << ((8 * 8) - (Offset % (8 * 4)) - numBits))) >> ((8 * 8) - numBits));
75 | Advance(numBits);
76 | return result;
77 | }
78 |
79 | public bool ReadBit()
80 | {
81 | bool bit = (Buffer[Offset / 8] & (1 << (Offset & 7))) != 0;
82 | Advance(1);
83 | return bit;
84 | }
85 |
86 | public byte[] ReadBits(int bits)
87 | {
88 | byte[] result = new byte[(bits + 7) / 8];
89 |
90 | for (int i = 0; i < (bits / 8); i++)
91 | result[i] = this.ReadByte();
92 |
93 | if ((bits % 8) != 0)
94 | result[bits / 8] = ReadByte(bits % 8);
95 |
96 | return result;
97 | }
98 |
99 | public byte ReadByte()
100 | {
101 | return ReadByte(8);
102 | }
103 |
104 | public byte ReadByte(int bits)
105 | {
106 | BitStreamUtil.AssertMaxBits(8, bits);
107 | return (byte)ReadInt(bits);
108 | }
109 |
110 | public byte[] ReadBytes(int bytes)
111 | {
112 | var ret = new byte[bytes];
113 | for (int i = 0; i < bytes; i++)
114 | ret[i] = ReadByte();
115 | return ret;
116 | }
117 |
118 | public float ReadFloat()
119 | {
120 | return BitConverter.ToSingle(ReadBytes(4), 0);
121 | }
122 |
123 | void IDisposable.Dispose()
124 | {
125 | }
126 | }
127 | }
128 |
129 |
--------------------------------------------------------------------------------
/DemoParser/Streams/LimitStream.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 |
4 | namespace DemoParser_Core.Streams
5 | {
6 | public class LimitStream : Stream
7 | {
8 | public override bool CanRead { get { return true; } }
9 | public override bool CanSeek { get { return false; } }
10 | public override bool CanWrite { get { return false; } }
11 | public override long Length { get { return _Length; } }
12 |
13 | public override long Position
14 | {
15 | get { return _Position; }
16 | set { throw new NotImplementedException(); }
17 | }
18 |
19 | private readonly Stream Underlying;
20 | private readonly long _Length;
21 | private long _Position;
22 |
23 | public LimitStream(Stream underlying, long length)
24 | {
25 | if (!underlying.CanRead)
26 | throw new NotImplementedException();
27 |
28 | if (length <= 0)
29 | throw new ArgumentException("length");
30 |
31 | this.Underlying = underlying;
32 | this._Length = length;
33 | this._Position = 0;
34 | }
35 |
36 | private const int TrashSize = 4096;
37 | private static readonly byte[] Dignitrash = new byte[TrashSize];
38 |
39 | protected override void Dispose(bool disposing)
40 | {
41 | base.Dispose(disposing);
42 |
43 | if (disposing)
44 | {
45 | var remaining = Length - _Position;
46 | if (Underlying.CanSeek)
47 | Underlying.Seek(remaining, SeekOrigin.Current);
48 | else
49 | {
50 | while (remaining > 0)
51 | {
52 | Underlying.Read(Dignitrash, 0, checked((int)Math.Min(TrashSize, remaining)));
53 | remaining -= TrashSize; // could go beyond 0, but it's signed so who cares
54 | }
55 | }
56 | }
57 | }
58 |
59 | public override void Flush() { Underlying.Flush(); }
60 |
61 | public byte[] ReadBytes(int count)
62 | {
63 | var data = new byte[count];
64 | int offset = 0;
65 | while (offset < count)
66 | {
67 | int thisTime = Read(data, offset, count - offset);
68 | if (thisTime == 0)
69 | throw new EndOfStreamException();
70 | offset += thisTime;
71 | }
72 | return data;
73 | }
74 |
75 | public override int Read(byte[] buffer, int offset, int count)
76 | {
77 | count = checked((int)Math.Min(count, Length - _Position)); // should never throw (count <= int_max)
78 | int ret = Underlying.Read(buffer, offset, count);
79 | _Position += ret;
80 | return ret;
81 | }
82 |
83 | public override long Seek(long offset, SeekOrigin origin)
84 | {
85 | throw new NotImplementedException();
86 | }
87 |
88 | public override void SetLength(long value)
89 | {
90 | throw new NotImplementedException();
91 | }
92 |
93 | public override void Write(byte[] buffer, int offset, int count)
94 | {
95 | throw new NotImplementedException();
96 | }
97 | }
98 | }
99 |
100 |
--------------------------------------------------------------------------------
/DemoParser/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/License.txt:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
--------------------------------------------------------------------------------
/PacketInspector/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/PacketInspector/App.xaml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/PacketInspector/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Configuration;
4 | using System.Data;
5 | using System.Linq;
6 | using System.Threading.Tasks;
7 | using System.Windows;
8 |
9 | namespace PacketInspector
10 | {
11 | ///
12 | /// Interaction logic for App.xaml
13 | ///
14 | public partial class App : Application
15 | {
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/PacketInspector/MainWindow.xaml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/PacketInspector/MainWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using System.Windows;
7 | using System.Windows.Controls;
8 | using System.Windows.Data;
9 | using System.Windows.Documents;
10 | using System.Windows.Input;
11 | using System.Windows.Media;
12 | using System.Windows.Media.Imaging;
13 | using System.Windows.Navigation;
14 | using System.Windows.Shapes;
15 |
16 | namespace PacketInspector
17 | {
18 | ///
19 | /// Interaction logic for MainWindow.xaml
20 | ///
21 | public partial class MainWindow : Window
22 | {
23 | public MainWindow()
24 | {
25 | InitializeComponent();
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/PacketInspector/PacketInspector.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {E1199FFC-F420-49A8-B22E-45A0BF556FDB}
8 | WinExe
9 | Properties
10 | PacketInspector
11 | PacketInspector
12 | v4.5
13 | 512
14 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
15 | 4
16 |
17 |
18 | AnyCPU
19 | true
20 | full
21 | false
22 | bin\Debug\
23 | DEBUG;TRACE
24 | prompt
25 | 4
26 |
27 |
28 | AnyCPU
29 | pdbonly
30 | true
31 | bin\Release\
32 | TRACE
33 | prompt
34 | 4
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | 4.0
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | MSBuild:Compile
54 | Designer
55 |
56 |
57 | MSBuild:Compile
58 | Designer
59 |
60 |
61 | App.xaml
62 | Code
63 |
64 |
65 | MainWindow.xaml
66 | Code
67 |
68 |
69 |
70 |
71 | Code
72 |
73 |
74 | True
75 | True
76 | Resources.resx
77 |
78 |
79 | True
80 | Settings.settings
81 | True
82 |
83 |
84 | ResXFileCodeGenerator
85 | Resources.Designer.cs
86 |
87 |
88 | SettingsSingleFileGenerator
89 | Settings.Designer.cs
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
104 |
--------------------------------------------------------------------------------
/PacketInspector/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Resources;
3 | using System.Runtime.CompilerServices;
4 | using System.Runtime.InteropServices;
5 | using System.Windows;
6 |
7 | // General Information about an assembly is controlled through the following
8 | // set of attributes. Change these attribute values to modify the information
9 | // associated with an assembly.
10 | [assembly: AssemblyTitle("PacketInspector")]
11 | [assembly: AssemblyDescription("")]
12 | [assembly: AssemblyConfiguration("")]
13 | [assembly: AssemblyCompany("")]
14 | [assembly: AssemblyProduct("PacketInspector")]
15 | [assembly: AssemblyCopyright("Copyright © 2014")]
16 | [assembly: AssemblyTrademark("")]
17 | [assembly: AssemblyCulture("")]
18 |
19 | // Setting ComVisible to false makes the types in this assembly not visible
20 | // to COM components. If you need to access a type in this assembly from
21 | // COM, set the ComVisible attribute to true on that type.
22 | [assembly: ComVisible(false)]
23 |
24 | //In order to begin building localizable applications, set
25 | //CultureYouAreCodingWith in your .csproj file
26 | //inside a . For example, if you are using US english
27 | //in your source files, set the to en-US. Then uncomment
28 | //the NeutralResourceLanguage attribute below. Update the "en-US" in
29 | //the line below to match the UICulture setting in the project file.
30 |
31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
32 |
33 |
34 | [assembly: ThemeInfo(
35 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
36 | //(used if a resource is not found in the page,
37 | // or application resource dictionaries)
38 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
39 | //(used if a resource is not found in the page,
40 | // app, or any theme specific resource dictionaries)
41 | )]
42 |
43 |
44 | // Version information for an assembly consists of the following four values:
45 | //
46 | // Major Version
47 | // Minor Version
48 | // Build Number
49 | // Revision
50 | //
51 | // You can specify all the values or you can default the Build and Revision Numbers
52 | // by using the '*' as shown below:
53 | // [assembly: AssemblyVersion("1.0.*")]
54 | [assembly: AssemblyVersion("1.0.0.0")]
55 | [assembly: AssemblyFileVersion("1.0.0.0")]
56 |
--------------------------------------------------------------------------------
/PacketInspector/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.18444
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace PacketInspector.Properties
12 | {
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources
26 | {
27 |
28 | private static global::System.Resources.ResourceManager resourceMan;
29 |
30 | private static global::System.Globalization.CultureInfo resourceCulture;
31 |
32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
33 | internal Resources()
34 | {
35 | }
36 |
37 | ///
38 | /// Returns the cached ResourceManager instance used by this class.
39 | ///
40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
41 | internal static global::System.Resources.ResourceManager ResourceManager
42 | {
43 | get
44 | {
45 | if ((resourceMan == null))
46 | {
47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PacketInspector.Properties.Resources", typeof(Resources).Assembly);
48 | resourceMan = temp;
49 | }
50 | return resourceMan;
51 | }
52 | }
53 |
54 | ///
55 | /// Overrides the current thread's CurrentUICulture property for all
56 | /// resource lookups using this strongly typed resource class.
57 | ///
58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
59 | internal static global::System.Globalization.CultureInfo Culture
60 | {
61 | get
62 | {
63 | return resourceCulture;
64 | }
65 | set
66 | {
67 | resourceCulture = value;
68 | }
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/PacketInspector/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.18444
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace PacketInspector.Properties
12 | {
13 |
14 |
15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
18 | {
19 |
20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
21 |
22 | public static Settings Default
23 | {
24 | get
25 | {
26 | return defaultInstance;
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/PacketInspector/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Fork of https://github.com/moritzuehling/demoinfo-public/
2 |
3 | The goal of this fork is to separate demo parsing and data processing. To achieve this, it will use events triggered by the parser when things happened (e.g. new team parsed, player infos update parsed, round end event parsed, ...)
4 |
5 | Demo parsing
6 | ============
7 | CSGO protobuf updated definition :
8 | Protobuf used to parse .dem.info file : CDataGCCStrike15_v2_MatchInfo
9 |
10 | Application Architecture
11 | ============
12 | - DemoParser-Core : CSGO .dem file parser triggering parsing events
13 | - DemoParser-Model : contains data models and repos/services to store or compute stats of a game
14 | - DemoParser-UI : little WPF application made to see what's possible with this library
15 |
16 | Screenshots
17 | =========================
18 |
19 | DemoParser-UI
20 | -
21 | 
22 | 
23 |
--------------------------------------------------------------------------------
/TODO.txt:
--------------------------------------------------------------------------------
1 | TODO
2 |
3 | Rename projects :
4 | - CORE
5 | - BUSINESS
6 | - UI
7 |
8 | CORE ==
9 | UPG Helper.ReadProtobufMessage : avoid Reflection
10 | UPG Implement methods to search Players and Team by ID by EntityID
11 | * UPG Add events for Team/Player add/update
12 | FIX bug appearing when not using "RawPlayers" anymore : players not disconnected
13 | FIX possible wrong user in scoreboard
14 | UPG Use constructor for GameEventArgs
15 | FIX overtime scores (ct/t sides)
16 | + FIX bug when parsing old DEMO (PROTOCOL_VERSION <= )
17 | UPG Associate players and weapons all game long
18 | UPG DemoParser : pass parameters to tell which protobuf messages to parse (e.g. only scores, only header, only ranks, ...)
19 | UPG DemoPacketParser : use const strings
20 | UPG separate entity and players/teams/equipment
21 | UPG remove constructor with reader in DEMOhEADER And mb other classes
22 | + UPG create EventManager
23 | UPG use WeakEventManager
24 | TDO implement instance baseline parsing
25 |
26 | BUSINESS ==
27 | + UPG Create business model for stats : classes for counting frags for each players, scoreboard, ...
28 | + UPG Implement hltv.org rating formula
29 |
30 | UI ==
31 | + UPG Display team names and scores as soon as we can
32 |
--------------------------------------------------------------------------------