예제 #1
0
        public override void SetupBehavior()
        {
            base.SetupBehavior();

            GameObject warbannerPrefab = Resources.Load <GameObject>("Prefabs/NetworkedObjects/WarbannerWard");

            CharmWardPrefab = warbannerPrefab.InstantiateClone("Bulletstorm_CharmHornWard", true);

            BuffWard buffWard = CharmWardPrefab.GetComponent <BuffWard>();

            buffWard.expires          = true;
            buffWard.expireDuration   = 0.6f;
            buffWard.buffDuration     = CharmDuration;
            buffWard.invertTeamFilter = true;
            buffWard.animateRadius    = false;
            buffWard.floorWard        = false;
            buffWard.buffDef          = Shared.Buffs.BuffsController.Charm;

            SkinnedMeshRenderer mesh = CharmWardPrefab.GetComponentInChildren <SkinnedMeshRenderer>();

            mesh.material.color = new Color32(217, 20, 194, 255);
            if (CharmWardPrefab)
            {
                PrefabAPI.RegisterNetworkPrefab(CharmWardPrefab);
            }
        }
예제 #2
0
 public void CharmNearby(CharacterBody body, float radius)
 {
     if (NetworkServer.active)
     {
         GameObject gameObject = UnityEngine.Object.Instantiate(CharmWardPrefab, body.transform.position, Quaternion.identity);
         gameObject.GetComponent <TeamFilter>().teamIndex = body.teamComponent.teamIndex;
         BuffWard buffWard = gameObject.GetComponent <BuffWard>();
         buffWard.buffDef = Shared.Buffs.BuffsController.Charm;
         buffWard.GetComponent <BuffWard>().Networkradius *= radius;
         buffWard.GetComponent <BuffWard>().radius        *= radius;
         NetworkServer.Spawn(gameObject);
     }
 }
        public override void OnEnter()
        {
            VoidRiftTracker tracker = base.gameObject.GetComponent <VoidRiftTracker>();

            missionController = CRMissionController.instance;
            childLocator      = tracker.childLocator;

            rangeIndicator = childLocator.FindChild("RangeIndicator");
            buffIndicator  = childLocator.FindChild("BuffIndicator");

            voidBuffWard       = tracker.voidWard;
            protectionBuffWard = tracker.protectionWard;
        }
예제 #4
0
 private void BuffWard_BuffTeam(On.RoR2.BuffWard.orig_BuffTeam orig, BuffWard self, IEnumerable <TeamComponent> recipients, float radiusSqr, Vector3 currentPosition)
 {
     if (self.buffDef == RoR2Content.Buffs.AffixHauntedRecipient || self.buffDef == RoR2Content.Buffs.Cloak)
     {
         var newList = recipients.ToList();
         foreach (var recipient in recipients)
         {
             var comp = recipient.GetComponent <SetStateOnHurt>();
             if (comp && comp.targetStateMachine && comp.targetStateMachine.state is ShockState)
             {
                 newList.Remove(recipient);
             }
         }
         recipients = newList;
     }
     orig(self, recipients, radiusSqr, currentPosition);
 }
예제 #5
0
        public override void SetupBehavior()
        {
            base.SetupBehavior();

            GameObject warbannerPrefab = Resources.Load <GameObject>("Prefabs/NetworkedObjects/WarbannerWard");

            MagazinePrefab = warbannerPrefab.InstantiateClone("Bulletstorm_MagazineRackObject", true);

            BuffWard buffWard = MagazinePrefab.GetComponent <BuffWard>();

            buffWard.Networkradius  = EffectRadius;
            buffWard.radius         = EffectRadius;
            buffWard.expires        = true;
            buffWard.expireDuration = EffectDuration;
            buffWard.buffDef        = RoR2Content.Buffs.NoCooldowns;

            if (MagazinePrefab)
            {
                PrefabAPI.RegisterNetworkPrefab(MagazinePrefab);
            }
        }
예제 #6
0
        public static void RegisterProjectiles()
        {
            //would like to simplify this all eventually....
            #region SpinningSlashShockwave
            shockwave = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/BrotherSunderWave"), "PaladinShockwave", true);
            shockwave.transform.GetChild(0).transform.localScale = new Vector3(10, 1.5f, 1);
            shockwave.GetComponent <ProjectileCharacterController>().lifetime = 0.5f;
            shockwave.GetComponent <ProjectileDamage>().damageType            = DamageType.Stun1s;

            GameObject shockwaveGhost = PrefabAPI.InstantiateClone(shockwave.GetComponent <ProjectileController>().ghostPrefab, "PaladinShockwaveGhost", false);
            shockwaveGhost.transform.GetChild(0).transform.localScale = new Vector3(10, 1, 1);
            shockwaveGhost.transform.GetChild(1).transform.localScale = new Vector3(10, 1.5f, 1);
            PaladinPlugin.Destroy(shockwaveGhost.transform.GetChild(0).Find("Infection, World").gameObject);
            PaladinPlugin.Destroy(shockwaveGhost.transform.GetChild(0).Find("Water").gameObject);

            //Material shockwaveMat = Resources.Load<GameObject>("Prefabs/Projectiles/LunarWispTrackingBomb").GetComponent<ProjectileController>().ghostPrefab.transform.GetChild(0).GetComponent<ParticleSystemRenderer>().material;
            shockwaveGhost.transform.GetChild(1).GetComponent <MeshRenderer>().material = Modules.Assets.matMeteorIndicator;

            shockwave.GetComponent <ProjectileController>().ghostPrefab = shockwaveGhost;
            #endregion

            #region LunarShard
            lunarShard = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/LunarShardProjectile"), "PaladinLunarShard", true);
            PaladinPlugin.Destroy(lunarShard.GetComponent <ProjectileSteerTowardTarget>());
            lunarShard.GetComponent <ProjectileImpactExplosion>().blastDamageCoefficient = 1f;
            #endregion

            #region SunlightSpear
            lightningSpear = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/MageLightningBombProjectile"), "LightningSpear", true);
            lightningSpear.AddComponent <Misc.ProjectileOverchargeOnImpact>();

            GameObject spearGhost = Assets.lightningSpear.InstantiateClone("LightningSpearGhost", false);
            spearGhost.AddComponent <ProjectileGhostController>();

            //vfx
            foreach (ParticleSystemRenderer i in spearGhost.GetComponentsInChildren <ParticleSystemRenderer>())
            {
                if (i)
                {
                    i.trailMaterial = Modules.Assets.matYellowLightningLong;
                }
            }
            Light light = spearGhost.GetComponentInChildren <Light>();
            light.range     = 16f;
            light.intensity = 32f;
            spearGhost.GetComponentInChildren <TrailRenderer>().material = Modules.Assets.matYellowLightningLong;

            lightningSpear.transform.localScale *= 2f;

            lightningSpear.GetComponent <ProjectileController>().ghostPrefab = spearGhost;
            //lightningSpear.GetComponent<ProjectileOverlapAttack>().impactEffect = Assets.lightningImpactFX;
            lightningSpear.GetComponent <ProjectileDamage>().damageType            = DamageType.Shock5s;
            lightningSpear.GetComponent <ProjectileImpactExplosion>().impactEffect = Assets.altLightningImpactFX;
            lightningSpear.GetComponent <Rigidbody>().useGravity = false;

            PaladinPlugin.Destroy(lightningSpear.GetComponent <AntiGravityForce>());
            PaladinPlugin.Destroy(lightningSpear.GetComponent <ProjectileProximityBeamController>());
            #endregion

            #region SwordBeam
            swordBeamProjectile = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/FMJ"), "PaladinSwordBeam", true);
            swordBeamProjectile.transform.localScale = new Vector3(6, 3, 2);
            //GameObject beamGhost = Assets.swordBeam.InstantiateClone("SwordBeamGhost", false);
            //beamGhost.AddComponent<ProjectileGhostController>();

            //swordBeam.GetComponent<ProjectileController>().ghostPrefab = Assets.swordBeamGhost;

            GameObject MercEvisProjectileGhost = Resources.Load <GameObject>("Prefabs/Projectiles/EvisProjectile").GetComponent <ProjectileController>().ghostPrefab;
            swordBeamProjectile.GetComponent <ProjectileController>().ghostPrefab = MercEvisProjectileGhost;
            swordBeamProjectile.GetComponent <ProjectileDamage>().damageType      = DamageType.Generic;

            PaladinPlugin.Destroy(swordBeamProjectile.transform.Find("SweetSpotBehavior").gameObject);

            //run this in case moffein's phase round lightning is installed
            if (swordBeamProjectile.GetComponent <ProjectileProximityBeamController>())
            {
                PaladinPlugin.Destroy(swordBeamProjectile.GetComponent <ProjectileProximityBeamController>());
            }

            swordBeamProjectile.AddComponent <DestroyOnTimer>().duration = 0.3f;

            #endregion

            #region Replenish
            heal = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/SporeGrenadeProjectileDotZone"), "PaladinHeal", true);
            heal.transform.localScale = Vector3.one;

            PaladinMod.PaladinPlugin.Destroy(heal.GetComponent <ProjectileDotZone>());

            heal.AddComponent <DestroyOnTimer>().duration = 5f;

            Misc.PaladinHealController healController = heal.AddComponent <Misc.PaladinHealController>();

            healController.radius        = StaticValues.healRadius;
            healController.healAmount    = StaticValues.healAmount;
            healController.barrierAmount = StaticValues.healBarrier;

            PaladinMod.PaladinPlugin.Destroy(heal.transform.GetChild(0).gameObject);
            GameObject healFX = Assets.healEffectPrefab.InstantiateClone("HealEffect", false);
            healFX.transform.parent        = heal.transform;
            healFX.transform.localPosition = Vector3.zero;

            healFX.transform.localScale = Vector3.one * StaticValues.healRadius * 2f;
            #endregion

            #region SacredSunlight
            healZone = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/SporeGrenadeProjectileDotZone"), "PaladinHealZone", true);
            healZone.transform.localScale = Vector3.one;

            PaladinMod.PaladinPlugin.Destroy(healZone.GetComponent <ProjectileDotZone>());

            healZone.AddComponent <DestroyOnTimer>().duration = StaticValues.healZoneDuration + 2f;

            Misc.PaladinHealZoneController healZoneController = healZone.AddComponent <Misc.PaladinHealZoneController>();

            healZoneController.radius            = StaticValues.healZoneRadius;
            healZoneController.interval          = 0.25f;
            healZoneController.rangeIndicator    = null;
            healZoneController.buffDuration      = 0f;
            healZoneController.floorWard         = false;
            healZoneController.expires           = true;
            healZoneController.invertTeamFilter  = false;
            healZoneController.expireDuration    = StaticValues.healZoneDuration;
            healZoneController.animateRadius     = false;
            healZoneController.healAmount        = StaticValues.healZoneAmount;
            healZoneController.barrierAmount     = StaticValues.healZoneBarrier;
            healZoneController.freezeProjectiles = false;

            PaladinMod.PaladinPlugin.Destroy(healZone.transform.GetChild(0).gameObject);
            GameObject healZoneFX = Assets.healZoneEffectPrefab.InstantiateClone("HealZoneEffect", false);
            healZoneFX.transform.parent        = healZone.transform;
            healZoneFX.transform.localPosition = Vector3.zero;

            InitSpellEffect(healZoneFX, StaticValues.healZoneRadius, StaticValues.healZoneDuration);
            #endregion

            #region ScepterSacredSunlight
            scepterHealZone = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/SporeGrenadeProjectileDotZone"), "PaladinScepterHealZone", true);
            scepterHealZone.transform.localScale = Vector3.one;

            PaladinMod.PaladinPlugin.Destroy(scepterHealZone.GetComponent <ProjectileDotZone>());

            scepterHealZone.AddComponent <DestroyOnTimer>().duration = StaticValues.scepterHealZoneDuration + 2f;

            Misc.PaladinHealZoneController scepterHealZoneController = scepterHealZone.AddComponent <Misc.PaladinHealZoneController>();

            scepterHealZoneController.radius            = StaticValues.scepterHealZoneRadius;
            scepterHealZoneController.interval          = 0.25f;
            scepterHealZoneController.rangeIndicator    = null;
            scepterHealZoneController.buffDuration      = 0f;
            scepterHealZoneController.floorWard         = false;
            scepterHealZoneController.expires           = true;
            scepterHealZoneController.invertTeamFilter  = false;
            scepterHealZoneController.expireDuration    = StaticValues.scepterHealZoneDuration;
            scepterHealZoneController.animateRadius     = false;
            scepterHealZoneController.healAmount        = StaticValues.scepterHealZoneAmount;
            scepterHealZoneController.barrierAmount     = StaticValues.scepterHealZoneBarrier;
            scepterHealZoneController.freezeProjectiles = false;
            scepterHealZoneController.cleanseDebuffs    = true;

            PaladinMod.PaladinPlugin.Destroy(scepterHealZone.transform.GetChild(0).gameObject);
            GameObject scepterHealZoneFX = Assets.healZoneEffectPrefab.InstantiateClone("ScepterHealZoneEffect", false);
            scepterHealZoneFX.transform.parent        = scepterHealZone.transform;
            scepterHealZoneFX.transform.localPosition = Vector3.zero;

            InitSpellEffect(scepterHealZoneFX, StaticValues.scepterHealZoneRadius, StaticValues.scepterHealZoneDuration);
            #endregion

            #region VowOfSilence
            torpor = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/SporeGrenadeProjectileDotZone"), "PaladinTorpor", true);
            torpor.transform.localScale = Vector3.one;

            PaladinMod.PaladinPlugin.Destroy(torpor.GetComponent <ProjectileDotZone>());

            torpor.AddComponent <DestroyOnTimer>().duration = StaticValues.torporDuration + 2f;

            Misc.PaladinHealZoneController torporController = torpor.AddComponent <Misc.PaladinHealZoneController>();

            torporController.radius            = StaticValues.torporRadius;
            torporController.interval          = 1f;
            torporController.rangeIndicator    = null;
            torporController.buffDef           = Buffs.torporDebuff;
            torporController.buffDuration      = 1f;
            torporController.floorWard         = false;
            torporController.expires           = true;
            torporController.invertTeamFilter  = true;
            torporController.expireDuration    = StaticValues.torporDuration;
            torporController.animateRadius     = false;
            torporController.healAmount        = 0f;
            torporController.freezeProjectiles = false;
            torporController.grounding         = true;

            PaladinMod.PaladinPlugin.Destroy(torpor.transform.GetChild(0).gameObject);
            GameObject torporFX = Assets.torporEffectPrefab.InstantiateClone("TorporEffect", false);
            torporFX.transform.parent        = torpor.transform;
            torporFX.transform.localPosition = Vector3.zero;

            InitSpellEffect(torporFX, StaticValues.torporRadius, StaticValues.torporDuration);
            #endregion

            #region ScepterVowOfSilence
            scepterTorpor = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/SporeGrenadeProjectileDotZone"), "PaladinScepterTorpor", true);
            scepterTorpor.transform.localScale = Vector3.one;

            PaladinMod.PaladinPlugin.Destroy(scepterTorpor.GetComponent <ProjectileDotZone>());

            scepterTorpor.AddComponent <DestroyOnTimer>().duration = StaticValues.scepterTorporDuration + 2f;

            Misc.PaladinHealZoneController scepterTorporController = scepterTorpor.AddComponent <Misc.PaladinHealZoneController>();

            scepterTorporController.radius            = StaticValues.scepterTorporRadius;
            scepterTorporController.interval          = 1f;
            scepterTorporController.rangeIndicator    = null;
            scepterTorporController.buffDef           = Buffs.scepterTorporDebuff;
            scepterTorporController.buffDuration      = 1f;
            scepterTorporController.floorWard         = false;
            scepterTorporController.expires           = true;
            scepterTorporController.invertTeamFilter  = true;
            scepterTorporController.expireDuration    = StaticValues.scepterTorporDuration;
            scepterTorporController.animateRadius     = false;
            scepterTorporController.healAmount        = 0f;
            scepterTorporController.freezeProjectiles = true;
            scepterTorporController.grounding         = true;

            PaladinMod.PaladinPlugin.Destroy(scepterTorpor.transform.GetChild(0).gameObject);
            GameObject scepterTorporFX = Assets.torporEffectPrefab.InstantiateClone("ScepterTorporEffect", false);
            scepterTorporFX.transform.parent        = scepterTorpor.transform;
            scepterTorporFX.transform.localPosition = Vector3.zero;

            InitSpellEffect(scepterTorporFX, StaticValues.scepterTorporRadius, StaticValues.scepterTorporDuration);
            #endregion

            #region SacredOath
            warcry = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/SporeGrenadeProjectileDotZone"), "PaladinWarcry", true);
            warcry.transform.localScale = Vector3.one;

            PaladinMod.PaladinPlugin.Destroy(warcry.GetComponent <ProjectileDotZone>());

            warcry.AddComponent <DestroyOnTimer>().duration = StaticValues.warcryDuration + 2f;

            BuffWard warcryController = warcry.AddComponent <BuffWard>();

            warcryController.radius           = StaticValues.warcryRadius;
            warcryController.interval         = 0.25f;
            warcryController.rangeIndicator   = null;
            warcryController.buffDef          = Buffs.warcryBuff;
            warcryController.buffDuration     = 2f;
            warcryController.floorWard        = false;
            warcryController.expires          = true;
            warcryController.invertTeamFilter = false;
            warcryController.expireDuration   = StaticValues.warcryDuration;
            warcryController.animateRadius    = false;

            PaladinMod.PaladinPlugin.Destroy(warcry.transform.GetChild(0).gameObject);
            GameObject warcryFX = Assets.warcryEffectPrefab.InstantiateClone("WarcryEffect", false);
            warcryFX.transform.parent        = warcry.transform;
            warcryFX.transform.localPosition = Vector3.zero;

            InitSpellEffect(warcryFX, StaticValues.warcryRadius, StaticValues.warcryDuration);
            #endregion

            #region ScepterSacredOath
            scepterWarcry = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/SporeGrenadeProjectileDotZone"), "PaladinScepterWarcry", true);
            scepterWarcry.transform.localScale = Vector3.one;

            PaladinMod.PaladinPlugin.Destroy(scepterWarcry.GetComponent <ProjectileDotZone>());

            scepterWarcry.AddComponent <DestroyOnTimer>().duration = StaticValues.scepterWarcryDuration + 2f;

            BuffWard scepterWarcryController = scepterWarcry.AddComponent <BuffWard>();

            scepterWarcryController.radius           = StaticValues.scepterWarcryRadius;
            scepterWarcryController.interval         = 0.25f;
            scepterWarcryController.rangeIndicator   = null;
            scepterWarcryController.buffDef          = Buffs.scepterWarcryBuff;
            scepterWarcryController.buffDuration     = 1f;
            scepterWarcryController.floorWard        = false;
            scepterWarcryController.expires          = true;
            scepterWarcryController.invertTeamFilter = false;
            scepterWarcryController.expireDuration   = StaticValues.scepterWarcryDuration;
            scepterWarcryController.animateRadius    = false;

            PaladinMod.PaladinPlugin.Destroy(scepterWarcry.transform.GetChild(0).gameObject);
            GameObject scepterWarcryFX = Assets.warcryEffectPrefab.InstantiateClone("ScepterWarcryEffect", false);
            scepterWarcryFX.transform.parent        = scepterWarcry.transform;
            scepterWarcryFX.transform.localPosition = Vector3.zero;

            InitSpellEffect(scepterWarcryFX, StaticValues.scepterWarcryRadius, StaticValues.scepterWarcryDuration);
            #endregion

            Modules.Prefabs.projectilePrefabs = new List <GameObject>
            {
                swordBeamProjectile,
                shockwave,
                lightningSpear,
                lunarShard,
                heal,
                healZone,
                scepterHealZone,
                torpor,
                scepterTorpor,
                warcry,
                scepterWarcry
            };
        }
        public static void RegisterProjectiles()
        {
            cleaverProjectile  = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/EngiGrenadeProjectile"), "CleaverProjectile");
            milkjarProjectile  = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("prefabs/projectiles/SporeGrenadeProjectile"), "MilkjarProjectile");
            baseballProjectile = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/EngiGrenadeProjectile"), "BaseballProjectile");
            ornamentProjectile = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/EngiGrenadeProjectile"), "OrnamentProjectile");

            milkSplashWard = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/SporeGrenadeProjectileDotZone"), "MilkSplashZone");

            cleaverProjectile.GetComponent <ProjectileController>().procCoefficient = 1f;
            cleaverProjectile.GetComponent <ProjectileDamage>().damage     = 1f;
            cleaverProjectile.GetComponent <ProjectileDamage>().damageType = DamageType.BleedOnHit;
            var projectileImpactExplosion = cleaverProjectile.GetComponent <ProjectileImpactExplosion>();

            projectileImpactExplosion.destroyOnWorld      = true;
            projectileImpactExplosion.blastRadius         = 0f;
            projectileImpactExplosion.timerAfterImpact    = false;
            projectileImpactExplosion.lifetimeAfterImpact = 0f;

            Object.Destroy(cleaverProjectile.GetComponent <ApplyTorqueOnStart>());
            //cleaverProjectile.GetComponent<ProjectileSimple>().velocity = 10; //doesnt work?

            projectileImpactExplosion = milkjarProjectile.GetComponent <ProjectileImpactExplosion>();
            projectileImpactExplosion.fireChildren             = true;
            projectileImpactExplosion.childrenProjectilePrefab = milkSplashWard;
            projectileImpactExplosion.childrenCount            = 1;

            BuffWard buffWard = milkSplashWard.GetComponent <BuffWard>();

            buffWard.animateRadius    = false;
            buffWard.buffDuration     = 0.5f;
            buffWard.buffType         = Buffs.milkedDebuff;
            buffWard.expireDuration   = 0.6f;
            buffWard.invertTeamFilter = true;
            buffWard.radius           = 5f;
            var newWard = milkSplashWard.AddComponent <ExtinguishZonePrefabAlt>();

            newWard.animateRadius = false;
            newWard.radius        = 5f;

            baseballProjectile.AddComponent <BaseballController>();
            var projectileSimple = baseballProjectile.GetComponent <ProjectileSimple>();

            projectileSimple.velocity = 90; //50
            Object.Destroy(baseballProjectile.GetComponent <ProjectileImpactExplosion>());
            var projectileDamage = baseballProjectile.GetComponent <ProjectileDamage>();

            projectileDamage.damage = 1f;

            ProjectileCatalog.getAdditionalEntries += list =>
            {
                list.Add(cleaverProjectile);
                list.Add(milkjarProjectile);
                list.Add(baseballProjectile);
                list.Add(ornamentProjectile);
                list.Add(milkSplashWard);
            };

            RegProj(cleaverProjectile);
            RegProj(milkjarProjectile);
            RegProj(baseballProjectile);
            RegProj(ornamentProjectile);
            RegProj(milkSplashWard);
        }