コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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,