Exemple #1
0
        public override void OnEnter()
        {
            base.OnEnter();
            PyroHeatController phc = base.GetComponent <PyroHeatController>();
            float currentHeat      = phc.GetHeat();

            //float currentHeat = 1f;
            if (currentHeat >= Jetpack.heatCost)
            {
                heatMult = 1f;
                phc.ConsumeHeat(Jetpack.heatCost);
            }
            else
            {
                heatMult = currentHeat / Jetpack.heatCost;
                phc.ConsumeHeat(currentHeat);
            }

            if (base.characterBody && base.characterMotor)
            {
                Ray aimRay = base.GetAimRay();
                if (base.characterMotor.velocity.y < 0f)
                {
                    base.characterMotor.velocity.y = 0f;
                }
                if (base.characterMotor.isGrounded)
                {
                    base.characterMotor.rootMotion.y += 1;
                }
                Vector3 direction = new Vector3(aimRay.direction.x, aimRay.direction.y > 0 ? aimRay.direction.y * Mathf.Lerp(Jetpack.verticalForceMin, Jetpack.verticalForceMax, heatMult) : aimRay.direction.y, aimRay.direction.z);
                base.characterMotor.ApplyForce(direction * Jetpack.selfForce, true, false);
            }
            Util.PlaySound(Jetpack.startJetpackSoundString, base.gameObject);
        }
Exemple #2
0
        public void Awake()
        {
            Setup();

            On.RoR2.HealthComponent.TakeDamage += (orig, self, damageInfo) =>
            {
                bool isPyro = false;
                if (damageInfo.attacker != null)
                {
                    CharacterBody cb = damageInfo.attacker.GetComponent <CharacterBody>();
                    if (cb && cb.baseNameToken == "PYRO_BODY_NAME")
                    {
                        isPyro = true;
                    }
                }

                //This could be done less hackily once official custom damagetype support is in.
                bool isScorch     = false;
                bool isBlazeborne = false;
                bool isFlaregun   = false;
                if (isPyro)
                {
                    if (damageInfo.procCoefficient == Scorch.procCoefficient && damageInfo.damageColorIndex == DamageColorIndex.Default && damageInfo.damageType == DamageType.IgniteOnHit)
                    {
                        isScorch = true;
                        damageInfo.damageType = DamageType.Generic; //Overwrite scorch attempting to ignite.
                    }
                    else if (damageInfo.damageColorIndex == DamageColorIndex.Default && damageInfo.procCoefficient == 1f)
                    {
                        if (damageInfo.damageType == (DamageType.IgniteOnHit | DamageType.SlowOnHit))
                        {
                            isBlazeborne          = true;
                            damageInfo.damageType = DamageType.IgniteOnHit; //The SlowOnHit damagetype is purely for identification purposes.
                        }
                        else if (damageInfo.damageType == (DamageType.IgniteOnHit | DamageType.AOE))
                        {
                            isFlaregun = true;
                        }
                    }
                }

                if (isBlazeborne)  //Handle Blazeborne reheating.
                {
                    int burnCount = self.body.GetBuffCount(BuffIndex.OnFire);
                    if (self.body && burnCount > 0)
                    {
                        damageInfo.damage *= 1 + burnCount * Blazeborne.ignitedDirectHitMult;

                        PyroHeatController phc = damageInfo.attacker.GetComponent <PyroHeatController>();
                        if (phc)
                        {
                            phc.RpcAddHeatServer(Blazeborne.ignitedHeatPercentRestore);
                        }
                    }
                }
                else if (isFlaregun)
                {
                    int burnCount = self.body.GetBuffCount(BuffIndex.OnFire);
                    if (self.body && burnCount > 0)
                    {
                        damageInfo.damage *= 1 + burnCount * Flaregun.ignitedDirectHitMult;

                        PyroHeatController phc = damageInfo.attacker.GetComponent <PyroHeatController>();
                        if (phc)
                        {
                            phc.RpcAddHeatServer(Flaregun.ignitedHeatPercentRestore);
                        }
                    }
                }

                orig(self, damageInfo);

                //For Scorch, manually apply a burn DoT so that it will last longer, because Scorch has a low proc coefficient.
                if (isScorch)
                {
                    DotController.InflictDot(self.gameObject, damageInfo.attacker, DotController.DotIndex.Burn, 4.5f, 1f);
                }
            };
        }