void PullObjects(EquipmentSlot slot) { float range = objectRange; if (Compat_ClassicItems.enabled) { range *= 1f + (float)Compat_ClassicItems.CheckEmbryoProc(slot, equipmentDef); } var rbObjectsInRange = Physics.OverlapSphere(slot.characterBody.corePosition, range, Physics.AllLayers, QueryTriggerInteraction.Collide) .Select(x => x.gameObject) .Where(x => validObjectNamesRB.Contains(x.name)) .Select(x => x.GetComponent <Rigidbody>()) .Where(x => x); var nonRbObjectsInRange = GameObject.FindObjectsOfType <GameObject>() //TODO: add colliders to all of these prefabs .Where(x => validObjectNamesNoRB.Contains(x.name) && Vector3.Distance(x.transform.position, slot.characterBody.corePosition) < range); foreach (var rb in rbObjectsInRange) { var sticky = rb.gameObject.GetComponent <RoR2.Projectile.ProjectileStickOnImpact>(); if (sticky) { sticky.Detach(); sticky.enabled = false; } var velVec = slot.characterBody.transform.position - rb.transform.position; if (rb.useGravity && !rb.gameObject.name.Contains("TkSatPixie")) { var(vInitial, tFinal) = MiscUtil.CalculateVelocityForFinalPosition(rb.transform.position, slot.characterBody.transform.position, 1f); velVec = vInitial; } else { velVec.Normalize(); velVec *= PULL_FORCE; } rb.AddForce(velVec - rb.velocity, ForceMode.VelocityChange); } foreach (var nrb in nonRbObjectsInRange) { nrb.transform.position = slot.characterBody.corePosition; } }
void PullEnemies(EquipmentSlot slot) { float range = enemyRange; float damage = slot.characterBody.damage * baseDamageFrac; if (Compat_ClassicItems.enabled) { var fac = 1f + (float)Compat_ClassicItems.CheckEmbryoProc(slot, equipmentDef); range *= fac; damage *= fac; } var teamMembers = new List <TeamComponent>(); bool isFF = FriendlyFireManager.friendlyFireMode != FriendlyFireManager.FriendlyFireMode.Off; var scan = ((TeamIndex[])Enum.GetValues(typeof(TeamIndex))); var myTeam = TeamComponent.GetObjectTeam(slot.characterBody.gameObject); foreach (var ind in scan) { if (isFF || myTeam != ind) { teamMembers.AddRange(TeamComponent.GetTeamMembers(ind)); } } teamMembers.Remove(slot.characterBody.teamComponent); float sqrad = range * range; foreach (TeamComponent tcpt in teamMembers) { var velVec = slot.characterBody.transform.position - tcpt.transform.position; if (velVec.sqrMagnitude <= sqrad && tcpt.body && !tcpt.body.isBoss && !tcpt.body.isChampion && tcpt.body.isActiveAndEnabled) { var(vInitial, _) = MiscUtil.CalculateVelocityForFinalPosition(tcpt.transform.position, slot.characterBody.transform.position, 1f); var mcpt = tcpt.body.GetComponent <IPhysMotor>(); tcpt.body.healthComponent.TakeDamage(new DamageInfo { attacker = slot.characterBody.gameObject, crit = slot.characterBody.RollCrit(), damage = damage, damageColorIndex = DamageColorIndex.Default, damageType = DamageType.Generic | DamageType.AOE, canRejectForce = false, force = (vInitial - ((mcpt != null) ? mcpt.velocity : Vector3.zero)) * ((mcpt != null) ? mcpt.mass : 1f), position = tcpt.body.corePosition, procChainMask = default,