Beispiel #1
0
        private void DoSiphon()
        {
            if (this.hasFired)
            {
                return;
            }
            this.hasFired = true;

            //if (base.isAuthority)
            //{
            tetherHandler = base.GetComponent <TetherHandler>();
            HurtBox closestHurtbox = null;

            //First check to see if we're aiming at a valid target
            Ray        aimRay      = base.GetAimRay();
            RaycastHit raycastHit  = new RaycastHit();
            bool       foundTarget = Physics.Raycast(aimRay, out raycastHit, maxDistanceFilter);

            if (foundTarget && raycastHit.collider.GetComponent <HurtBox>())
            {
                TeamIndex targetTeamIndex = raycastHit.collider.GetComponent <HurtBox>().healthComponent.body.teamComponent.teamIndex;
                //Make sure we're not targeting the same team
                if (base.GetTeam() != targetTeamIndex)
                {
                    closestHurtbox = raycastHit.collider.GetComponent <HurtBox>();
                    Debug.Log("Found aimed at object " + closestHurtbox.transform.root.name);
                }
            }
            //If we weren't aiming at something, just search for a valid nearby target
            else
            {
                //Search for all nearby targets
                BullseyeSearch bullseyeSearch = new BullseyeSearch();
                bullseyeSearch.searchOrigin      = base.transform.position;
                bullseyeSearch.searchDirection   = UnityEngine.Random.onUnitSphere;
                bullseyeSearch.maxDistanceFilter = maxDistanceFilter;
                bullseyeSearch.teamMaskFilter    = TeamMask.GetEnemyTeams(base.GetTeam());

                //Sort by distance
                bullseyeSearch.sortMode = BullseyeSearch.SortMode.Distance;
                bullseyeSearch.RefreshCandidates();
                //Remove ourselves from the search results
                //(shouldn't be there in the first place, but hey)
                bullseyeSearch.FilterOutGameObject(base.gameObject);

                //Get the closest hurtbox
                closestHurtbox = bullseyeSearch.GetResults().FirstOrDefault <HurtBox>();

                Debug.Log("Found object " + closestHurtbox.transform.root.name);
                if (closestHurtbox == default(HurtBox))
                {
                    Debug.LogError("Default value!");
                }
                if (closestHurtbox == null)
                {
                    Debug.LogError("Null value!");
                }
            }

            //Set up our grapple handler
            if (tetherHandler == null)
            {
                tetherHandler = base.gameObject.AddComponent <TetherHandler>();
                Debug.LogWarning("Added grapple handler via siphon");
            }

            //Then establish our grapple target
            if (closestHurtbox == null)
            {
                Debug.LogError("Null hurtbox");
                return;
            }


            //If we've successfully established a tether
            if (closestHurtbox)
            {
                Debug.Log("Attempting to establish tether");

                //If adding a new grapple target would go beyond our max stock
                int curNumGrappled = tetherHandler.GetGrappleTargets().Count;
                if (curNumGrappled + 1 > base.activatorSkillSlot.maxStock)
                {
                    //Remove the oldest grapple target
                    tetherHandler.ClearGrappleTarget(tetherHandler.GetGrappleTargets()[0]);
                }

                tetherHandler.SetGrappleTarget(closestHurtbox);
                tetherHandler.TETHER_TYPE = TETHER_TYPE.SIPHON;
                base.characterBody.AddBuff(WispSurvivor.Modules.Buffs.siphonSelf);
                closestHurtbox.healthComponent.body.AddBuff(WispSurvivor.Modules.Buffs.siphonTarget);
            }

            //}

            this.animator     = base.GetModelAnimator();
            this.muzzleString = "Muzzle";


            base.PlayAnimation("Gesture, Override", "FireGrapple", "FireGrapple.playbackRate", this.duration);
        }
        // Token: 0x06002DA8 RID: 11688 RVA: 0x000C1E10 File Offset: 0x000C0010
        private void FireGauntlet()
        {
            if (hasFiredGauntlet)
            {
                return;
            }
            base.characterBody.AddSpreadBloom(EntityStates.Mage.Weapon.FireFireBolt.bloom);
            hasFiredGauntlet = true;
            Ray aimRay = base.GetAimRay();

            if (childLocator)
            {
                muzzleTransform = childLocator.FindChild(muzzleString);
            }

            if (NetworkServer.active)
            {
                if (!projectilePrefab)
                {
                    projectilePrefab = Resources.Load <GameObject>("prefabs/projectiles/magefireboltbasic").InstantiateClone("magefireboltcopy");
                }

                if (!filter)
                {
                    filter = projectilePrefab.AddComponent <TeamFilter>();
                }

                if (!targeter)
                {
                    targeter = projectilePrefab.AddComponent <ProjectileTargetComponent>();
                }



                if (!steertoward)
                {
                    steertoward = projectilePrefab.AddComponent <ProjectileSteerTowardTarget>();
                    steertoward.rotationSpeed = 360f;
                }

                if (!targetfinder)
                {
                    targetfinder                      = projectilePrefab.AddComponent <ProjectileSphereTargetFinder>();
                    targetfinder.lookRange            = 16;
                    targetfinder.allowTargetLoss      = false;
                    targetfinder.onlySearchIfNoTarget = true;
                    targetfinder.testLoS              = true;
                    targetfinder.targetSearchInterval = 0.15f;
                }

                if (!projectile)
                {
                    projectile                   = projectilePrefab.AddComponent <ProjectileSimple>();
                    projectile.velocity          = 50f;
                    projectile.updateAfterFiring = true;
                }

                BullseyeSearch bullseyeSearch = new BullseyeSearch();
                bullseyeSearch.searchOrigin      = aimRay.origin;
                bullseyeSearch.searchDirection   = aimRay.direction;
                bullseyeSearch.maxDistanceFilter = 100f;
                bullseyeSearch.maxAngleFilter    = 60f;
                bullseyeSearch.teamMaskFilter    = TeamMask.allButNeutral;
                bullseyeSearch.teamMaskFilter.RemoveTeam(base.teamComponent.teamIndex);
                bullseyeSearch.sortMode = BullseyeSearch.SortMode.Angle;
                bullseyeSearch.RefreshCandidates();
                List <HurtBox> list    = bullseyeSearch.GetResults().ToList <HurtBox>();
                HurtBox        hurtBox = (list.Count > 0) ? list[0] : null;
                if (hurtBox)
                {
                    targeter.target = hurtBox.transform;
                }
                for (int i = 0; i < 2; i++)
                {
                    Quaternion direction = Util.QuaternionSafeLookRotation(aimRay.direction + (new Vector3(Random.Range(-36f, 36f), Random.Range(-36f, 36f), Random.Range(-36f, 36f)) / 360f));

                    ProjectileManager.instance.FireProjectile(projectilePrefab, aimRay.origin, direction, base.gameObject, 0.8f * damageStat, 0f, base.characterBody.RollCrit(), DamageColorIndex.Default, hurtBox ? hurtBox.gameObject : null);
                }
            }
        }
Beispiel #3
0
        // Token: 0x06002B69 RID: 11113 RVA: 0x000B6F38 File Offset: 0x000B5138
        public override void OnEnter()
        {
            base.OnEnter();
            this.duration = this.baseDuration / this.attackSpeedStat;
            base.PlayAnimation("Gesture, Additive", "FireSonicBoom");
            Util.PlaySound(this.sound, base.gameObject);
            Ray aimRay = base.GetAimRay();

            if (!string.IsNullOrEmpty(this.muzzle))
            {
                EffectManager.SimpleMuzzleFlash(this.fireEffectPrefab, base.gameObject, this.muzzle, false);
            }
            else
            {
                EffectManager.SpawnEffect(this.fireEffectPrefab, new EffectData
                {
                    origin   = aimRay.origin,
                    rotation = Quaternion.LookRotation(aimRay.direction)
                }, false);
            }
            aimRay.origin -= aimRay.direction * this.backupDistance;
            if (NetworkServer.active)
            {
                BullseyeSearch bullseyeSearch = new BullseyeSearch();
                bullseyeSearch.teamMaskFilter    = TeamMask.AllExcept(base.GetTeam());
                bullseyeSearch.maxAngleFilter    = this.fieldOfView * 0.5f;
                bullseyeSearch.maxDistanceFilter = this.maxDistance;
                bullseyeSearch.searchOrigin      = aimRay.origin;
                bullseyeSearch.searchDirection   = aimRay.direction;
                bullseyeSearch.sortMode          = BullseyeSearch.SortMode.Distance;
                bullseyeSearch.filterByLoS       = false;
                bullseyeSearch.RefreshCandidates();
                foreach (HurtBox hurtBox in bullseyeSearch.GetResults().Where(new Func <HurtBox, bool>(Util.IsValid)).Distinct(default(HurtBox.EntityEqualityComparer)))
                {
                    Vector3       vector     = hurtBox.transform.position - aimRay.origin;
                    float         magnitude  = vector.magnitude;
                    float         magnitude2 = new Vector2(vector.x, vector.z).magnitude;
                    Vector3       vector2    = vector / magnitude;
                    float         num        = 1f;
                    CharacterBody body       = hurtBox.healthComponent.body;
                    if (body.characterMotor)
                    {
                        num = body.characterMotor.mass;
                    }
                    else if (hurtBox.healthComponent.GetComponent <Rigidbody>())
                    {
                        num = base.rigidbody.mass;
                    }
                    float num2 = FireSonicBoom.shoveSuitabilityCurve.Evaluate(num);
                    this.AddDebuff(body);
                    body.RecalculateStats();
                    float   acceleration = body.acceleration;
                    Vector3 a            = vector2;
                    float   d            = Trajectory.CalculateInitialYSpeedForHeight(Mathf.Abs(this.idealDistanceToPlaceTargets - magnitude), -acceleration) * Mathf.Sign(this.idealDistanceToPlaceTargets - magnitude);
                    a  *= d;
                    a.y = this.liftVelocity;
                    hurtBox.healthComponent.TakeDamageForce(a * (num * num2), true, true);
                    hurtBox.healthComponent.TakeDamage(new DamageInfo
                    {
                        attacker        = base.gameObject,
                        damage          = this.CalculateDamage(),
                        position        = hurtBox.transform.position,
                        procCoefficient = this.CalculateProcCoefficient()
                    });
                }
            }
            if (base.isAuthority && base.characterBody && base.characterBody.characterMotor)
            {
                float height        = base.characterBody.characterMotor.isGrounded ? this.groundKnockbackDistance : this.airKnockbackDistance;
                float num3          = base.characterBody.characterMotor ? base.characterBody.characterMotor.mass : 1f;
                float acceleration2 = base.characterBody.acceleration;
                float num4          = Trajectory.CalculateInitialYSpeedForHeight(height, -acceleration2);
                base.characterBody.characterMotor.ApplyForce(-num4 * num3 * aimRay.direction, false, false);
            }
        }
Beispiel #4
0
 private void FixedUpdate()
 {
     timer += Time.fixedDeltaTime;
     if (timer >= cooldown)
     {
         enemyFinder = new BullseyeSearch
         {
             maxDistanceFilter = range,
             maxAngleFilter    = 180f,
             searchOrigin      = transform.position,
             searchDirection   = inputBank.GetAimRay().direction,
             filterByLoS       = true,
             sortMode          = BullseyeSearch.SortMode.Distance,
             teamMaskFilter    = TeamMask.allButNeutral
         };
         if (teamComponent)
         {
             enemyFinder.teamMaskFilter.RemoveTeam(teamComponent.teamIndex);
         }
         enemyFinder.RefreshCandidates();
         target = enemyFinder.GetResults().FirstOrDefault();
         if (target)
         {
             Vector3    targetPosition  = target.transform.position;
             float      currentDistance = range * 3;
             Vector3    aimOrigin       = transform.position;
             GameObject root            = gameObject;
             foreach (Transform child in transform.Find("ModelBase").Find("MainBody"))
             {
                 Vector3 childPosition    = child.transform.position;
                 float   computedDistance = Vector3.Distance(targetPosition, childPosition);
                 if (computedDistance < currentDistance)
                 {
                     aimOrigin       = childPosition;
                     currentDistance = computedDistance;
                     root            = child.gameObject;
                 }
             }
             Quaternion rotation = RoR2Util.QuaternionSafeLookRotation((targetPosition - aimOrigin).normalized);
             RoR2Util.PlaySound(soundString, gameObject);
             if (effectPrefab)
             {
                 EffectData effectData = new EffectData
                 {
                     origin     = aimOrigin,
                     rootObject = root,
                     rotation   = rotation
                 };
                 EffectManager.SpawnEffect(effectPrefab, effectData, false);
                 Util.EffectOptions(characterBody, effectPrefab, false);
             }
             if (NetworkServer.active)
             {
                 float computedDamage    = characterBody.damage * damageCoefficient;
                 FireProjectileInfo info = new FireProjectileInfo
                 {
                     projectilePrefab = projectilePrefab,
                     position         = aimOrigin,
                     rotation         = rotation,
                     owner            = gameObject,
                     damage           = computedDamage,
                     force            = force,
                     crit             = characterBody.RollCrit(),
                     damageColorIndex = DamageColorIndex.Default,
                     speedOverride    = velocity
                 };
                 ProjectileManager.instance.FireProjectile(info);
                 Util.FireOptions(characterBody, info, (option, _d) =>
                 {
                     return((targetPosition - option.transform.position).normalized);
                 });
                 Util.TriggerArmsRace(characterBody, computedDamage);
             }
             timer -= cooldown;
         }
         timer = Mathf.Min(cooldown, timer);
     }
 }
Beispiel #5
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);
            }
        }
Beispiel #6
0
            public void FixedUpdate()
            {
                if (NetworkServer.active)
                {
                    while (enemyFollowers.Count < stack)
                    {
                        GameObject enemyFollower = Object.Instantiate(enemyFollowerPrefab, body.corePosition, Quaternion.identity);
                        enemyFollower.GetComponent <GenericOwnership>().ownerObject = gameObject;
                        NetworkServer.Spawn(enemyFollower);
                        enemyFollowers.Add(enemyFollower.GetComponent <MysticsItemsSpotterController>());
                    }
                    while (enemyFollowers.Count > stack)
                    {
                        MysticsItemsSpotterController enemyFollower = enemyFollowers.Last();
                        NetworkServer.UnSpawn(enemyFollower.gameObject);
                        Object.Destroy(enemyFollower.gameObject);
                        enemyFollowers.Remove(enemyFollower);
                    }
                }
                cooldown -= Time.fixedDeltaTime;
                if (cooldown <= 0f)
                {
                    cooldown = cooldownMax;

                    if (NetworkServer.active)
                    {
                        bullseyeSearch.teamMaskFilter = TeamMask.allButNeutral;
                        bullseyeSearch.teamMaskFilter.RemoveTeam(body.teamComponent.teamIndex);
                        Ray ray = CameraRigController.ModifyAimRayIfApplicable(new Ray
                        {
                            origin    = body.inputBank.aimOrigin,
                            direction = body.inputBank.aimDirection
                        }, body.gameObject, out _);
                        bullseyeSearch.searchOrigin      = ray.origin;
                        bullseyeSearch.searchDirection   = ray.direction;
                        bullseyeSearch.viewer            = body;
                        bullseyeSearch.maxDistanceFilter = 200f;
                        bullseyeSearch.RefreshCandidates();
                        bullseyeSearch.FilterOutGameObject(body.gameObject);
                        List <HurtBox> enemies = bullseyeSearch.GetResults().ToList();

                        foreach (MysticsItemsSpotterController enemyFollower in enemyFollowers)
                        {
                            enemyFollower.ClearTarget();
                        }

                        if (enemies.Count > 0)
                        {
                            Util.PlaySound("Play_item_proc_spotter", gameObject);
                            foreach (MysticsItemsSpotterController enemyFollower in enemyFollowers)
                            {
                                GameObject newTarget = null;
                                while (newTarget == null && enemies.Count > 0)
                                {
                                    int     index            = Mathf.FloorToInt(enemies.Count * (Random.value * 0.99f));
                                    HurtBox newTargetHurtBox = enemies.ElementAt(index);
                                    enemies.RemoveAt(index);
                                    if (newTargetHurtBox.healthComponent && newTargetHurtBox.healthComponent.body)
                                    {
                                        CharacterBody newTargetBody = newTargetHurtBox.healthComponent.body;
                                        if (!newTargetBody.HasBuff(buffDef))
                                        {
                                            newTarget = newTargetBody.gameObject;
                                        }
                                    }
                                }
                                if (newTarget)
                                {
                                    enemyFollower.SetTarget(newTarget);
                                }
                                else
                                {
                                    enemyFollower.ClearTarget();
                                }
                            }
                        }
                        else
                        {
                            cooldown = cooldownIfNoEnemiesFound;
                        }
                    }
                }
            }