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); } } }
// 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); } }
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); } }
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); } }
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; } } } }