@@ -61,6 +61,18 @@ public class DaggerfallMissile : MonoBehaviour
6161 public const float SphereCastRadius = 0.25f ;
6262 public const float TouchRange = 3.0f ;
6363
64+ private static readonly Collider [ ] aoeBuffer = new Collider [ 64 ] ;
65+ private readonly List < DaggerfallEntityBehaviour > tmpTargets = new List < DaggerfallEntityBehaviour > ( 32 ) ;
66+
67+ // Cached references
68+ private GameManager gm ;
69+ private Camera mainCamera ;
70+ private WeaponManager weaponManager ;
71+ private Collider casterCollider ;
72+ private EnemySenses cachedEnemySenses ;
73+ private EnemyAttack cachedEnemyAttack ;
74+ private CharacterController casterController ;
75+
6476 Vector3 colliderPosition ;
6577
6678 Vector3 direction ;
@@ -170,39 +182,53 @@ public DaggerfallEntityBehaviour[] Targets
170182 private void Awake ( )
171183 {
172184 audioSource = transform . GetComponent < DaggerfallAudioSource > ( ) ;
185+
186+ gm = GameManager . Instance ;
187+ mainCamera = gm . MainCamera ;
188+ weaponManager = gm . WeaponManager ;
189+ audioSource = GetComponent < DaggerfallAudioSource > ( ) ;
173190 }
174191
175192 private void Start ( )
176193 {
177194 // Setup light and shadows
178195 myLight = GetComponent < Light > ( ) ;
179- myLight . enabled = EnableLight ;
196+ myLight . enabled = EnableLight && DaggerfallUnity . Settings . EnableSpellLighting ;
180197 forceDisableSpellLighting = ! DaggerfallUnity . Settings . EnableSpellLighting ;
181- if ( forceDisableSpellLighting ) myLight . enabled = false ;
182- if ( ! DaggerfallUnity . Settings . EnableSpellShadows ) myLight . shadows = LightShadows . None ;
198+ if ( ! DaggerfallUnity . Settings . EnableSpellShadows )
199+ {
200+ myLight . shadows = LightShadows . None ;
201+ }
202+
183203 initialRange = myLight . range ;
184204 initialIntensity = myLight . intensity ;
185205
186206 // Use payload when available
187207 if ( payload != null )
188208 {
189- // Set payload missile properties
190209 caster = payload . CasterEntityBehaviour ;
191210 targetType = payload . Settings . TargetType ;
192211 elementType = payload . Settings . ElementType ;
193212
194213 // Set spell billboard anims automatically from payload for mobile missiles
195- if ( targetType == TargetTypes . SingleTargetAtRange ||
196- targetType == TargetTypes . AreaAtRange )
214+ if ( targetType == TargetTypes . SingleTargetAtRange || targetType == TargetTypes . AreaAtRange )
197215 {
198216 UseSpellBillboardAnims ( ) ;
199217 }
200218 }
201219
202220 // Setup senses
203- if ( caster && caster != GameManager . Instance . PlayerEntityBehaviour )
221+ if ( caster )
204222 {
205- enemySenses = caster . GetComponent < EnemySenses > ( ) ;
223+ casterCollider = caster . GetComponent < Collider > ( ) ;
224+ cachedEnemySenses = caster . GetComponent < EnemySenses > ( ) ;
225+ cachedEnemyAttack = caster . GetComponent < EnemyAttack > ( ) ;
226+ casterController = caster . GetComponent < CharacterController > ( ) ;
227+ }
228+
229+ if ( caster && caster != gm . PlayerEntityBehaviour )
230+ {
231+ enemySenses = cachedEnemySenses ;
206232 }
207233
208234 // Setup arrow
@@ -230,13 +256,11 @@ private void Start()
230256 static void InitializeLayerMasks ( )
231257 {
232258 layerMaskDefault = Physics . DefaultRaycastLayers ;
233- layerMaskDefault &= ~ ( 1 << Physics . IgnoreRaycastLayer ) ;
234259 layerMaskDefault &= ~ ( 1 << LayerMask . NameToLayer ( "Automap" ) ) ;
235260
236261 layerMaskPlayer = Physics . DefaultRaycastLayers ;
237- layerMaskPlayer &= ~ ( 1 << Physics . IgnoreRaycastLayer ) ;
238- layerMaskPlayer &= ~ ( 1 << LayerMask . NameToLayer ( "Player" ) ) ;
239262 layerMaskPlayer &= ~ ( 1 << LayerMask . NameToLayer ( "Automap" ) ) ;
263+ layerMaskPlayer &= ~ ( 1 << LayerMask . NameToLayer ( "Player" ) ) ;
240264 }
241265
242266 private void Update ( )
@@ -398,10 +422,12 @@ public static DaggerfallEntityBehaviour GetEntityTargetInTouchRange(Vector3 aimP
398422 // Origin point of ray is set back slightly to fix issue where strikes against target capsules touching caster capsule do not connect
399423 RaycastHit hit ;
400424 Ray ray = new Ray ( aimPosition , aimDirection ) ;
401- if ( Physics . SphereCast ( ray , SphereCastRadius , out hit , TouchRange , layerMaskTouch ) )
425+ if ( Physics . SphereCast ( ray , SphereCastRadius , out hit , TouchRange , layerMaskTouch , QueryTriggerInteraction . Ignore ) )
426+ {
402427 return hit . transform . GetComponent < DaggerfallEntityBehaviour > ( ) ;
403- else
404- return null ;
428+ }
429+
430+ return null ;
405431 }
406432
407433 #endregion
@@ -437,29 +463,34 @@ void DoMissile()
437463 // AOE can strike any number of targets within range with an option to exclude caster
438464 void DoAreaOfEffect ( Vector3 position , bool ignoreCaster = false )
439465 {
440- List < DaggerfallEntityBehaviour > entities = new List < DaggerfallEntityBehaviour > ( ) ;
441-
442466 colliderPosition = position ;
443467
444- // Collect AOE targets and ignore duplicates
445- Collider [ ] overlaps = Physics . OverlapSphere ( position , ExplosionRadius ) ;
446- for ( int i = 0 ; i < overlaps . Length ; i ++ )
468+ int count = Physics . OverlapSphereNonAlloc ( position , ExplosionRadius , aoeBuffer , layerMaskDefault , QueryTriggerInteraction . Ignore ) ;
469+ tmpTargets . Clear ( ) ;
470+
471+ for ( int i = 0 ; i < count ; i ++ )
447472 {
448- DaggerfallEntityBehaviour aoeEntity = overlaps [ i ] . GetComponent < DaggerfallEntityBehaviour > ( ) ;
473+ var beh = aoeBuffer [ i ] . GetComponent < DaggerfallEntityBehaviour > ( ) ;
474+ if ( ! beh )
475+ {
476+ continue ;
477+ }
449478
450- if ( ignoreCaster && aoeEntity == caster )
479+ if ( ignoreCaster && beh == caster )
480+ {
451481 continue ;
482+ }
452483
453- if ( aoeEntity && ! targetEntities . Contains ( aoeEntity ) )
484+ if ( ! targetEntities . Contains ( beh ) )
454485 {
455- entities . Add ( aoeEntity ) ;
456- //Debug.LogFormat("Missile hit target {0} by AOE", aoeEntity.name);
486+ tmpTargets . Add ( beh ) ;
457487 }
458488 }
459489
460- // Add collection to target entities
461- if ( entities . Count > 0 )
462- targetEntities . AddRange ( entities ) ;
490+ if ( tmpTargets . Count > 0 )
491+ {
492+ targetEntities . AddRange ( tmpTargets ) ;
493+ }
463494
464495 impactDetected = true ;
465496 missileReleased = true ;
@@ -485,21 +516,24 @@ Vector3 GetAimPosition()
485516 {
486517 // Offset up so it comes from same place LOS check is done from
487518 Vector3 adjust ;
488- if ( caster != GameManager . Instance . PlayerEntityBehaviour )
519+ if ( caster != gm . PlayerEntityBehaviour )
489520 {
490- CharacterController controller = caster . transform . GetComponent < CharacterController > ( ) ;
491521 adjust = caster . transform . forward * 0.6f ;
492- adjust . y += controller . height / 3 ;
522+ if ( casterController )
523+ {
524+ adjust . y += casterController . height / 3 ;
525+ }
493526 }
494527 else
495528 {
496529 // Adjust slightly downward to match bow animation
497- adjust = ( GameManager . Instance . MainCamera . transform . rotation * - Caster . transform . up ) * 0.11f ;
530+ adjust = ( gm . MainCamera . transform . rotation * - caster . transform . up ) * 0.11f ;
498531 // Adjust to the right or left to match bow animation
499- if ( ! GameManager . Instance . WeaponManager . ScreenWeapon . FlipHorizontal )
500- adjust += GameManager . Instance . MainCamera . transform . right * 0.15f ;
532+ var right = gm . MainCamera . transform . right * 0.15f ;
533+ if ( ! gm . WeaponManager . ScreenWeapon . FlipHorizontal )
534+ adjust += right ;
501535 else
502- adjust -= GameManager . Instance . MainCamera . transform . right * 0.15f ;
536+ adjust -= right ;
503537 }
504538 aimPosition += adjust ;
505539 }
@@ -631,7 +665,13 @@ void AssignBowDamageToTarget(Collider arrowHitCollider)
631665 else
632666 {
633667 Transform hitTransform = arrowHitCollider . gameObject . transform ;
634- GameManager . Instance . WeaponManager . WeaponDamage ( GameManager . Instance . WeaponManager . LastBowUsed , true , isArrowSummoned , hitTransform , hitTransform . position , goModel . transform . forward ) ;
668+ GameManager . Instance . WeaponManager . WeaponDamage (
669+ GameManager . Instance . WeaponManager . LastBowUsed ,
670+ true ,
671+ isArrowSummoned ,
672+ hitTransform ,
673+ hitTransform . position ,
674+ goModel . transform . forward ) ;
635675 }
636676 }
637677
0 commit comments