1+ using System . Collections . Frozen ;
12using NativeCodeGen . Core . Models ;
23using NativeCodeGen . Core . Parsing ;
34
@@ -9,50 +10,63 @@ namespace NativeCodeGen.Core.Generation;
910/// </summary>
1011public class NativeClassifier
1112{
12- public static readonly Dictionary < string , string ? > HandleClassHierarchy = new ( )
13- {
14- [ "Entity" ] = null ,
15- [ "Ped" ] = "Entity" ,
16- [ "Vehicle" ] = "Entity" ,
17- [ "Prop" ] = "Entity" ,
18- [ "Pickup" ] = null ,
19- [ "Player" ] = null ,
20- [ "Cam" ] = null ,
21- [ "Blip" ] = null ,
22- [ "Interior" ] = null ,
23- [ "FireId" ] = null ,
24- [ "AnimScene" ] = null ,
25- [ "ItemSet" ] = null ,
26- [ "PersChar" ] = null ,
27- [ "PopZone" ] = null ,
28- [ "PropSet" ] = null ,
29- [ "Volume" ] = null ,
30- [ "PedGroup" ] = null ,
31- [ "BaseTask" ] = null ,
32- [ "PedTask" ] = "BaseTask" ,
33- [ "VehicleTask" ] = "BaseTask" ,
34- [ "BaseModel" ] = null ,
35- [ "PedModel" ] = "BaseModel" ,
36- [ "VehicleModel" ] = "BaseModel" ,
37- [ "WeaponModel" ] = "BaseModel"
38- } ;
39-
40- public static readonly Dictionary < string , string > TypeToNamespace = new ( )
41- {
42- [ "Entity" ] = "ENTITY" ,
43- [ "Ped" ] = "PED" ,
44- [ "Vehicle" ] = "VEHICLE" ,
45- [ "Object" ] = "OBJECT" ,
46- [ "Pickup" ] = "OBJECT" ,
47- [ "Player" ] = "PLAYER" ,
48- [ "Cam" ] = "CAM" ,
49- [ "Blip" ] = "HUD" ,
50- [ "Interior" ] = "INTERIOR"
51- } ;
52-
53- public static readonly HashSet < string > TaskClasses = new ( ) { "BaseTask" , "PedTask" , "VehicleTask" } ;
54- public static readonly HashSet < string > ModelClasses = new ( ) { "BaseModel" , "PedModel" , "VehicleModel" , "WeaponModel" } ;
55- public static readonly HashSet < string > EntitySubclasses = new ( ) { "Ped" , "Vehicle" , "Object" , "Prop" } ;
13+ public static readonly FrozenDictionary < string , string ? > HandleClassHierarchy =
14+ new Dictionary < string , string ? >
15+ {
16+ [ "Entity" ] = null ,
17+ [ "Ped" ] = "Entity" ,
18+ [ "Vehicle" ] = "Entity" ,
19+ [ "Prop" ] = "Entity" ,
20+ [ "Pickup" ] = null ,
21+ [ "Player" ] = null ,
22+ [ "Cam" ] = null ,
23+ [ "Blip" ] = null ,
24+ [ "Interior" ] = null ,
25+ [ "FireId" ] = null ,
26+ [ "AnimScene" ] = null ,
27+ [ "ItemSet" ] = null ,
28+ [ "PersChar" ] = null ,
29+ [ "PopZone" ] = null ,
30+ [ "PropSet" ] = null ,
31+ [ "Volume" ] = null ,
32+ [ "PedGroup" ] = null ,
33+ [ "BaseTask" ] = null ,
34+ [ "PedTask" ] = "BaseTask" ,
35+ [ "VehicleTask" ] = "BaseTask" ,
36+ [ "BaseModel" ] = null ,
37+ [ "PedModel" ] = "BaseModel" ,
38+ [ "VehicleModel" ] = "BaseModel" ,
39+ [ "WeaponModel" ] = "BaseModel" ,
40+ [ "Weapon" ] = null
41+ } . ToFrozenDictionary ( StringComparer . Ordinal ) ;
42+
43+ public static readonly FrozenDictionary < string , string > TypeToNamespace =
44+ new Dictionary < string , string >
45+ {
46+ [ "Entity" ] = "ENTITY" ,
47+ [ "Ped" ] = "PED" ,
48+ [ "Vehicle" ] = "VEHICLE" ,
49+ [ "Object" ] = "OBJECT" ,
50+ [ "Pickup" ] = "OBJECT" ,
51+ [ "Player" ] = "PLAYER" ,
52+ [ "Cam" ] = "CAM" ,
53+ [ "Blip" ] = "HUD" ,
54+ [ "Interior" ] = "INTERIOR" ,
55+ [ "AnimScene" ] = "ANIMSCENE" ,
56+ [ "ItemSet" ] = "ITEMSET" ,
57+ [ "PersChar" ] = "PERSCHAR" ,
58+ [ "PropSet" ] = "PROPSET" ,
59+ [ "Volume" ] = "VOLUME"
60+ } . ToFrozenDictionary ( StringComparer . Ordinal ) ;
61+
62+ public static readonly FrozenSet < string > TaskClasses =
63+ new HashSet < string > { "BaseTask" , "PedTask" , "VehicleTask" } . ToFrozenSet ( StringComparer . Ordinal ) ;
64+
65+ public static readonly FrozenSet < string > ModelClasses =
66+ new HashSet < string > { "BaseModel" , "PedModel" , "VehicleModel" , "WeaponModel" } . ToFrozenSet ( StringComparer . Ordinal ) ;
67+
68+ public static readonly FrozenSet < string > EntitySubclasses =
69+ new HashSet < string > { "Ped" , "Vehicle" , "Object" , "Prop" } . ToFrozenSet ( StringComparer . Ordinal ) ;
5670
5771 public ClassifiedNatives Classify ( NativeDatabase db )
5872 {
@@ -65,27 +79,29 @@ public ClassifiedNatives Classify(NativeDatabase db)
6579 var targetClass = DetermineTargetClass ( native ) ;
6680 if ( targetClass != null )
6781 {
68- if ( ! result . HandleClasses . ContainsKey ( targetClass ) )
82+ if ( ! result . HandleClasses . TryGetValue ( targetClass , out var list ) )
6983 {
70- result . HandleClasses [ targetClass ] = new List < NativeDefinition > ( ) ;
84+ list = new List < NativeDefinition > ( ) ;
85+ result . HandleClasses [ targetClass ] = list ;
7186 }
72- result . HandleClasses [ targetClass ] . Add ( native ) ;
87+ list . Add ( native ) ;
7388 }
7489 else
7590 {
76- if ( ! result . NamespaceClasses . ContainsKey ( ns . Name ) )
91+ if ( ! result . NamespaceClasses . TryGetValue ( ns . Name , out var list ) )
7792 {
78- result . NamespaceClasses [ ns . Name ] = new List < NativeDefinition > ( ) ;
93+ list = new List < NativeDefinition > ( ) ;
94+ result . NamespaceClasses [ ns . Name ] = list ;
7995 }
80- result . NamespaceClasses [ ns . Name ] . Add ( native ) ;
96+ list . Add ( native ) ;
8197 }
8298 }
8399 }
84100
85101 return result ;
86102 }
87103
88- private string ? DetermineTargetClass ( NativeDefinition native )
104+ private static string ? DetermineTargetClass ( NativeDefinition native )
89105 {
90106 if ( native . Parameters . Count == 0 )
91107 return null ;
@@ -113,6 +129,11 @@ public ClassifiedNatives Classify(NativeDatabase db)
113129 } ;
114130 }
115131
132+ if ( native . Namespace . Equals ( "WEAPON" , StringComparison . OrdinalIgnoreCase ) && handleType == "Ped" )
133+ {
134+ return "Weapon" ;
135+ }
136+
116137 if ( TypeToNamespace . TryGetValue ( handleType , out var expectedNs ) )
117138 {
118139 if ( native . Namespace . Equals ( expectedNs , StringComparison . OrdinalIgnoreCase ) )
@@ -145,6 +166,7 @@ public ClassifiedNatives Classify(NativeDatabase db)
145166
146167 public static bool IsTaskClass ( string className ) => TaskClasses . Contains ( className ) ;
147168 public static bool IsModelClass ( string className ) => ModelClasses . Contains ( className ) ;
169+ public static bool IsWeaponClass ( string className ) => className == "Weapon" ;
148170
149171 public static string GetTaskEntityType ( string className ) => className switch
150172 {
0 commit comments