Ejemplo n.º 1
0
 // Token: 0x06002DC3 RID: 11715 RVA: 0x000C26E8 File Offset: 0x000C08E8
 private void FireRollerProjectile()
 {
     this.hasFiredRoller = true;
     if (this.muzzleflashEffectPrefab)
     {
         EffectManager.SimpleMuzzleFlash(this.muzzleflashEffectPrefab, base.gameObject, this.muzzleString, false);
     }
     if (base.isAuthority && this.projectilePrefab != null)
     {
         float   maxDistance = 1000f;
         Ray     aimRay      = base.GetAimRay();
         Vector3 forward     = aimRay.direction;
         Vector3 vector      = aimRay.origin;
         float   magnitude   = FireRoller.targetProjectileSpeed;
         if (this.muzzleTransform)
         {
             vector = this.muzzleTransform.position;
             RaycastHit raycastHit;
             if (Physics.Raycast(aimRay, out raycastHit, maxDistance, LayerIndex.world.mask))
             {
                 float   num        = magnitude;
                 Vector3 vector2    = raycastHit.point - vector;
                 Vector2 vector3    = new Vector2(vector2.x, vector2.z);
                 float   magnitude2 = vector3.magnitude;
                 float   y          = Trajectory.CalculateInitialYSpeed(magnitude2 / num, vector2.y);
                 Vector3 a          = new Vector3(vector3.x / magnitude2 * num, y, vector3.y / magnitude2 * num);
                 magnitude = a.magnitude;
                 forward   = a / magnitude;
             }
         }
         ProjectileManager.instance.FireProjectile(this.projectilePrefab, vector, Util.QuaternionSafeLookRotation(forward), base.gameObject, this.damageStat * this.damageCoefficient, 0f, Util.CheckRoll(this.critStat, base.characterBody.master), DamageColorIndex.Default, null, magnitude);
     }
 }
Ejemplo n.º 2
0
        // Token: 0x06000312 RID: 786 RVA: 0x0000C688 File Offset: 0x0000A888
        private void UpdateTrajectoryInfo()
        {
            this.aimRay = base.GetAimRay();
            RaycastHit raycastHit;

            if (Util.CharacterRaycast(base.gameObject, this.aimRay, out raycastHit, this.maxDistance, LayerIndex.world.mask | LayerIndex.entityPrecise.mask, QueryTriggerInteraction.UseGlobal))
            {
                this.hitPoint  = raycastHit.point;
                this.hitNormal = raycastHit.normal;
            }
            else
            {
                this.hitPoint  = this.aimRay.GetPoint(this.maxDistance);
                this.hitNormal = -this.aimRay.direction;
            }
            float   num       = this.projectileBaseSpeed;
            Vector3 vector    = this.hitPoint - this.aimRay.origin;
            Vector2 vector2   = new Vector2(vector.x, vector.z);
            float   magnitude = vector2.magnitude;
            float   y         = Trajectory.CalculateInitialYSpeed(magnitude / num, vector.y);
            Vector3 a         = new Vector3(vector2.x / magnitude * num, y, vector2.y / magnitude * num);

            this.speedOverride = a.magnitude;
            this.finalRay      = new Ray(this.aimRay.origin, a / this.speedOverride);
            this.travelTime    = Trajectory.CalculateGroundTravelTime(num, magnitude);
        }
Ejemplo n.º 3
0
        // Token: 0x06001DF4 RID: 7668 RVA: 0x00080FE0 File Offset: 0x0007F1E0
        private void ReconstructPath(Path path, NodeGraph.LinkIndex[] cameFrom, NodeGraph.LinkIndex current, NodeGraph.PathRequest pathRequest)
        {
            int num = 1 << (int)pathRequest.hullClassification;

            path.Clear();
            if (current != NodeGraph.LinkIndex.invalid)
            {
                path.PushWaypointToFront(this.links[current.linkIndex].nodeIndexB, 0f);
            }
            while (current != NodeGraph.LinkIndex.invalid)
            {
                NodeGraph.NodeIndex nodeIndexB = this.links[current.linkIndex].nodeIndexB;
                float minJumpHeight            = 0f;
                if ((num & this.links[current.linkIndex].jumpHullMask) != 0 && this.links[current.linkIndex].minJumpHeight > 0f)
                {
                    Vector3 position  = this.nodes[this.links[current.linkIndex].nodeIndexA.nodeIndex].position;
                    Vector3 position2 = this.nodes[this.links[current.linkIndex].nodeIndexB.nodeIndex].position;
                    minJumpHeight = Trajectory.CalculateApex(Trajectory.CalculateInitialYSpeed(Trajectory.CalculateGroundTravelTime(pathRequest.maxSpeed, NodeGraph.DistanceXZ(position, position2)), position2.y - position.y));
                }
                path.PushWaypointToFront(nodeIndexB, minJumpHeight);
                if (cameFrom[this.links[current.linkIndex].nodeIndexA.nodeIndex] == NodeGraph.LinkIndex.invalid)
                {
                    path.PushWaypointToFront(this.links[current.linkIndex].nodeIndexA, 0f);
                }
                current = cameFrom[this.links[current.linkIndex].nodeIndexA.nodeIndex];
            }
            path.status = PathStatus.Valid;
        }
Ejemplo n.º 4
0
            public void FixedUpdate()
            {
                if (!body.outOfCombat)
                {
                    timer += Time.fixedDeltaTime;
                    if (timer >= interval)
                    {
                        timer = 0;

                        var   crit         = body.RollCrit();
                        float initialAngle = UnityEngine.Random.value * 360f;

                        bool       accurateShot        = false;
                        RaycastHit accurateShotRaycast = default(RaycastHit);
                        if (accurateShotChance > 0f && Util.CheckRoll(accurateShotChance) && body.inputBank && body.inputBank.GetAimRaycast(300f, out accurateShotRaycast))
                        {
                            accurateShot = true;
                        }

                        for (var i = 0; i < sparksToFire; i++)
                        {
                            Vector3 fireOrigin = body.corePosition;
                            Vector3 direction  = Vector3.up;
                            direction = Quaternion.AngleAxis(UnityEngine.Random.value * coneAngle, Vector3.forward) * direction;
                            direction = Quaternion.AngleAxis(initialAngle + 360f / sparksToFire * i, Vector3.up) * direction;
                            float speed = UnityEngine.Random.Range(minSpeed, maxSpeed);

                            if (accurateShot && i == 0)
                            {
                                float accurateShotTime = UnityEngine.Random.Range(0.2f, 0.5f);

                                var distance = accurateShotRaycast.point - fireOrigin;
                                direction = new Vector3(
                                    distance.x / accurateShotTime,
                                    Trajectory.CalculateInitialYSpeed(accurateShotTime, distance.y),
                                    distance.z / accurateShotTime
                                    );
                                speed = direction.magnitude;
                            }

                            ProjectileManager.instance.FireProjectile(
                                sparkProjectilePrefab,
                                fireOrigin,
                                Util.QuaternionSafeLookRotation(direction),
                                body.gameObject,
                                body.damage * (damage / 100f + damagePerStack / 100f * (float)(stack - 1)),
                                0f,
                                crit,
                                DamageColorIndex.Default,
                                null,
                                speed
                                );
                        }
                    }
                }
            }
Ejemplo n.º 5
0
        // Token: 0x06002FBE RID: 12222 RVA: 0x000CC8C8 File Offset: 0x000CAAC8
        private void Fire()
        {
            Ray            aimRay         = base.GetAimRay();
            Ray            ray            = new Ray(aimRay.origin, Vector3.up);
            BullseyeSearch bullseyeSearch = new BullseyeSearch();

            bullseyeSearch.searchOrigin    = aimRay.origin;
            bullseyeSearch.searchDirection = aimRay.direction;
            bullseyeSearch.filterByLoS     = false;
            bullseyeSearch.teamMaskFilter  = TeamMask.allButNeutral;
            if (base.teamComponent)
            {
                bullseyeSearch.teamMaskFilter.RemoveTeam(base.teamComponent.teamIndex);
            }
            bullseyeSearch.sortMode = BullseyeSearch.SortMode.Angle;
            bullseyeSearch.RefreshCandidates();
            HurtBox    hurtBox = bullseyeSearch.GetResults().FirstOrDefault <HurtBox>();
            bool       flag    = false;
            Vector3    a       = Vector3.zero;
            RaycastHit raycastHit;

            if (hurtBox)
            {
                a    = hurtBox.transform.position;
                flag = true;
            }
            else if (Physics.Raycast(aimRay, out raycastHit, 1000f, LayerIndex.world.mask | LayerIndex.entityPrecise.mask, QueryTriggerInteraction.Ignore))
            {
                a    = raycastHit.point;
                flag = true;
            }
            float magnitude = FireMortar.projectileVelocity;

            if (flag)
            {
                Vector3 vector     = a - ray.origin;
                Vector2 a2         = new Vector2(vector.x, vector.z);
                float   magnitude2 = a2.magnitude;
                Vector2 vector2    = a2 / magnitude2;
                if (magnitude2 < FireMortar.minimumDistance)
                {
                    magnitude2 = FireMortar.minimumDistance;
                }
                float   y         = Trajectory.CalculateInitialYSpeed(FireMortar.timeToTarget, vector.y);
                float   num       = magnitude2 / FireMortar.timeToTarget;
                Vector3 direction = new Vector3(vector2.x * num, y, vector2.y * num);
                magnitude     = direction.magnitude;
                ray.direction = direction;
            }
            for (int i = 0; i < FireMortar.mortarCount; i++)
            {
                Quaternion rotation = Util.QuaternionSafeLookRotation(ray.direction + ((i != 0) ? (UnityEngine.Random.insideUnitSphere * 0.05f) : Vector3.zero));
                ProjectileManager.instance.FireProjectile(FireMortar.mortarProjectilePrefab, ray.origin, rotation, base.gameObject, this.damageStat * FireMortar.mortarDamageCoefficient, 0f, Util.CheckRoll(this.critStat, base.characterBody.master), DamageColorIndex.Default, null, magnitude);
            }
        }
Ejemplo n.º 6
0
        // Token: 0x060008BD RID: 2237 RVA: 0x0002BE08 File Offset: 0x0002A008
        private void FireGrenade(string targetMuzzle)
        {
            base.PlayCrossfade("Gesture, Bombardment", "FireBombardment", 0.1f);
            Util.PlaySound(FireBombardment.shootSoundString, base.gameObject);
            this.aimRay = base.GetAimRay();
            Vector3 vector = this.aimRay.origin;

            if (this.modelTransform)
            {
                ChildLocator component = this.modelTransform.GetComponent <ChildLocator>();
                if (component)
                {
                    Transform transform = component.FindChild(targetMuzzle);
                    if (transform)
                    {
                        vector = transform.position;
                    }
                }
            }
            base.AddRecoil(-1f * FireBombardment.recoilAmplitude, -2f * FireBombardment.recoilAmplitude, -1f * FireBombardment.recoilAmplitude, 1f * FireBombardment.recoilAmplitude);
            if (FireBombardment.effectPrefab)
            {
                EffectManager.instance.SimpleMuzzleFlash(FireBombardment.effectPrefab, base.gameObject, targetMuzzle, false);
            }
            if (base.isAuthority)
            {
                float      num = -1f;
                RaycastHit raycastHit;
                if (Util.CharacterRaycast(base.gameObject, this.aimRay, out raycastHit, float.PositiveInfinity, LayerIndex.world.mask | LayerIndex.entityPrecise.mask, QueryTriggerInteraction.Ignore))
                {
                    Vector3 point     = raycastHit.point;
                    float   velocity  = FireBombardment.projectilePrefab.GetComponent <ProjectileSimple>().velocity;
                    Vector3 vector2   = point - vector;
                    Vector2 vector3   = new Vector2(vector2.x, vector2.z);
                    float   magnitude = vector3.magnitude;
                    float   y         = Trajectory.CalculateInitialYSpeed(magnitude / velocity, vector2.y);
                    Vector3 a         = new Vector3(vector3.x / magnitude * velocity, y, vector3.y / magnitude * velocity);
                    num = a.magnitude;
                    this.aimRay.direction = a / num;
                }
                float   x       = UnityEngine.Random.Range(0f, base.characterBody.spreadBloomAngle);
                float   z       = UnityEngine.Random.Range(0f, 360f);
                Vector3 up      = Vector3.up;
                Vector3 axis    = Vector3.Cross(up, this.aimRay.direction);
                Vector3 vector4 = Quaternion.Euler(0f, 0f, z) * (Quaternion.Euler(x, 0f, 0f) * Vector3.forward);
                float   y2      = vector4.y;
                vector4.y = 0f;
                float   angle   = Mathf.Atan2(vector4.z, vector4.x) * 57.29578f - 90f;
                float   angle2  = Mathf.Atan2(y2, vector4.magnitude) * 57.29578f;
                Vector3 forward = Quaternion.AngleAxis(angle, up) * (Quaternion.AngleAxis(angle2, axis) * this.aimRay.direction);
                ProjectileManager.instance.FireProjectile(FireBombardment.projectilePrefab, vector, Util.QuaternionSafeLookRotation(forward), base.gameObject, this.damageStat * FireBombardment.damageCoefficient, 0f, Util.CheckRoll(this.critStat, base.characterBody.master), DamageColorIndex.Default, null, num);
            }
            base.characterBody.AddSpreadBloom(FireBombardment.spreadBloomValue);
        }
        // Token: 0x06002964 RID: 10596 RVA: 0x000AE168 File Offset: 0x000AC368
        protected virtual void UpdateTrajectoryInfo(out AimThrowableBase.TrajectoryInfo dest)
        {
            dest = default(AimThrowableBase.TrajectoryInfo);
            Ray        aimRay     = base.GetAimRay();
            RaycastHit raycastHit = default(RaycastHit);
            bool       flag       = false;

            if (this.rayRadius > 0f && Util.CharacterSpherecast(base.gameObject, aimRay, this.rayRadius, out raycastHit, this.maxDistance, LayerIndex.CommonMasks.bullet, QueryTriggerInteraction.UseGlobal) && raycastHit.collider.GetComponent <HurtBox>())
            {
                flag = true;
            }
            if (!flag)
            {
                flag = Util.CharacterRaycast(base.gameObject, aimRay, out raycastHit, this.maxDistance, LayerIndex.CommonMasks.bullet, QueryTriggerInteraction.UseGlobal);
            }
            if (flag)
            {
                dest.hitPoint  = raycastHit.point;
                dest.hitNormal = raycastHit.normal;
            }
            else
            {
                dest.hitPoint  = aimRay.GetPoint(this.maxDistance);
                dest.hitNormal = -aimRay.direction;
            }
            Vector3 vector = dest.hitPoint - aimRay.origin;

            if (this.useGravity)
            {
                float   num       = this.projectileBaseSpeed;
                Vector2 vector2   = new Vector2(vector.x, vector.z);
                float   magnitude = vector2.magnitude;
                float   y         = Trajectory.CalculateInitialYSpeed(magnitude / num, vector.y);
                Vector3 a         = new Vector3(vector2.x / magnitude * num, y, vector2.y / magnitude * num);
                dest.speedOverride = a.magnitude;
                dest.finalRay      = new Ray(aimRay.origin, a / dest.speedOverride);
                dest.travelTime    = Trajectory.CalculateGroundTravelTime(num, magnitude);
                return;
            }
            dest.speedOverride = this.projectileBaseSpeed;
            dest.finalRay      = aimRay;
            dest.travelTime    = this.projectileBaseSpeed / vector.magnitude;
        }
Ejemplo n.º 8
0
            // Token: 0x06001D93 RID: 7571 RVA: 0x0008A328 File Offset: 0x00088528
            public float JumpTest(Vector3 startCenterOfCapsulePos, Vector3 endCenterOfCapsulePos, float hSpeed)
            {
                float y = Trajectory.CalculateInitialYSpeed(Trajectory.CalculateGroundTravelTime(hSpeed, MapNode.MoveProbe.DistanceXZ(startCenterOfCapsulePos, endCenterOfCapsulePos)), endCenterOfCapsulePos.y - startCenterOfCapsulePos.y);

                this.testCharacterController.Move(Vector3.zero);
                Vector3 a = endCenterOfCapsulePos - startCenterOfCapsulePos;

                a.y = 0f;
                a.Normalize();
                a  *= hSpeed;
                a.y = y;
                float num = MapNode.MoveProbe.DistanceXZ(startCenterOfCapsulePos, endCenterOfCapsulePos);

                this.testCharacterController.transform.position = startCenterOfCapsulePos;
                int     num2 = Mathf.CeilToInt(num * 1.5f / hSpeed / this.testTimeStep);
                float   num3 = float.NegativeInfinity;
                Vector3 rhs  = this.testCharacterController.transform.position;

                for (int i = 0; i < num2; i++)
                {
                    Vector3 vector = endCenterOfCapsulePos - this.testCharacterController.transform.position;
                    if (vector.sqrMagnitude <= 4f)
                    {
                        return(num3 - startCenterOfCapsulePos.y);
                    }
                    num3 = Mathf.Max(this.testCharacterController.transform.position.y, num3);
                    Vector3 vector2 = vector;
                    vector2.y = 0f;
                    vector2.Normalize();
                    a.x = vector2.x * hSpeed;
                    a.z = vector2.z * hSpeed;
                    a  += Physics.gravity * this.testTimeStep;
                    this.testCharacterController.Move(a * this.testTimeStep);
                    Vector3 position = this.testCharacterController.transform.position;
                    if (position == rhs)
                    {
                        return(0f);
                    }
                    rhs = position;
                }
                return(0f);
            }
        // Token: 0x06002C8E RID: 11406 RVA: 0x000BBE68 File Offset: 0x000BA068
        private void Fire()
        {
            Ray        aimRay = base.GetAimRay();
            Ray        ray    = aimRay;
            Ray        ray2   = aimRay;
            Vector3    point  = aimRay.GetPoint(ThrowSack.minimumDistance);
            bool       flag   = false;
            RaycastHit raycastHit;

            if (Util.CharacterRaycast(base.gameObject, ray, out raycastHit, 500f, LayerIndex.world.mask | LayerIndex.entityPrecise.mask, QueryTriggerInteraction.Ignore))
            {
                point = raycastHit.point;
                flag  = true;
            }
            float magnitude = ThrowSack.projectileVelocity;

            if (flag)
            {
                Vector3 vector     = point - ray2.origin;
                Vector2 a          = new Vector2(vector.x, vector.z);
                float   magnitude2 = a.magnitude;
                Vector2 vector2    = a / magnitude2;
                if (magnitude2 < ThrowSack.minimumDistance)
                {
                    magnitude2 = ThrowSack.minimumDistance;
                }
                float   y         = Trajectory.CalculateInitialYSpeed(ThrowSack.timeToTarget, vector.y);
                float   num       = magnitude2 / ThrowSack.timeToTarget;
                Vector3 direction = new Vector3(vector2.x * num, y, vector2.y * num);
                magnitude      = direction.magnitude;
                ray2.direction = direction;
            }
            for (int i = 0; i < ThrowSack.projectileCount; i++)
            {
                Quaternion rotation = Util.QuaternionSafeLookRotation(Util.ApplySpread(ray2.direction, ThrowSack.minSpread, ThrowSack.maxSpread, 1f, 1f, 0f, 0f));
                ProjectileManager.instance.FireProjectile(ThrowSack.projectilePrefab, ray2.origin, rotation, base.gameObject, this.damageStat * ThrowSack.damageCoefficient, 0f, Util.CheckRoll(this.critStat, base.characterBody.master), DamageColorIndex.Default, null, magnitude);
            }
        }
Ejemplo n.º 10
0
        // Token: 0x06000914 RID: 2324 RVA: 0x0002D960 File Offset: 0x0002BB60
        public override void OnEnter()
        {
            base.OnEnter();
            string muzzleName = "Mouth";

            this.duration = FireSpit.baseDuration / this.attackSpeedStat;
            if (FireSpit.effectPrefab)
            {
                EffectManager.instance.SimpleMuzzleFlash(FireSpit.effectPrefab, base.gameObject, muzzleName, false);
            }
            base.PlayCrossfade("Gesture", "FireSpit", "FireSpit.playbackRate", this.duration, 0.1f);
            this.aimRay = base.GetAimRay();
            float magnitude = FireSpit.projectileHSpeed;
            Ray   ray       = this.aimRay;

            ray.origin = this.aimRay.GetPoint(6f);
            RaycastHit raycastHit;

            if (Util.CharacterRaycast(base.gameObject, ray, out raycastHit, float.PositiveInfinity, LayerIndex.world.mask | LayerIndex.entityPrecise.mask, QueryTriggerInteraction.Ignore))
            {
                float   num        = magnitude;
                Vector3 vector     = raycastHit.point - this.aimRay.origin;
                Vector2 vector2    = new Vector2(vector.x, vector.z);
                float   magnitude2 = vector2.magnitude;
                float   y          = Trajectory.CalculateInitialYSpeed(magnitude2 / num, vector.y);
                Vector3 a          = new Vector3(vector2.x / magnitude2 * num, y, vector2.y / magnitude2 * num);
                magnitude             = a.magnitude;
                this.aimRay.direction = a / magnitude;
            }
            EffectManager.instance.SimpleMuzzleFlash(FireSpit.effectPrefab, base.gameObject, muzzleName, false);
            if (base.isAuthority)
            {
                for (int i = 0; i < FireSpit.projectileCount; i++)
                {
                    this.FireBlob(this.aimRay, 0f, ((float)FireSpit.projectileCount / 2f - (float)i) * FireSpit.yawSpread, magnitude);
                }
            }
        }
Ejemplo n.º 11
0
        private void UpdateTrajInfo(out TrajectoryInfo traj)
        {
            traj = default(TrajectoryInfo);
            Ray        aimRay = base.GetAimRay();
            RaycastHit rHit   = default(RaycastHit);

            Vector3 direction = aimRay.direction;

            direction.y = Mathf.Max(direction.y, EntityStates.Croco.BaseLeap.minimumY);
            Vector3 a  = direction.normalized * EntityStates.Croco.BaseLeap.aimVelocity * this.moveSpeedStat;
            Vector3 b  = Vector3.up * EntityStates.Croco.BaseLeap.upwardVelocity;
            Vector3 b2 = new Vector3(direction.x, 0f, direction.z).normalized *EntityStates.Croco.BaseLeap.forwardVelocity;

            Vector3 velocity     = a + b + b2;
            Vector3 tempVelocity = velocity;
            Ray     r            = new Ray(aimRay.origin, velocity);

            Single time     = Trajectory.CalculateFlightDuration(velocity.y);
            Single timeStep = time / 25f;

            Vector3 oldPos = aimRay.origin;

            Boolean hit = false;

            List <Vector3> vecs = new List <Vector3>(100);

            for (Int32 i = 0; i < 100; i++)
            {
                Vector3 pos = Trajectory.CalculatePositionAtTime(r.origin, tempVelocity, timeStep * i, Physics.gravity.y);

                tempVelocity *= Mathf.Exp(timeStep * -0.4f);

                hit = Physics.SphereCast(oldPos, 0.2f, (pos - oldPos), out rHit, (pos - oldPos).magnitude, LayerIndex.world.mask | LayerIndex.entityPrecise.mask, QueryTriggerInteraction.UseGlobal);
                if (hit)
                {
                    break;
                }

                oldPos = pos;
                vecs.Add(pos);
            }

            arcLineRender.positionCount = vecs.Count;
            arcLineRender.SetPositions(vecs.ToArray());

            if (hit)
            {
                traj.hitPoint  = rHit.point;
                traj.hitNormal = rHit.normal;
            }
            else
            {
                traj.hitPoint  = oldPos;
                traj.hitNormal = Vector3.up;
            }

            Vector3 diff = traj.hitPoint - aimRay.origin;

            if (useGravity)
            {
                Single  speed    = velocity.magnitude;
                Vector2 flatDiff = new Vector2(diff.x, diff.z);
                Single  flatDist = flatDiff.magnitude;
                Single  yStart   = Trajectory.CalculateInitialYSpeed(flatDist / speed, diff.y);

                Vector3 speedVec = new Vector3(flatDiff.x / flatDist * speed, yStart, flatDiff.y / flatDist * speed);

                traj.speedOverride = speedVec.magnitude;
                traj.finalRay      = new Ray(aimRay.origin, speedVec / traj.speedOverride);
                traj.travelTime    = Trajectory.CalculateGroundTravelTime(speed, flatDist);
                return;
            }

            traj.speedOverride = baseSpeed;
            traj.finalRay      = aimRay;
            traj.travelTime    = baseSpeed / diff.magnitude;
        }
Ejemplo n.º 12
0
        private void FireGrenade(string targetMuzzle)
        {
            Ray       aimRay    = base.GetAimRay();
            Ray       ray       = new Ray(aimRay.origin, Vector3.up);
            Transform transform = base.FindModelChild(targetMuzzle);

            if (transform)
            {
                ray.origin = transform.position;
            }
            BullseyeSearch bullseyeSearch = new BullseyeSearch();

            bullseyeSearch.searchOrigin    = aimRay.origin;
            bullseyeSearch.searchDirection = aimRay.direction;
            bullseyeSearch.filterByLoS     = false;
            bullseyeSearch.teamMaskFilter  = TeamMask.allButNeutral;
            if (base.teamComponent)
            {
                bullseyeSearch.teamMaskFilter.RemoveTeam(base.teamComponent.teamIndex);
            }
            bullseyeSearch.sortMode = BullseyeSearch.SortMode.Angle;
            bullseyeSearch.RefreshCandidates();
            HurtBox    hurtBox = bullseyeSearch.GetResults().FirstOrDefault <HurtBox>();
            bool       flag    = false;
            Vector3    a       = Vector3.zero;
            RaycastHit raycastHit;

            if (hurtBox)
            {
                a    = hurtBox.transform.position;
                flag = true;
            }
            else if (Physics.Raycast(aimRay, out raycastHit, 1000f, LayerIndex.world.mask | LayerIndex.entityPrecise.mask, QueryTriggerInteraction.Ignore))
            {
                a    = raycastHit.point;
                flag = true;
            }
            float magnitude = SporeGrenade.projectileVelocity;

            if (flag)
            {
                Vector3 vector     = a - ray.origin;
                Vector2 a2         = new Vector2(vector.x, vector.z);
                float   magnitude2 = a2.magnitude;
                Vector2 vector2    = a2 / magnitude2;
                if (magnitude2 < SporeGrenade.minimumDistance)
                {
                    magnitude2 = SporeGrenade.minimumDistance;
                }
                if (magnitude2 > SporeGrenade.maximumDistance)
                {
                    magnitude2 = SporeGrenade.maximumDistance;
                }
                float   y         = Trajectory.CalculateInitialYSpeed(SporeGrenade.timeToTarget, vector.y);
                float   num       = magnitude2 / SporeGrenade.timeToTarget;
                Vector3 direction = new Vector3(vector2.x * num, y, vector2.y * num);
                magnitude     = direction.magnitude;
                ray.direction = direction;
            }
            for (float num = 0f; num < 9f; num += 1f)
            {
                float   num2    = 6.2831855f;
                Vector3 forward = new Vector3(Mathf.Cos(num / 9f * num2), 0f, Mathf.Sin(num / 9f * num2));
                ProjectileManager.instance.FireProjectile(SporeGrenade.projectilePrefab, ray.origin, Quaternion.LookRotation(forward), base.gameObject, this.damageStat * SporeGrenade.damageCoefficient, 0f, base.RollCrit(), DamageColorIndex.Default, null, magnitude - 10);
            }
        }
Ejemplo n.º 13
0
        // Token: 0x06001DF2 RID: 7666 RVA: 0x00080B04 File Offset: 0x0007ED04
        public PathTask ComputePath(NodeGraph.PathRequest pathRequest)
        {
            PathTask pathTask = new PathTask(pathRequest.path);

            pathTask.status = PathTask.TaskStatus.Running;
            NodeGraph.NodeIndex nodeIndex  = this.FindClosestNode(pathRequest.startPos, pathRequest.hullClassification);
            NodeGraph.NodeIndex nodeIndex2 = this.FindClosestNode(pathRequest.endPos, pathRequest.hullClassification);
            if (nodeIndex.nodeIndex == NodeGraph.NodeIndex.invalid.nodeIndex || nodeIndex2.nodeIndex == NodeGraph.NodeIndex.invalid.nodeIndex)
            {
                pathRequest.path.Clear();
                pathTask.status = PathTask.TaskStatus.Complete;
                return(pathTask);
            }
            int num = 1 << (int)pathRequest.hullClassification;

            bool[] array  = new bool[this.nodes.Length];
            bool[] array2 = new bool[this.nodes.Length];
            array2[nodeIndex.nodeIndex] = true;
            int i = 1;

            NodeGraph.NodeIndex[] array3 = new NodeGraph.NodeIndex[this.nodes.Length];
            array3[0] = nodeIndex;
            NodeGraph.LinkIndex[] array4 = new NodeGraph.LinkIndex[this.nodes.Length];
            for (int j = 0; j < array4.Length; j++)
            {
                array4[j] = NodeGraph.LinkIndex.invalid;
            }
            float[] array5 = new float[this.nodes.Length];
            for (int k = 0; k < array5.Length; k++)
            {
                array5[k] = float.PositiveInfinity;
            }
            array5[nodeIndex.nodeIndex] = 0f;
            float[] array6 = new float[this.nodes.Length];
            for (int l = 0; l < array6.Length; l++)
            {
                array6[l] = float.PositiveInfinity;
            }
            array6[nodeIndex.nodeIndex] = this.HeuristicCostEstimate(pathRequest.startPos, pathRequest.endPos);
            while (i > 0)
            {
                NodeGraph.NodeIndex invalid = NodeGraph.NodeIndex.invalid;
                float num2 = float.PositiveInfinity;
                for (int m = 0; m < i; m++)
                {
                    int nodeIndex3 = array3[m].nodeIndex;
                    if (array6[nodeIndex3] <= num2)
                    {
                        num2    = array6[nodeIndex3];
                        invalid = new NodeGraph.NodeIndex(nodeIndex3);
                    }
                }
                if (invalid.nodeIndex == nodeIndex2.nodeIndex)
                {
                    this.ReconstructPath(pathRequest.path, array4, array4[invalid.nodeIndex], pathRequest);
                    pathTask.status = PathTask.TaskStatus.Complete;
                    return(pathTask);
                }
                array2[invalid.nodeIndex] = false;
                NodeGraph.ArrayRemoveNodeIndex(array3, invalid, i);
                i--;
                array[invalid.nodeIndex] = true;
                NodeGraph.LinkListIndex linkListIndex = this.nodes[invalid.nodeIndex].linkListIndex;
                NodeGraph.LinkIndex     linkIndex     = new NodeGraph.LinkIndex
                {
                    linkIndex = linkListIndex.index
                };
                NodeGraph.LinkIndex linkIndex2 = new NodeGraph.LinkIndex
                {
                    linkIndex = linkListIndex.index + (int)linkListIndex.size
                };
                while (linkIndex.linkIndex < linkIndex2.linkIndex)
                {
                    NodeGraph.Link      link       = this.links[linkIndex.linkIndex];
                    NodeGraph.NodeIndex nodeIndexB = link.nodeIndexB;
                    if (!array[nodeIndexB.nodeIndex])
                    {
                        if ((num & link.jumpHullMask) != 0 && this.links[linkIndex.linkIndex].minJumpHeight > 0f)
                        {
                            Vector3 position  = this.nodes[link.nodeIndexA.nodeIndex].position;
                            Vector3 position2 = this.nodes[link.nodeIndexB.nodeIndex].position;
                            if (Trajectory.CalculateApex(Trajectory.CalculateInitialYSpeed(Trajectory.CalculateGroundTravelTime(pathRequest.maxSpeed, NodeGraph.DistanceXZ(position, position2)), position2.y - position.y)) > pathRequest.maxJumpHeight)
                            {
                                goto IL_41A;
                            }
                        }
                        if ((link.hullMask & num) != 0 && (link.gateIndex == 0 || this.openGates[(int)link.gateIndex]))
                        {
                            float num3 = array5[invalid.nodeIndex] + link.distanceScore;
                            if (!array2[nodeIndexB.nodeIndex])
                            {
                                array2[nodeIndexB.nodeIndex] = true;
                                array3[i] = nodeIndexB;
                                i++;
                            }
                            else if (num3 >= array5[nodeIndexB.nodeIndex])
                            {
                                goto IL_41A;
                            }
                            array4[nodeIndexB.nodeIndex] = linkIndex;
                            array5[nodeIndexB.nodeIndex] = num3;
                            array6[nodeIndexB.nodeIndex] = array5[nodeIndexB.nodeIndex] + this.HeuristicCostEstimate(this.nodes[nodeIndexB.nodeIndex].position, this.nodes[nodeIndex2.nodeIndex].position);
                        }
                    }
IL_41A:
                    linkIndex.linkIndex++;
                }
            }
            pathRequest.path.Clear();
            pathTask.status = PathTask.TaskStatus.Complete;
            return(pathTask);
        }