1- //
1+ // -----------------------------------------------------------------------------------------------------------
22// Enforce Script Extensions - By NarcoMarshmallow
33//
44// Message me @narcoleptic marshmallow #1188 on discord to give feedback or go to https://github.com/NarcoMarshDev
5- //
6- #define ESE_VERBOSE
7- //#define ESE_ENABLE_WIP
5+ // -----------------------------------------------------------------------------------------------------------
6+
7+
8+ // Different functionality of ESE can be enabled or disabled by defining some different values, go to ESE_Config.c to see how
9+
810class ESE
911{
1012 // Base class for all ESE static methods, if we ever get modding support for core types many of these will get added to their respective classes as well
@@ -58,52 +60,6 @@ class ESE
5860 }
5961 return allChildren ;
6062 }
61- /**
62- Creates new entity from prefab at a given position vector
63- @code
64- vector pos = someEntity.GetOrigin();
65- ResourceName resName = "{3E413771E1834D2F}Prefabs/Weapons/Rifles/M16/Rifle_M16A2.et";
66-
67- IEntity newEntity = ESE.SpawnPrefab(pos, resource);
68- @endcode
69- */
70- static IEntity SpawnPrefab (vector origin , ResourceName prefabName )
71- {
72- if (!prefabName )
73- {
74- Print ("Missing Prefab: " + prefabName , LogLevel .ERROR );
75- return null ;
76- }
77- Resource prefab = Resource .Load (prefabName );
78- EntitySpawnParams spawnParams ;
79- spawnParams .TransformMode = ETransformMode .WORLD ;
80- spawnParams .Transform [3 ] = origin ;
81-
82- return GetGame ().SpawnEntityPrefab (prefab , GetGame ().GetWorld (), spawnParams );
83- }
84- /**
85- Creates new entity from prefab at a players position
86- @code
87- ResourceName resName = "{3E413771E1834D2F}Prefabs/Weapons/Rifles/M16/Rifle_M16A2.et";
88-
89- IEntity newEntity = ESE.SpawnPrefabOnPlayer(playerId, resName);
90- @endcode
91- */
92- static IEntity SpawnPrefabOnPlayer (int playerId , ResourceName prefabName )
93- {
94- if (!prefabName )
95- {
96- Print ("Missing Prefab: " + prefabName , LogLevel .ERROR );
97- return null ;
98- }
99- ChimeraCharacter player = ESE .GetPlayerEntity (playerId );
100- Resource prefab = Resource .Load (prefabName );
101- EntitySpawnParams spawnParams ;
102- spawnParams .TransformMode = ETransformMode .WORLD ;
103- player .GetWorldTransform (spawnParams .Transform );
104-
105- return GetGame ().SpawnEntityPrefab (prefab , player .GetWorld (), spawnParams );
106- }
10763 // Deletes entity on server side
10864 static void DeleteEntity (IEntity ent )
10965 {
@@ -113,16 +69,35 @@ class ESE
11369
11470 // ================================ Player ================================
11571
116- // Returns player controlled entity
72+ // Returns player controlled entity from given playerId
11773 static ChimeraCharacter GetPlayerEntity (int playerId )
11874 {
11975 return ChimeraCharacter .Cast ( GetGame ().GetPlayerManager ().GetPlayerControlledEntity (playerId ) );
12076 }
77+
78+ // Returns player controlled entity of local machine
79+ static ChimeraCharacter GetLocalPlayerEntity ()
80+ {
81+ return ChimeraCharacter .Cast ( GetGame ().GetPlayerController ().GetControlledEntity () );
82+ }
83+
12184 // Returns player id of given entity, returns 0 if not controlled by player
12285 static int GetPlayerId (IEntity ent )
12386 {
12487 return GetGame ().GetPlayerManager ().GetPlayerIdFromControlledEntity (ent );
12588 }
89+
90+ // Returns currently equipped weapon of given player character, returns null if weapon is holstered
91+ static BaseWeaponComponent GetCurrentWeapon (ChimeraCharacter player )
92+ {
93+ return player .GetCharacterController ().GetWeaponManagerComponent ().GetCurrentWeapon ();
94+ }
95+
96+ static void HolsterCurrentWeapon (ChimeraCharacter player )
97+ {
98+ player .GetCharacterController ().SelectWeapon (null );
99+ }
100+
126101 // Returns alive state of given entity
127102 static bool IsEntityAlive (IEntity entity )
128103 {
@@ -132,9 +107,11 @@ class ESE
132107 else
133108 return true;
134109 }
110+
111+ #ifdef ESE_ENABLE_WIP
135112 /**
136113 TODO - MAKE SURE THIS WORKS AS INTENDED ON LOCAL PLAYERS WHEN CALLED
137- Returns if given entity is visible on local screen
114+ Returns true if given entity is visible on local screen, false otherwise
138115 @code
139116 @endcode
140117 */
@@ -151,11 +128,59 @@ class ESE
151128 vector screenPos = workspace .ProjWorldToScreenNative (worldPos , GetGame ().GetWorld ());
152129 return screenPos [2 ] > 0 && screenPos [0 ] > 0 && screenPos [0 ] < width && screenPos [1 ] > 0 && screenPos [1 ] < height );
153130 }
131+ #endif
132+ /**
133+ Outputs all available magazines for a given weapon and character into a MagazineComponent array
134+ @code
135+ ChimeraCharacter player = ESE.GetLocalPlayerEntity();
136+ BaseWeaponComponent weapon = ESE.GetCurrentWeapon(player);
137+ array<MagazineComponent> arr = {};
154138
139+ ESE.FetchMagazines(player, weapon, arr);
140+ @endcode
141+ */
142+ static void FetchMagazines (ChimeraCharacter character , BaseWeaponComponent weapon , inout array < MagazineComponent > magazines )
143+ {
144+ magazines .Clear ();
145+ if (!character || !weapon || !weapon .GetCurrentMuzzle ())
146+ return ;
147+
148+ InventoryStorageManagerComponent inventory = character .GetCharacterController ().GetInventoryStorageManager ();
149+ if (!inventory )
150+ return ;
151+
152+ BaseMuzzleComponent currentMuzzle = weapon .GetCurrentMuzzle ();
153+ if (!currentMuzzle )
154+ return ;
155+
156+ array < typename > components = {};
157+ array < IEntity > foundItems = {};
158+ components .Insert (MagazineComponent );
159+
160+ BaseMagazineWell targetWell = currentMuzzle .GetMagazineWell (); // Well, well, well
161+ if (!targetWell )
162+ return ;
163+
164+ for (int i = inventory .FindItemsWithComponents (foundItems ,components , EStoragePurpose .PURPOSE_ANY ) - 1 ; i > -1 ; i -- )
165+ {
166+ MagazineComponent magComp = MagazineComponent .Cast (foundItems [i ].FindComponent (MagazineComponent ));
167+ if (!magComp )
168+ continue ;
169+
170+ BaseMagazineWell well = magComp .GetMagazineWell ();
171+ if (!well )
172+ continue ;
173+
174+ if (!well .Type ().IsInherited (targetWell .Type ()))
175+ continue ;
176+
177+ magazines .Insert (magComp );
178+ }
179+ }
155180 // ================================ WIP ================================
156181 #ifdef ESE_ENABLE_WIP
157182
158- // *
183+ /* *
159184 TODO - Not sure why it's not working but don't use it for now, may have to go back to the GetParent() -> GetAllChildren() type system
160185 */
161186 static void GetAllSiblings (IEntity ent , notnull inout array < IEntity > allSiblings )
0 commit comments