private ShaftAimingLaserBehaviour InterpolateLaser(AimingLaserTargetPointNode weapon, Vector3 startPosition, Vector3 laserDir)
        {
            bool    flag;
            bool    flag2;
            Vector3 vector3;
            Vector3 leftDirectionWorld = new MuzzleVisualAccessor(weapon.muzzlePoint).GetLeftDirectionWorld();

            laserDir = Vector3.ProjectOnPlane(laserDir, leftDirectionWorld).normalized;
            ShaftAimingLaserBehaviour effectInstance = weapon.shaftAimingLaser.EffectInstance;
            float         maxLength = weapon.shaftAimingLaser.MaxLength;
            float         minLength = weapon.shaftAimingLaser.MinLength;
            DirectionData data      = weapon.targetCollector.Collect(startPosition, laserDir, maxLength, LayerMasks.VISUAL_TARGETING);

            if (data.HasAnyHit())
            {
                flag    = true;
                flag2   = data.FirstAnyHitDistance() >= minLength;
                vector3 = data.FirstAnyHitPosition();
            }
            else
            {
                flag    = false;
                flag2   = true;
                vector3 = startPosition + (laserDir * maxLength);
            }
            bool flag3 = !weapon.shaftAimingTargetPoint.IsInsideTankPart;

            effectInstance.UpdateTargetPosition(weapon.shaftAimingLaserSource.transform.position, vector3, flag2 & flag3, flag & flag3);
            weapon.shaftAimingLaser.CurrentLaserDirection = laserDir;
            return(effectInstance);
        }
        public void UpdateLaserTargetPosition(UpdateEvent evt, AimingLaserTargetPointNode weapon, [JoinByTank] RemoteTankNode tank, [JoinAll] CameraNode camera)
        {
            Vector3 barrelOriginWorld = new MuzzleVisualAccessor(weapon.muzzlePoint).GetBarrelOriginWorld();

            this.InterpolateLaser(weapon, barrelOriginWorld, Vector3.Lerp(weapon.shaftAimingLaser.CurrentLaserDirection, Vector3.Normalize(weapon.shaftAimingTargetPoint.Point - barrelOriginWorld), weapon.shaftAimingLaser.InterpolationCoeff).normalized);
        }
        public void ShowAndInitLaser(NodeAddedEvent evt, AimingLaserTargetPointNode weapon, [Context, JoinByTank] ActiveTankNode tank, [JoinAll, Context] CameraNode camera)
        {
            Vector3 barrelOriginWorld = new MuzzleVisualAccessor(weapon.muzzlePoint).GetBarrelOriginWorld();

            this.InterpolateLaser(weapon, barrelOriginWorld, Vector3.Normalize(weapon.shaftAimingTargetPoint.Point - barrelOriginWorld)).Show();
        }
 public void HideLaser(NodeRemoveEvent evt, AimingLaserTargetPointNode weapon)
 {
     weapon.shaftAimingLaser.EffectInstance.Hide();
 }