protected override bool PerformEquipmentAction(RoR2.EquipmentSlot slot)
        {
            if (!slot.characterBody)
            {
                return(false);
            }
            var body = slot.characterBody;

            if (NetworkServer.active)
            {
                var supernova = new RoR2.BlastAttack()
                {
                    radius            = 40,
                    procCoefficient   = 0.25f,
                    position          = body.corePosition,
                    attacker          = body.gameObject,
                    crit              = RoR2.Util.CheckRoll(body.crit, body.master),
                    baseDamage        = body.damage * 4,
                    falloffModel      = RoR2.BlastAttack.FalloffModel.None,
                    baseForce         = body.damage * 100,
                    teamIndex         = !body.teamComponent.teamIndex.Equals(TeamIndex.None) ? body.teamComponent.teamIndex : TeamIndex.None,
                    damageType        = DamageType.IgniteOnHit,
                    attackerFiltering = AttackerFiltering.NeverHit
                };
                supernova.Fire();
                RoR2.EffectData effectData = new RoR2.EffectData();
                effectData.origin = body.corePosition;
                effectData.scale  = 40f;
                RoR2.EffectManager.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/ImpactEffects/ExplosionVFX"), effectData, true);
                return(true);
            }
            return(false);
        }
示例#2
0
        // Token: 0x060005D7 RID: 1495 RVA: 0x0001834C File Offset: 0x0001654C
        public void CreateEffect(AnimationEvent animationEvent)
        {
            Transform transform = base.transform;
            int       num       = -1;

            if (!string.IsNullOrEmpty(animationEvent.stringParameter))
            {
                num = this.childLocator.FindChildIndex(animationEvent.stringParameter);
                if (num != -1)
                {
                    transform = this.childLocator.FindChild(num);
                }
            }
            bool       transmit   = animationEvent.intParameter != 0;
            EffectData effectData = new EffectData();

            effectData.origin = transform.position;
            effectData.SetChildLocatorTransformReference(this.bodyObject, num);
            EffectManager.SpawnEffect((GameObject)animationEvent.objectReferenceParameter, effectData, transmit);
        }
示例#3
0
        // Token: 0x06000AF6 RID: 2806 RVA: 0x000307FC File Offset: 0x0002E9FC
        private void DetonateServer()
        {
            if (this.hasDetonatedServer)
            {
                return;
            }
            this.hasDetonatedServer = true;
            CharacterBody currentPassengerBody = this.vehicleSeat.currentPassengerBody;

            if (currentPassengerBody)
            {
                EffectData effectData = new EffectData
                {
                    origin = base.transform.position,
                    scale  = this.blastRadius
                };
                EffectManager.SpawnEffect(this.explosionEffectPrefab, effectData, true);
                new BlastAttack
                {
                    attacker         = currentPassengerBody.gameObject,
                    baseDamage       = this.blastDamageCoefficient * currentPassengerBody.damage,
                    baseForce        = this.blastForce,
                    bonusForce       = this.blastBonusForce,
                    canHurtAttacker  = false,
                    crit             = currentPassengerBody.RollCrit(),
                    damageColorIndex = DamageColorIndex.Item,
                    damageType       = this.blastDamageType,
                    falloffModel     = this.blastFalloffModel,
                    inflictor        = base.gameObject,
                    position         = base.transform.position,
                    procChainMask    = default(ProcChainMask),
                    procCoefficient  = this.blastProcCoefficient,
                    radius           = this.blastRadius,
                    teamIndex        = currentPassengerBody.teamComponent.teamIndex
                }.Fire();
            }
            Util.PlaySound(this.explosionSoundString, base.gameObject);
            UnityEngine.Object.Destroy(base.gameObject);
        }
示例#4
0
            public void OnReceived()
            {
                if (NetworkServer.active)
                {
                    return;
                }
                GameObject target           = null;
                var        playerGameObject = RoR2.Util.FindNetworkObject(BodyID);

                if (playerGameObject)
                {
                    var playerBody = playerGameObject.GetComponent <RoR2.CharacterBody>();
                    if (playerBody)
                    {
                        var eqp = playerBody.equipmentSlot.FindActiveEquipmentDisplay();
                        target = eqp ? eqp.gameObject : playerGameObject;

                        if (target)
                        {
                            if (ChargeState)
                            {
                                RoR2.EffectData sphere = new RoR2.EffectData
                                {
                                    origin     = target.transform.position,
                                    rotation   = target.transform.rotation,
                                    rootObject = target
                                };
                                RoR2.EffectManager.SpawnEffect(JarChargeSphere, sphere, false);
                            }
                        }
                    }
                }
                else
                {
                    Debug.LogError("We don't have a jar or a playerbody. Can't do a sphere!");
                    return;
                }
            }
 // Token: 0x06000EB9 RID: 3769 RVA: 0x0004881C File Offset: 0x00046A1C
 private void TransmitEffect(uint effectPrefabIndex, EffectData effectData, NetworkConnection netOrigin = null)
 {
     EffectManager.outgoingEffectMessage.effectPrefabIndex = effectPrefabIndex;
     EffectData.Copy(effectData, EffectManager.outgoingEffectMessage.effectData);
     if (NetworkServer.active)
     {
         using (IEnumerator <NetworkConnection> enumerator = NetworkServer.connections.GetEnumerator())
         {
             while (enumerator.MoveNext())
             {
                 NetworkConnection networkConnection = enumerator.Current;
                 if (networkConnection != null && networkConnection != netOrigin)
                 {
                     networkConnection.SendByChannel(52, EffectManager.outgoingEffectMessage, QosChannelIndex.effects.intVal);
                 }
             }
             return;
         }
     }
     if (ClientScene.readyConnection != null)
     {
         ClientScene.readyConnection.SendByChannel(52, EffectManager.outgoingEffectMessage, QosChannelIndex.effects.intVal);
     }
 }
 // Token: 0x06000EB7 RID: 3767 RVA: 0x00048794 File Offset: 0x00046994
 public void SpawnEffect(GameObject effectPrefab, EffectData effectData, bool transmit)
 {
     if (transmit)
     {
         this.TransmitEffect(effectPrefab, effectData, null);
         if (NetworkServer.active)
         {
             return;
         }
     }
     if (NetworkClient.active)
     {
         if (!VFXBudget.CanAffordSpawn(effectPrefab))
         {
             return;
         }
         EffectData      effectData2 = effectData.Clone();
         EffectComponent component   = UnityEngine.Object.Instantiate <GameObject>(effectPrefab, effectData2.origin, effectData2.rotation).GetComponent <EffectComponent>();
         if (component)
         {
             component.effectData = effectData2.Clone();
         }
     }
 }
示例#7
0
 // Token: 0x060009A0 RID: 2464 RVA: 0x00030A12 File Offset: 0x0002EC12
 public static void ReadEffectData(this NetworkReader reader, EffectData effectData)
 {
     effectData.Deserialize(reader);
 }
示例#8
0
 // Token: 0x0600099E RID: 2462 RVA: 0x000309FB File Offset: 0x0002EBFB
 public static void Write(this NetworkWriter writer, EffectData effectData)
 {
     effectData.Serialize(writer);
 }
示例#9
0
        // Token: 0x06000426 RID: 1062 RVA: 0x00010B54 File Offset: 0x0000ED54
        public bool DefaultHitCallback(ref BulletAttack.BulletHit hitInfo)
        {
            bool result = false;

            if (hitInfo.collider)
            {
                result = ((1 << hitInfo.collider.gameObject.layer & this.stopperMask) == 0);
            }
            if (this.hitEffectPrefab)
            {
                EffectManager.SimpleImpactEffect(this.hitEffectPrefab, hitInfo.point, this.HitEffectNormal ? hitInfo.surfaceNormal : (-hitInfo.direction), true);
            }
            if (hitInfo.collider)
            {
                SurfaceDef objectSurfaceDef = SurfaceDefProvider.GetObjectSurfaceDef(hitInfo.collider, hitInfo.point);
                if (objectSurfaceDef && objectSurfaceDef.impactEffectPrefab)
                {
                    EffectData effectData = new EffectData
                    {
                        origin          = hitInfo.point,
                        rotation        = Quaternion.LookRotation(hitInfo.surfaceNormal),
                        color           = objectSurfaceDef.approximateColor,
                        surfaceDefIndex = objectSurfaceDef.surfaceDefIndex
                    };
                    EffectManager.SpawnEffect(objectSurfaceDef.impactEffectPrefab, effectData, true);
                }
            }
            if (this.isCrit)
            {
                EffectManager.SimpleImpactEffect(Resources.Load <GameObject>("Prefabs/Effects/ImpactEffects/Critspark"), hitInfo.point, this.HitEffectNormal ? hitInfo.surfaceNormal : (-hitInfo.direction), true);
            }
            GameObject entityObject = hitInfo.entityObject;

            if (entityObject)
            {
                float num = 1f;
                switch (this.falloffModel)
                {
                case BulletAttack.FalloffModel.None:
                    num = 1f;
                    break;

                case BulletAttack.FalloffModel.DefaultBullet:
                    num = 0.5f + Mathf.Clamp01(Mathf.InverseLerp(60f, 25f, hitInfo.distance)) * 0.5f;
                    break;

                case BulletAttack.FalloffModel.Buckshot:
                    num = 0.25f + Mathf.Clamp01(Mathf.InverseLerp(25f, 7f, hitInfo.distance)) * 0.75f;
                    break;
                }
                DamageInfo damageInfo = new DamageInfo();
                damageInfo.damage           = this.damage * num;
                damageInfo.crit             = this.isCrit;
                damageInfo.attacker         = this.owner;
                damageInfo.inflictor        = this.weapon;
                damageInfo.position         = hitInfo.point;
                damageInfo.force            = hitInfo.direction * (this.force * num);
                damageInfo.procChainMask    = this.procChainMask;
                damageInfo.procCoefficient  = this.procCoefficient;
                damageInfo.damageType       = this.damageType;
                damageInfo.damageColorIndex = this.damageColorIndex;
                damageInfo.ModifyDamageInfo(hitInfo.damageModifier);
                TeamIndex teamIndex = TeamIndex.Neutral;
                if (this.owner)
                {
                    TeamComponent component = this.owner.GetComponent <TeamComponent>();
                    if (component)
                    {
                        teamIndex = component.teamIndex;
                    }
                }
                TeamIndex     teamIndex2 = TeamIndex.Neutral;
                TeamComponent component2 = hitInfo.entityObject.GetComponent <TeamComponent>();
                if (component2)
                {
                    teamIndex2 = component2.teamIndex;
                }
                bool            flag            = teamIndex == teamIndex2;
                HealthComponent healthComponent = null;
                if (!flag)
                {
                    healthComponent = entityObject.GetComponent <HealthComponent>();
                }
                if (NetworkServer.active)
                {
                    if (healthComponent)
                    {
                        healthComponent.TakeDamage(damageInfo);
                        GlobalEventManager.instance.OnHitEnemy(damageInfo, hitInfo.entityObject);
                    }
                    GlobalEventManager.instance.OnHitAll(damageInfo, hitInfo.entityObject);
                }
                else if (ClientScene.ready)
                {
                    BulletAttack.messageWriter.StartMessage(53);
                    BulletAttack.messageWriter.Write(entityObject);
                    BulletAttack.messageWriter.Write(damageInfo);
                    BulletAttack.messageWriter.Write(healthComponent != null);
                    BulletAttack.messageWriter.FinishMessage();
                    ClientScene.readyConnection.SendWriter(BulletAttack.messageWriter, QosChannelIndex.defaultReliable.intVal);
                }
            }
            return(result);
        }
示例#10
0
        // Token: 0x0600042F RID: 1071 RVA: 0x000113A0 File Offset: 0x0000F5A0
        private void FireSingle(Vector3 normal, int muzzleIndex)
        {
            float   num    = this.maxDistance;
            Vector3 vector = this.origin + normal * this.maxDistance;
            List <BulletAttack.BulletHit> list = new List <BulletAttack.BulletHit>();
            bool flag  = this.radius == 0f || this.smartCollision;
            bool flag2 = this.radius != 0f;
            HashSet <GameObject> hashSet = null;

            if (this.smartCollision)
            {
                hashSet = new HashSet <GameObject>();
            }
            if (flag)
            {
                RaycastHit[] array = Physics.RaycastAll(this.origin, normal, num, this.hitMask, this.queryTriggerInteraction);
                for (int i = 0; i < array.Length; i++)
                {
                    BulletAttack.BulletHit bulletHit = default(BulletAttack.BulletHit);
                    this.InitBulletHitFromRaycastHit(ref bulletHit, this.origin, normal, ref array[i]);
                    list.Add(bulletHit);
                    if (this.smartCollision)
                    {
                        hashSet.Add(bulletHit.entityObject);
                    }
                    if (bulletHit.distance < num)
                    {
                        num = bulletHit.distance;
                    }
                }
            }
            if (flag2)
            {
                LayerMask mask = this.hitMask;
                if (this.smartCollision)
                {
                    mask &= ~LayerIndex.world.mask;
                }
                RaycastHit[] array2 = Physics.SphereCastAll(this.origin, this.radius, normal, num, mask, this.queryTriggerInteraction);
                for (int j = 0; j < array2.Length; j++)
                {
                    BulletAttack.BulletHit bulletHit2 = default(BulletAttack.BulletHit);
                    this.InitBulletHitFromRaycastHit(ref bulletHit2, this.origin, normal, ref array2[j]);
                    if (!this.smartCollision || !hashSet.Contains(bulletHit2.entityObject))
                    {
                        list.Add(bulletHit2);
                    }
                }
            }
            this.ProcessHitList(list, ref vector, new List <GameObject>());
            if (this.tracerEffectPrefab)
            {
                EffectData effectData = new EffectData
                {
                    origin = vector,
                    start  = this.origin
                };
                effectData.SetChildLocatorTransformReference(this.weapon, muzzleIndex);
                EffectManager.SpawnEffect(this.tracerEffectPrefab, effectData, true);
            }
        }
示例#11
0
        private bool PerformEquipmentAction(EquipmentIndex equipmentIndex)
        {
            switch (equipmentIndex)
            {
            case EquipmentIndex.CommandMissile:
                remainingMissiles += 12;
                return(true);

            case EquipmentIndex.Saw:
            {
                Vector3 position = transform.position;
                Ray     ray      = new Ray
                {
                    direction = inputBank.aimDirection,
                    origin    = inputBank.aimOrigin
                };
                bool crit = Util.CheckRoll(characterBody.crit, characterBody.master);
                ProjectileManager.instance.FireProjectile(Resources.Load <GameObject>("Prefabs/Projectiles/Sawmerang"), ray.origin, Util.QuaternionSafeLookRotation(ray.direction), gameObject, characterBody.damage, 0f, crit, DamageColorIndex.Default, null, -1f);
                return(true);
            }

            case EquipmentIndex.Fruit:
                if (healthComponent)
                {
                    Util.PlaySound("Play_item_use_fruit", gameObject);
                    EffectData effectData = new EffectData();
                    effectData.origin = transform.position;
                    effectData.SetNetworkedObjectReference(gameObject);
                    EffectManager.instance.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/FruitHealEffect"), effectData, true);
                    healthComponent.HealFraction(0.5f, default(ProcChainMask));
                    return(true);
                }
                return(true);

            case EquipmentIndex.Meteor:
            {
                MeteorStormController component = Instantiate(Resources.Load <GameObject>("Prefabs/NetworkedObjects/MeteorStorm"), characterBody.corePosition, Quaternion.identity).GetComponent <MeteorStormController>();
                component.owner       = gameObject;
                component.ownerDamage = characterBody.damage;
                component.isCrit      = Util.CheckRoll(characterBody.crit, characterBody.master);
                NetworkServer.Spawn(component.gameObject);
                return(true);
            }

            case EquipmentIndex.SoulJar:
                return(true);

            case EquipmentIndex.Blackhole:
            {
                Vector3 position2 = transform.position;
                Ray     ray2      = new Ray
                {
                    direction = inputBank.aimDirection,
                    origin    = inputBank.aimOrigin
                };
                ProjectileManager.instance.FireProjectile(Resources.Load <GameObject>("Prefabs/Projectiles/GravSphere"), position2, Util.QuaternionSafeLookRotation(ray2.direction), gameObject, 0f, 0f, false, DamageColorIndex.Default, null, -1f);
                return(true);
            }

            case EquipmentIndex.GhostGun:
            {
                GameObject gameObject = Instantiate(Resources.Load <GameObject>("Prefabs/NetworkedObjects/GhostGun"), transform.position, Quaternion.identity);
                gameObject.GetComponent <GhostGunController>().owner = this.gameObject;
                NetworkServer.Spawn(gameObject);
                return(true);
            }

            case EquipmentIndex.CritOnUse:
                characterBody.AddTimedBuff(BuffIndex.FullCrit, 8f);
                return(true);

            case EquipmentIndex.DroneBackup:
            {
                Util.PlaySound("Play_item_use_radio", gameObject);
                int   num  = 4;
                float num2 = 25f;
                if (NetworkServer.active)
                {
                    for (int i = 0; i < num; i++)
                    {
                        Vector2 vector    = Random.insideUnitCircle.normalized * 3f;
                        Vector3 position3 = transform.position + new Vector3(vector.x, 0f, vector.y);
                        SummonMaster(Resources.Load <GameObject>("Prefabs/CharacterMasters/DroneBackupMaster"), position3).gameObject.AddComponent <MasterSuicideOnTimer>().lifeTimer = num2 + Random.Range(0f, 3f);
                    }
                    return(true);
                }
                return(true);
            }

            case EquipmentIndex.OrbitalLaser:
            {
                Vector3    position4 = transform.position;
                RaycastHit raycastHit;
                if (Physics.Raycast(new Ray
                    {
                        direction = inputBank.aimDirection,
                        origin = inputBank.aimOrigin
                    }, out raycastHit, 900f, LayerIndex.world.mask | LayerIndex.defaultLayer.mask))
                {
                    position4 = raycastHit.point;
                }
                GameObject gameObject2 = (GameObject)Instantiate(Resources.Load("Prefabs/NetworkedObjects/OrbitalLaser"), position4, Quaternion.identity);
                gameObject2.GetComponent <OrbitalLaserController>().ownerBody = characterBody;
                NetworkServer.Spawn(gameObject2);
                return(true);
            }

            case EquipmentIndex.BFG:
                bfgChargeTimer   = 2f;
                subcooldownTimer = 2.2f;
                return(true);

            case EquipmentIndex.Enigma:
            {
                EquipmentIndex equipmentIndex2 = EquipmentCatalog.enigmaEquipmentList[Random.Range(0, EquipmentCatalog.enigmaEquipmentList.Count - 1)];
                PerformEquipmentAction(equipmentIndex2);
                return(true);
            }

            case EquipmentIndex.Jetpack:
            {
                JetpackController jetpackController = JetpackController.FindJetpackController(gameObject);
                if (!jetpackController)
                {
                    GameObject gameObject3 = Instantiate(Resources.Load <GameObject>("Prefabs/NetworkedObjects/JetpackController"));
                    jetpackController = gameObject3.GetComponent <JetpackController>();
                    jetpackController.NetworktargetObject = gameObject;
                    NetworkServer.Spawn(gameObject3);
                    return(true);
                }
                jetpackController.ResetTimer();
                return(true);
            }

            case EquipmentIndex.Lightning:
            {
                HurtBox hurtBox = currentTargetHurtBox;
                if (hurtBox)
                {
                    subcooldownTimer = 0.2f;
                    OrbManager.instance.AddOrb(new LightningStrikeOrb
                        {
                            attacker         = gameObject,
                            damageColorIndex = DamageColorIndex.Item,
                            damageValue      = characterBody.damage * 30f,
                            isCrit           = Util.CheckRoll(characterBody.crit, characterBody.master),
                            procChainMask    = default(ProcChainMask),
                            procCoefficient  = 1f,
                            target           = hurtBox
                        });
                    return(true);
                }
                return(false);
            }

            case EquipmentIndex.PassiveHealing:
                if (passiveHealingFollower)
                {
                    passiveHealingFollower.AssignNewTarget(currentTargetBodyObject);
                    return(true);
                }
                return(true);

            case EquipmentIndex.BurnNearby:
                if (characterBody)
                {
                    characterBody.AddHelfireDuration(8f);
                    return(true);
                }
                return(true);

            case EquipmentIndex.SoulCorruptor:
            {
                HurtBox hurtBox2 = currentTargetHurtBox;
                if (!hurtBox2)
                {
                    return(false);
                }
                if (!hurtBox2.healthComponent || hurtBox2.healthComponent.combinedHealthFraction > 0.25f)
                {
                    return(false);
                }
                Util.TryToCreateGhost(hurtBox2.healthComponent.body, characterBody, 30);
                hurtBox2.healthComponent.Suicide(gameObject);
                return(true);
            }

            case EquipmentIndex.Scanner:
                NetworkServer.Spawn(Instantiate(Resources.Load <GameObject>("Prefabs/NetworkedObjects/ChestScanner"), characterBody.corePosition, Quaternion.identity));
                return(true);

            case EquipmentIndex.CrippleWard:
                NetworkServer.Spawn(Instantiate(Resources.Load <GameObject>("Prefabs/NetworkedObjects/CrippleWard"), characterBody.corePosition, Quaternion.identity));
                // Don't drop it for now - can't pick back up (bug)
                // inventory.SetEquipmentIndex(EquipmentIndex.None);
                return(true);
            }
            return(false);
        }
示例#12
0
        private System.Collections.IEnumerator GlobalEventManager_CreateLevelUpEffect(On.RoR2.GlobalEventManager.orig_CreateLevelUpEffect orig, RoR2.GlobalEventManager self, float delay, GameObject levelUpEffect, RoR2.EffectData effectData)
        {
            yield return(new WaitForSeconds(delay));

            orig.Invoke(self, delay, levelUpEffect, effectData);

            foreach (RoR2.PlayerCharacterMasterController playerCharacterMasterController in RoR2.PlayerCharacterMasterController.instances)
            {
                bool isClient = playerCharacterMasterController.master.isClient;
                if (isClient)
                {
                    string        displayName = playerCharacterMasterController.GetDisplayName();
                    System.Random rnd         = new System.Random();

                    RoR2.CharacterMaster localUser  = playerCharacterMasterController.master;
                    RoR2.CharacterBody   playerBody = localUser.GetBody();
                    int playerLevel = (int)playerBody.level;

                    if (currentLevel < playerLevel)
                    {
                        ItemTier itemTier1           = ItemTier.Tier1;
                        int      amountOfItemsInTier = this.getAmountOfItemsInTier(itemTier1, playerCharacterMasterController.master);
                        this.removeAllItemsInTier(itemTier1, playerCharacterMasterController.master);
                        this.addItems(itemTier1, amountOfItemsInTier, playerCharacterMasterController.master, rnd, tier1Min.Value, tier1Max.Value);

                        ItemTier itemTier2 = ItemTier.Tier2;
                        amountOfItemsInTier = this.getAmountOfItemsInTier(itemTier2, playerCharacterMasterController.master);
                        this.removeAllItemsInTier(itemTier2, playerCharacterMasterController.master);
                        this.addItems(itemTier2, amountOfItemsInTier, playerCharacterMasterController.master, rnd, tier2Min.Value, tier2Max.Value);

                        ItemTier itemTier3 = ItemTier.Tier3;
                        amountOfItemsInTier = this.getAmountOfItemsInTier(itemTier3, playerCharacterMasterController.master);
                        this.removeAllItemsInTier(itemTier3, playerCharacterMasterController.master);
                        this.addItems(itemTier3, amountOfItemsInTier, playerCharacterMasterController.master, rnd, tier3Min.Value, tier3Max.Value);

                        ItemTier itemTierLunar = ItemTier.Lunar;
                        amountOfItemsInTier = this.getAmountOfItemsInTier(itemTierLunar, playerCharacterMasterController.master);
                        this.removeAllItemsInTier(itemTierLunar, playerCharacterMasterController.master);
                        this.addItems(itemTierLunar, amountOfItemsInTier, playerCharacterMasterController.master, rnd, tierLunarMin.Value, tierLunarMax.Value);
                        currentLevel = playerLevel;
                    }
                }
            }

            yield break;
        }
        public void TakeDamage(DamageInfo damageInfo)
        {
            if (!NetworkServer.active)
            {
                Debug.LogWarning("[Server] function 'System.Void RoR2.HealthComponent::TakeDamage(RoR2.DamageInfo)' called on client");
                return;
            }
            if (!this.alive || this.godMode)
            {
                return;
            }
            CharacterBody characterBody = null;

            if (damageInfo.attacker)
            {
                characterBody = damageInfo.attacker.GetComponent <CharacterBody>();
            }
            base.BroadcastMessage("OnIncomingDamage", damageInfo, SendMessageOptions.DontRequireReceiver);
            CharacterMaster master = this.body.master;

            base.GetComponent <TeamComponent>();
            if (master && master.inventory)
            {
                int itemCount = master.inventory.GetItemCount(ItemIndex.Bear);
                if (itemCount > 0 && Util.CheckRoll((1f - 1f / (0.15f * (float)itemCount + 1f)) * 100f, 0f, null))
                {
                    EffectData effectData = new EffectData
                    {
                        origin   = damageInfo.position,
                        rotation = Util.QuaternionSafeLookRotation((damageInfo.force != Vector3.zero) ? damageInfo.force : UnityEngine.Random.onUnitSphere)
                    };
                    EffectManager.instance.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/BearProc"), effectData, true);
                    damageInfo.rejected = true;
                }
            }
            if (this.body.HasBuff(BuffIndex.Immune) && (!characterBody || !characterBody.HasBuff(BuffIndex.GoldEmpowered)))
            {
                EffectManager.instance.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/DamageRejected"), new EffectData
                {
                    origin = damageInfo.position
                }, true);
                damageInfo.rejected = true;
            }
            if (damageInfo.rejected)
            {
                return;
            }
            float num = damageInfo.damage;

            if (characterBody)
            {
                CharacterMaster master2 = characterBody.master;
                if (master2 && master2.inventory)
                {
                    if (this.combinedHealth >= this.fullCombinedHealth * 0.9f)
                    {
                        int itemCount2 = master2.inventory.GetItemCount(ItemIndex.Crowbar);
                        if (itemCount2 > 0)
                        {
                            Util.PlaySound("Play_item_proc_crowbar", base.gameObject);
                            num *= 1.5f + 0.3f * (float)(itemCount2 - 1);
                            EffectManager.instance.SimpleImpactEffect(Resources.Load <GameObject>("Prefabs/Effects/ImpactEffects/ImpactCrowbar"), damageInfo.position, -damageInfo.force, true);
                        }
                    }
                    if (this.body.isBoss)
                    {
                        int itemCount3 = master2.inventory.GetItemCount(ItemIndex.BossDamageBonus);
                        if (itemCount3 > 0)
                        {
                            num *= 1.2f + 0.1f * (float)(itemCount3 - 1);
                            damageInfo.damageColorIndex = DamageColorIndex.WeakPoint;
                            EffectManager.instance.SimpleImpactEffect(Resources.Load <GameObject>("Prefabs/Effects/ImpactEffects/ImpactBossDamageBonus"), damageInfo.position, -damageInfo.force, true);
                        }
                    }
                }
            }
            if (damageInfo.crit)
            {
                num *= 2f;
            }
            if ((damageInfo.damageType & DamageType.WeakPointHit) != DamageType.Generic)
            {
                num *= 1.5f;
                damageInfo.damageColorIndex = DamageColorIndex.WeakPoint;
            }
            if ((damageInfo.damageType & DamageType.BypassArmor) == DamageType.Generic)
            {
                float armor = this.body.armor;
                float num2  = (armor >= 0f) ? (1f - armor / (armor + 100f)) : (2f - 100f / (100f - armor));
                num = Mathf.Max(1f, num * num2);
            }
            if ((damageInfo.damageType & DamageType.BarrierBlocked) != DamageType.Generic)
            {
                damageInfo.force *= 0.5f;
                IBarrier component = base.GetComponent <IBarrier>();
                if (component != null)
                {
                    component.BlockedDamage(damageInfo, num);
                }
                damageInfo.procCoefficient = 0f;
                num = 0f;
            }
            if (this.hasOneshotProtection)
            {
                num = Mathf.Min(num, this.fullCombinedHealth * 0.9f);
            }
            if ((damageInfo.damageType & DamageType.SlowOnHit) != DamageType.Generic)
            {
                this.body.AddTimedBuff(BuffIndex.Slow50, 2f);
            }
            if ((damageInfo.damageType & DamageType.ClayGoo) != DamageType.Generic && (this.body.bodyFlags & CharacterBody.BodyFlags.ImmuneToGoo) == CharacterBody.BodyFlags.None)
            {
                this.body.AddTimedBuff(BuffIndex.ClayGoo, 2f);
            }
            if (master && master.inventory)
            {
                int itemCount4 = master.inventory.GetItemCount(ItemIndex.GoldOnHit);
                if (itemCount4 > 0)
                {
                    float num3 = num / this.fullCombinedHealth;
                    uint  num4 = (uint)Mathf.Max(master.money * num3 * (float)itemCount4, damageInfo.damage * (float)itemCount4);
                    master.money = (uint)Mathf.Max(0f, master.money - num4);
                    EffectManager.instance.SimpleImpactEffect(Resources.Load <GameObject>("Prefabs/Effects/ImpactEffects/CoinImpact"), damageInfo.position, Vector3.up, true);
                }
            }
            if ((damageInfo.damageType & DamageType.NonLethal) != DamageType.Generic)
            {
                num = Mathf.Max(Mathf.Min(num, this.health - 1f), 0f);
            }
            if (this.shield > 0f)
            {
                float num5 = Mathf.Min(num, this.shield);
                float num6 = num - num5;
                this.Networkshield = Mathf.Max(this.shield - num5, 0f);
                if (this.shield == 0f)
                {
                    float scale = 1f;
                    if (this.body)
                    {
                        scale = this.body.radius;
                    }
                    EffectManager.instance.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/ShieldBreakEffect"), new EffectData
                    {
                        origin = base.transform.position,
                        scale  = scale
                    }, true);
                }
                if (num6 > 0f)
                {
                    this.Networkhealth = this.health - num6;
                }
            }
            else
            {
                this.Networkhealth = this.health - num;
            }
            this.TakeDamageForce(damageInfo, false);
            base.SendMessage("OnTakeDamage", damageInfo, SendMessageOptions.DontRequireReceiver);
            DamageReport damageReport = new DamageReport
            {
                victim     = this,
                damageInfo = damageInfo
            };

            damageReport.damageInfo.damage = num;
            if (num > 0f)
            {
                HealthComponent.SendDamageDealt(damageReport);
            }
            this.UpdateLastHitTime(damageInfo.damage, damageInfo.position, (damageInfo.damageType & DamageType.Silent) > DamageType.Generic);
            if (damageInfo.attacker)
            {
                damageInfo.attacker.SendMessage("OnDamageDealt", damageReport, SendMessageOptions.DontRequireReceiver);
            }
            GlobalEventManager.ServerDamageDealt(damageReport);
            if (this.isFrozen && this.combinedHealthFraction < 0.3f)
            {
                this.Networkhealth = 0f;
                EffectManager.instance.SpawnEffect(FrozenState.cullEffectPrefab, new EffectData
                {
                    origin = this.body.corePosition,
                    scale  = (this.body ? this.body.radius : 1f)
                }, true);
            }
            if (!this.alive)
            {
                base.BroadcastMessage("OnKilled", damageInfo, SendMessageOptions.DontRequireReceiver);
                if (damageInfo.attacker)
                {
                    damageInfo.attacker.SendMessage("OnKilledOther", damageReport, SendMessageOptions.DontRequireReceiver);
                }
                GlobalEventManager.instance.OnCharacterDeath(damageReport);
                return;
            }
            if (master && master.inventory)
            {
                int itemCount5 = master.inventory.GetItemCount(ItemIndex.Phasing);
                if (itemCount5 > 0 && Util.CheckRoll(damageInfo.damage / this.fullCombinedHealth * 100f, master))
                {
                    this.body.AddTimedBuff(BuffIndex.Cloak, 1.5f + (float)itemCount5 * 1.5f);
                    this.body.AddTimedBuff(BuffIndex.CloakSpeed, 1.5f + (float)itemCount5 * 1.5f);
                    EffectManager.instance.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/ProcStealthkit"), new EffectData
                    {
                        origin   = base.transform.position,
                        rotation = Quaternion.identity
                    }, true);
                }
            }
        }
示例#14
0
            public void FixedUpdate()
            {
                var input = body.inputBank;

                if (SuckTime > 0)
                {
                    if (!IsSuckingProjectiles)
                    {
                        RoR2.EffectData sphere = new RoR2.EffectData
                        {
                            origin     = TargetTransform ? TargetTransform.position : body.transform.position,
                            rotation   = TargetTransform ? TargetTransform.rotation : body.transform.rotation,
                            rootObject = TargetTransform ? TargetTransform.gameObject : body.gameObject
                        };
                        RoR2.EffectManager.SpawnEffect(JarChargeSphere, sphere, false);

                        var bodyIdentity = body.gameObject.GetComponent <NetworkIdentity>();
                        if (bodyIdentity && NetworkServer.active)
                        {
                            new SyncJarSucking(SyncJarSucking.MessageType.Charging, true, projectileAbsorptionTime, bodyIdentity.netId).Send(NetworkDestination.Clients);
                        }
                        IsSuckingProjectiles = true;
                    }
                    SuckTime -= Time.fixedDeltaTime;
                    List <ProjectileController> bullets = new List <ProjectileController>();
                    new RoR2.SphereSearch
                    {
                        radius = baseRadiusGranted,
                        mask   = RoR2.LayerIndex.projectile.mask,
                        origin = body.corePosition
                    }.RefreshCandidates().FilterCandidatesByProjectileControllers().GetProjectileControllers(bullets);
                    if (bullets.Count > 0)
                    {
                        foreach (ProjectileController controller in bullets)
                        {
                            var controllerOwner = controller.owner;
                            if (controllerOwner)
                            {
                                var ownerBody = controllerOwner.GetComponent <RoR2.CharacterBody>();
                                if (ownerBody)
                                {
                                    if (ownerBody.teamComponent.teamIndex == body.teamComponent.teamIndex)
                                    {
                                        if (FriendlyFireManager.friendlyFireMode != FriendlyFireManager.FriendlyFireMode.Off && iWantToLoseFriendsInChaosMode)
                                        {
                                            if (ownerBody == body)
                                            {
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            continue;
                                        }
                                    }
                                    var projectileDamage = controller.gameObject.GetComponent <ProjectileDamage>();
                                    if (projectileDamage)
                                    {
                                        jarBullets.Add(new JarBullet(projectileDamage.damage, projectileDamage.damageColorIndex, projectileDamage.damageType));

                                        var orb = new JarOfReshapingOrb();
                                        orb.Target = TargetTransform ? TargetTransform.gameObject : body.gameObject; //Where it is going to
                                        orb.origin = controller.transform.position;                                  //Where it is coming from
                                        orb.Index  = -1;
                                        OrbManager.instance.AddOrb(orb);                                             // Fire


                                        var bodyIdentity = body.gameObject.GetComponent <NetworkIdentity>();

                                        if (bodyIdentity && NetworkServer.active)
                                        {
                                            new SyncJarOrb(SyncJarOrb.MessageType.Fired, bodyIdentity.netId, controller.transform.position).Send(NetworkDestination.Clients);
                                        }
                                        RoR2.Util.PlayScaledSound(EntityStates.Engi.EngiWeapon.ChargeGrenades.chargeStockSoundString, body.gameObject, jarBullets.Count);
                                        EntityState.Destroy(controller.gameObject);
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    IsSuckingProjectiles = false;
                }
                if (ChargeTime > 0)
                {
                    if (!IsCharging && NetworkServer.active)
                    {
                        var bodyIdentity = body.gameObject.GetComponent <NetworkIdentity>();
                        if (bodyIdentity)
                        {
                            new SyncJarCharging(jarBullets.Count, ChargeTime, RefireTime, bodyIdentity.netId).Send(NetworkDestination.Clients);
                        }
                        IsCharging = true;
                    }
                    ChargeTime -= Time.fixedDeltaTime;
                    if (ChargeTime <= 0)
                    {
                        if (NetworkServer.active)
                        {
                            var bullet = jarBullets.Last();
                            FireProjectileInfo projectileInfo = new FireProjectileInfo();
                            projectileInfo.projectilePrefab   = JarProjectile;
                            projectileInfo.damage             = 20 + bullet.Damage * 2;
                            projectileInfo.damageColorIndex   = bullet.DamageColorIndex;
                            projectileInfo.damageTypeOverride = bullet.DamageType;
                            projectileInfo.owner         = body.gameObject;
                            projectileInfo.procChainMask = default(RoR2.ProcChainMask);
                            projectileInfo.position      = TargetTransform ? TargetTransform.position : body.corePosition;
                            projectileInfo.rotation      = RoR2.Util.QuaternionSafeLookRotation(input ? input.aimDirection : body.transform.forward);
                            projectileInfo.speedOverride = 120;
                            ProjectileManager.instance.FireProjectile(projectileInfo);
                            jarBullets.RemoveAt(jarBullets.Count - 1);
                        }
                        RoR2.Util.PlaySound(EntityStates.ClayBoss.FireTarball.attackSoundString, body.gameObject);
                        ClientBullets--;
                        if (jarBullets.Count > 0 || ClientBullets > 0)
                        {
                            ChargeTime += RefireTime;
                        }
                    }
                }
                else
                {
                    IsCharging = false;
                }
            }
示例#15
0
 // Token: 0x0600055D RID: 1373 RVA: 0x00015BE3 File Offset: 0x00013DE3
 public static void SpawnEffect(GameObject effectPrefab, EffectData effectData, bool transmit)
 {
     EffectManager.SpawnEffect(EffectCatalog.FindEffectIndexFromPrefab(effectPrefab), effectData, transmit);
 }
        private bool PerformEquipmentAction(EquipmentIndex equipmentIndex)
        {
            if (!NetworkServer.active)
            {
                Debug.LogWarning("[Server] function 'System.Boolean RoR2.EquipmentSlot::PerformEquipmentAction(RoR2.EquipmentIndex)' called on client");
                return(false);
            }
            switch (equipmentIndex)
            {
            case EquipmentIndex.CommandMissile:
                this.remainingMissiles += 12;
                return(true);

            case EquipmentIndex.Saw:
            {
                Vector3 position = base.transform.position;
                Ray     aimRay   = this.GetAimRay();
                bool    crit     = Util.CheckRoll(this.characterBody.crit, this.characterBody.master);
                ProjectileManager.instance.FireProjectile(Resources.Load <GameObject>("Prefabs/Projectiles/Sawmerang"), aimRay.origin, Util.QuaternionSafeLookRotation(aimRay.direction), base.gameObject, this.characterBody.damage, 0f, crit, DamageColorIndex.Default, null, -1f);
                return(true);
            }

            case EquipmentIndex.Fruit:
                if (this.healthComponent)
                {
                    Util.PlaySound("Play_item_use_fruit", base.gameObject);
                    EffectData effectData = new EffectData();
                    effectData.origin = base.transform.position;
                    effectData.SetNetworkedObjectReference(base.gameObject);
                    EffectManager.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/FruitHealEffect"), effectData, true);
                    this.healthComponent.HealFraction(0.5f, default(ProcChainMask));
                    return(true);
                }
                return(true);

            case EquipmentIndex.Meteor:
            {
                MeteorStormController component = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/MeteorStorm"), this.characterBody.corePosition, Quaternion.identity).GetComponent <MeteorStormController>();
                component.owner       = base.gameObject;
                component.ownerDamage = this.characterBody.damage;
                component.isCrit      = Util.CheckRoll(this.characterBody.crit, this.characterBody.master);
                NetworkServer.Spawn(component.gameObject);
                return(true);
            }

            case EquipmentIndex.SoulJar:
                return(true);

            case EquipmentIndex.Blackhole:
            {
                Vector3 position2 = base.transform.position;
                Ray     aimRay2   = this.GetAimRay();
                ProjectileManager.instance.FireProjectile(Resources.Load <GameObject>("Prefabs/Projectiles/GravSphere"), position2, Util.QuaternionSafeLookRotation(aimRay2.direction), base.gameObject, 0f, 0f, false, DamageColorIndex.Default, null, -1f);
                return(true);
            }

            case EquipmentIndex.GhostGun:
            {
                GameObject gameObject = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/GhostGun"), base.transform.position, Quaternion.identity);
                gameObject.GetComponent <GhostGunController>().owner = base.gameObject;
                NetworkServer.Spawn(gameObject);
                return(true);
            }

            case EquipmentIndex.CritOnUse:
                this.characterBody.AddTimedBuff(BuffIndex.FullCrit, 8f);
                return(true);

            case EquipmentIndex.DroneBackup:
            {
                Util.PlaySound("Play_item_use_radio", base.gameObject);
                int   sliceCount = 4;
                float num        = 25f;
                if (NetworkServer.active)
                {
                    float y = Quaternion.LookRotation(this.GetAimRay().direction).eulerAngles.y;
                    float d = 3f;
                    foreach (float num2 in new DegreeSlices(sliceCount, 0.5f))
                    {
                        Quaternion      rotation        = Quaternion.Euler(0f, y + num2, 0f);
                        Quaternion      rotation2       = Quaternion.Euler(0f, y + num2 + 180f, 0f);
                        Vector3         position3       = base.transform.position + rotation * (Vector3.forward * d);
                        CharacterMaster characterMaster = this.SummonMaster(Resources.Load <GameObject>("Prefabs/CharacterMasters/DroneBackupMaster"), position3, rotation2);
                        if (characterMaster)
                        {
                            characterMaster.gameObject.AddComponent <MasterSuicideOnTimer>().lifeTimer = num + UnityEngine.Random.Range(0f, 3f);
                        }
                    }
                }
                this.subcooldownTimer = 0.5f;
                return(true);
            }

            case EquipmentIndex.OrbitalLaser:
            {
                Vector3    position4 = base.transform.position;
                RaycastHit raycastHit;
                if (Physics.Raycast(this.GetAimRay(), out raycastHit, 900f, LayerIndex.world.mask | LayerIndex.defaultLayer.mask))
                {
                    position4 = raycastHit.point;
                }
                GameObject gameObject2 = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("Prefabs/NetworkedObjects/OrbitalLaser"), position4, Quaternion.identity);
                gameObject2.GetComponent <OrbitalLaserController>().ownerBody = this.characterBody;
                NetworkServer.Spawn(gameObject2);
                return(true);
            }

            case EquipmentIndex.BFG:
                this.bfgChargeTimer   = 2f;
                this.subcooldownTimer = 2.2f;
                return(true);

            case EquipmentIndex.Enigma:
            {
                EquipmentIndex equipmentIndex2 = EquipmentCatalog.enigmaEquipmentList[UnityEngine.Random.Range(0, EquipmentCatalog.enigmaEquipmentList.Count - 1)];
                this.PerformEquipmentAction(equipmentIndex2);
                return(true);
            }

            case EquipmentIndex.Jetpack:
            {
                JetpackController jetpackController = JetpackController.FindJetpackController(base.gameObject);
                if (!jetpackController)
                {
                    GameObject gameObject3 = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/JetpackController"));
                    jetpackController = gameObject3.GetComponent <JetpackController>();
                    jetpackController.NetworktargetObject = base.gameObject;
                    NetworkServer.Spawn(gameObject3);
                    return(true);
                }
                jetpackController.ResetTimer();
                return(true);
            }

            case EquipmentIndex.Lightning:
            {
                this.UpdateTargets();
                HurtBox hurtBox = this.currentTargetHurtBox;
                if (hurtBox)
                {
                    this.subcooldownTimer = 0.2f;
                    OrbManager.instance.AddOrb(new LightningStrikeOrb
                        {
                            attacker         = base.gameObject,
                            damageColorIndex = DamageColorIndex.Item,
                            damageValue      = this.characterBody.damage * 30f,
                            isCrit           = Util.CheckRoll(this.characterBody.crit, this.characterBody.master),
                            procChainMask    = default(ProcChainMask),
                            procCoefficient  = 1f,
                            target           = hurtBox
                        });
                    this.InvalidateCurrentTarget();
                    return(true);
                }
                return(false);
            }

            case EquipmentIndex.PassiveHealing:
                if (this.passiveHealingFollower)
                {
                    this.UpdateTargets();
                    this.passiveHealingFollower.AssignNewTarget(this.currentTargetBodyObject);
                    this.InvalidateCurrentTarget();
                    return(true);
                }
                return(true);

            case EquipmentIndex.BurnNearby:
                if (this.characterBody)
                {
                    this.characterBody.AddHelfireDuration(8f);
                    return(true);
                }
                return(true);

            case EquipmentIndex.SoulCorruptor:
            {
                this.UpdateTargets();
                HurtBox hurtBox2 = this.currentTargetHurtBox;
                if (!hurtBox2)
                {
                    return(false);
                }
                if (!hurtBox2.healthComponent || hurtBox2.healthComponent.combinedHealthFraction > 0.25f)
                {
                    return(false);
                }
                Util.TryToCreateGhost(hurtBox2.healthComponent.body, this.characterBody, 30);
                hurtBox2.healthComponent.Suicide(base.gameObject, null, DamageType.Generic);
                this.InvalidateCurrentTarget();
                return(true);
            }

            case EquipmentIndex.Scanner:
                NetworkServer.Spawn(UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/ChestScanner"), this.characterBody.corePosition, Quaternion.identity));
                return(true);

            case EquipmentIndex.CrippleWard:
                NetworkServer.Spawn(UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/CrippleWard"), this.characterBody.corePosition, Quaternion.identity));
                this.inventory.SetEquipmentIndex(EquipmentIndex.None);
                return(true);

            case EquipmentIndex.Gateway:
                return(this.FireGateway());

            case EquipmentIndex.Tonic:
                this.characterBody.AddTimedBuff(BuffIndex.TonicBuff, EquipmentSlot.tonicBuffDuration);
                if (!Util.CheckRoll(80f, this.characterBody.master))
                {
                    this.characterBody.pendingTonicAfflictionCount++;
                    return(true);
                }
                return(true);

            case EquipmentIndex.QuestVolatileBattery:
                return(false);

            case EquipmentIndex.Cleanse:
            {
                Vector3    corePosition = this.characterBody.corePosition;
                EffectData effectData2  = new EffectData
                {
                    origin = corePosition
                };
                effectData2.SetHurtBoxReference(this.characterBody.mainHurtBox);
                EffectManager.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/CleanseEffect"), effectData2, true);
                BuffIndex buffIndex = BuffIndex.Slow50;
                BuffIndex buffCount = (BuffIndex)BuffCatalog.buffCount;
                while (buffIndex < buffCount)
                {
                    if (BuffCatalog.GetBuffDef(buffIndex).isDebuff)
                    {
                        this.characterBody.ClearTimedBuffs(buffIndex);
                    }
                    buffIndex++;
                }
                DotController.RemoveAllDots(base.gameObject);
                SetStateOnHurt component2 = base.GetComponent <SetStateOnHurt>();
                if (component2)
                {
                    component2.Cleanse();
                }
                float     num3      = 6f;
                float     num4      = num3 * num3;
                TeamIndex teamIndex = this.teamComponent.teamIndex;
                List <ProjectileController> instancesList = InstanceTracker.GetInstancesList <ProjectileController>();
                List <ProjectileController> list          = new List <ProjectileController>();
                int i     = 0;
                int count = instancesList.Count;
                while (i < count)
                {
                    ProjectileController projectileController = instancesList[i];
                    if (projectileController.teamFilter.teamIndex != teamIndex && (projectileController.transform.position - corePosition).sqrMagnitude < num4)
                    {
                        list.Add(projectileController);
                    }
                    i++;
                }
                int j      = 0;
                int count2 = list.Count;
                while (j < count2)
                {
                    ProjectileController projectileController2 = list[j];
                    if (projectileController2)
                    {
                        UnityEngine.Object.Destroy(projectileController2.gameObject);
                    }
                    j++;
                }
                return(true);
            }

            case EquipmentIndex.FireBallDash:
            {
                Ray        aimRay3     = this.GetAimRay();
                GameObject gameObject4 = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/FireballVehicle"), aimRay3.origin, Quaternion.LookRotation(aimRay3.direction));
                gameObject4.GetComponent <VehicleSeat>().AssignPassenger(base.gameObject);
                CharacterBody characterBody = this.characterBody;
                NetworkUser   networkUser;
                if (characterBody == null)
                {
                    networkUser = null;
                }
                else
                {
                    CharacterMaster master = characterBody.master;
                    if (master == null)
                    {
                        networkUser = null;
                    }
                    else
                    {
                        PlayerCharacterMasterController playerCharacterMasterController = master.playerCharacterMasterController;
                        networkUser = ((playerCharacterMasterController != null) ? playerCharacterMasterController.networkUser : null);
                    }
                }
                NetworkUser networkUser2 = networkUser;
                if (networkUser2)
                {
                    NetworkServer.SpawnWithClientAuthority(gameObject4, networkUser2.gameObject);
                }
                else
                {
                    NetworkServer.Spawn(gameObject4);
                }
                this.subcooldownTimer = 2f;
                return(true);
            }

            case EquipmentIndex.GainArmor:
                this.characterBody.AddTimedBuff(BuffIndex.ElephantArmorBoost, 5f);
                return(true);
            }
            return(false);
        }
示例#17
0
        public void TakeDamage(DamageInfo damageInfo)
        {
            if (!NetworkServer.active)
            {
                Debug.LogWarning("[Server] function 'System.Void RoR2.HealthComponent::TakeDamage(RoR2.DamageInfo)' called on client");
                return;
            }
            if (!alive || godMode)
            {
                return;
            }
            CharacterBody characterBody = null;

            if (damageInfo.attacker)
            {
                characterBody = damageInfo.attacker.GetComponent <CharacterBody>();
            }
            BroadcastMessage("OnIncomingDamage", damageInfo, SendMessageOptions.DontRequireReceiver);
            var master = body.master;

            GetComponent <TeamComponent>();
            if (master && master.inventory)
            {
                var itemCount = master.inventory.GetItemCount((ItemIndex)1);
                if (itemCount > 0 && Util.CheckRoll((1f - 1f / (0.15f * itemCount + 1f)) * 100f, 0f, null))
                {
                    var effectData = new EffectData
                    {
                        origin   = damageInfo.position,
                        rotation = Util.QuaternionSafeLookRotation((damageInfo.force != Vector3.zero) ? damageInfo.force : Random.onUnitSphere)
                    };
                    EffectManager.instance.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/BearProc"), effectData, true);
                    damageInfo.rejected = true;
                }
            }
            if (body.HasBuff((BuffIndex)3))
            {
                damageInfo.rejected = true;
            }
            if (body.HasBuff((BuffIndex)23) && (!characterBody || !characterBody.HasBuff((BuffIndex)22)))
            {
                EffectManager.instance.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/DamageRejected"), new EffectData
                {
                    origin = damageInfo.position
                }, true);
                damageInfo.rejected = true;
            }
            if (damageInfo.rejected)
            {
                return;
            }
            var num = damageInfo.damage;

            if (characterBody)
            {
                var master2 = characterBody.master;
                if (master2 && master2.inventory)
                {
                    if (combinedHealth >= fullCombinedHealth * 0.9f)
                    {
                        var itemCount2 = master2.inventory.GetItemCount((ItemIndex)17);
                        if (itemCount2 > 0)
                        {
                            Util.PlaySound("Play_item_proc_crowbar", gameObject);
                            num *= 1.5f + 0.3f * (itemCount2 - 1);
                            EffectManager.instance.SimpleImpactEffect(Resources.Load <GameObject>("Prefabs/Effects/ImpactEffects/ImpactCrowbar"), damageInfo.position, -damageInfo.force, true);
                        }
                    }
                    if (body.isBoss)
                    {
                        var itemCount3 = master2.inventory.GetItemCount((ItemIndex)61);
                        if (itemCount3 > 0)
                        {
                            num *= 1.2f + 0.1f * (itemCount3 - 1);
                            damageInfo.damageColorIndex = (DamageColorIndex)5;
                            EffectManager.instance.SimpleImpactEffect(Resources.Load <GameObject>("Prefabs/Effects/ImpactEffects/ImpactBossDamageBonus"), damageInfo.position, -damageInfo.force, true);
                        }
                    }
                }
            }
            if (damageInfo.crit)
            {
                num *= 2f;
            }
            if ((damageInfo.damageType & DamageType.WeakPointHit) != 0)
            {
                num *= 1.5f;
                damageInfo.damageColorIndex = (DamageColorIndex)5;
            }
            if ((damageInfo.damageType & DamageType.BypassArmor) == 0)
            {
                var armor = body.armor;
                var num2  = armor >= 0f ? 1f - armor / (armor + 100f) : 2f - 100f / (100f - armor);
                num = Mathf.Max(1f, num * num2);
            }
            if ((damageInfo.damageType & DamageType.BarrierBlocked) != 0)
            {
                damageInfo.force *= 0.5f;
                var component = GetComponent <IBarrier>();
                component?.BlockedDamage(damageInfo, num);
                damageInfo.procCoefficient = 0f;
                num = 0f;
            }
            if (hasOneshotProtection)
            {
                num = Mathf.Min(num, fullCombinedHealth * 0.40f);                 // Make this more aggressive; 90% -> 40%
            }
            if ((damageInfo.damageType & DamageType.SlowOnHit) != 0)
            {
                body.AddTimedBuff(0, 2f);
            }
            if ((damageInfo.damageType & DamageType.ClayGoo) != 0 && (body.bodyFlags & CharacterBody.BodyFlags.ImmuneToGoo) == 0)
            {
                body.AddTimedBuff((BuffIndex)21, 2f);
            }
            if (master && master.inventory)
            {
                var itemCount4 = master.inventory.GetItemCount((ItemIndex)44);
                if (itemCount4 > 0)
                {
                    var num3 = num / fullCombinedHealth;
                    var num4 = (uint)Mathf.Max(master.money * num3 * itemCount4, damageInfo.damage * itemCount4);
                    master.money = (uint)Mathf.Max(0f, master.money - num4);
                    EffectManager.instance.SimpleImpactEffect(Resources.Load <GameObject>("Prefabs/Effects/ImpactEffects/CoinImpact"), damageInfo.position, Vector3.up, true);
                }
            }
            if ((damageInfo.damageType & DamageType.NonLethal) != 0)
            {
                num = Mathf.Max(Mathf.Min(num, health - 1f), 0f);
            }
            if (shield > 0f)
            {
                var num5 = Mathf.Min(num, shield);
                var num6 = num - num5;
                Networkshield = Mathf.Max(shield - num5, 0f);
                if (Mathf.Approximately(shield, 0f))
                {
                    var scale = 1f;
                    if (body)
                    {
                        scale = body.radius;
                    }
                    EffectManager.instance.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/ShieldBreakEffect"), new EffectData
                    {
                        origin = transform.position,
                        scale  = scale
                    }, true);
                }
                if (num6 > 0f)
                {
                    Networkhealth = health - num6;
                }
            }
            else
            {
                Networkhealth = health - num;
            }
            TakeDamageForce(damageInfo, false);
            SendMessage("OnTakeDamage", damageInfo, SendMessageOptions.DontRequireReceiver);
            var damageReport = new DamageReport
            {
                victim     = this,
                damageInfo = damageInfo
            };

            damageReport.damageInfo.damage = num;
            if (num > 0f)
            {
                SendDamageDealt(damageReport);
            }
            UpdateLastHitTime(damageInfo.damage, damageInfo.position, (damageInfo.damageType & (DamageType)2048) > 0);
            if (damageInfo.attacker)
            {
                damageInfo.attacker.SendMessage("OnDamageDealt", damageReport, SendMessageOptions.DontRequireReceiver);
            }
            GlobalEventManager.ServerDamageDealt(damageReport);
            if (isInFrozenState && (body.bodyFlags & (CharacterBody.BodyFlags) 16) == 0 && combinedHealthFraction < 0.3f)
            {
                Networkhealth = -1f;
                EffectManager.instance.SpawnEffect(FrozenState.executeEffectPrefab, new EffectData
                {
                    origin = body.corePosition,
                    scale  = body ? body.radius : 1f
                }, true);
            }
            if (!alive)
            {
                BroadcastMessage("OnKilled", damageInfo, SendMessageOptions.DontRequireReceiver);
                if (damageInfo.attacker)
                {
                    damageInfo.attacker.SendMessage("OnKilledOther", damageReport, SendMessageOptions.DontRequireReceiver);
                }
                GlobalEventManager.instance.OnCharacterDeath(damageReport);
                return;
            }
            if (master && master.inventory)
            {
                var itemCount5 = master.inventory.GetItemCount((ItemIndex)25);
                if (itemCount5 > 0 && Util.CheckRoll(damageInfo.damage / fullCombinedHealth * 100f, master))
                {
                    body.AddTimedBuff((BuffIndex)7, 1.5f + itemCount5 * 1.5f);
                    body.AddTimedBuff((BuffIndex)8, 1.5f + itemCount5 * 1.5f);
                    EffectManager.instance.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/ProcStealthkit"), new EffectData
                    {
                        origin   = transform.position,
                        rotation = Quaternion.identity
                    }, true);
                }
            }
        }