// Token: 0x0600030A RID: 778 RVA: 0x0000C330 File Offset: 0x0000A530 public override void OnEnter() { base.OnEnter(); if (this.arcVisualizerPrefab) { this.arcVisualizerLineRenderer = UnityEngine.Object.Instantiate <GameObject>(this.arcVisualizerPrefab, base.transform.position, Quaternion.identity).GetComponent <LineRenderer>(); this.calculateArcPointsJob = default(AimThrowableBase.CalculateArcPointsJob); this.completeArcPointsVisualizerJobMethod = new Action(this.CompleteArcVisualizerJob); RoR2Application.onLateUpdate += this.completeArcPointsVisualizerJobMethod; } if (this.endpointVisualizerPrefab) { this.endpointVisualizerTransform = UnityEngine.Object.Instantiate <GameObject>(this.endpointVisualizerPrefab, base.transform.position, Quaternion.identity).transform; } if (base.characterBody) { base.characterBody.hideCrosshair = true; } this.projectileBaseSpeed = this.projectilePrefab.GetComponent <ProjectileSimple>().velocity; this.minimumDuration = this.baseMinimumDuration / this.attackSpeedStat; ProjectileImpactExplosion component = this.projectilePrefab.GetComponent <ProjectileImpactExplosion>(); if (component) { this.detonationRadius = component.blastRadius; if (this.endpointVisualizerTransform) { this.endpointVisualizerTransform.localScale = new Vector3(this.detonationRadius, this.detonationRadius, this.detonationRadius); } } this.UpdateVisualizers(); SceneCamera.onSceneCameraPreRender += this.OnPreRenderSceneCam; }
private static void CreateBigBoulder() { bigBoulderPrefab = CloneProjectilePrefab("CommandoGrenadeProjectile", "GurrenBigBoulderProjectile"); var collider = bigBoulderPrefab.GetComponent <SphereCollider>(); collider.radius = 4f; ProjectileImpactExplosion impactExplosion = bigBoulderPrefab.GetComponent <ProjectileImpactExplosion>(); impactExplosion.blastDamageCoefficient = 1f; impactExplosion.blastProcCoefficient = 1f; impactExplosion.bonusBlastForce = Vector3.up * 10f; impactExplosion.childrenCount = 0; impactExplosion.childrenDamageCoefficient = 0f; impactExplosion.childrenProjectilePrefab = null; impactExplosion.destroyOnWorld = true; impactExplosion.destroyOnEnemy = true; impactExplosion.falloffModel = RoR2.BlastAttack.FalloffModel.None; impactExplosion.fireChildren = false; impactExplosion.lifetimeRandomOffset = 0f; impactExplosion.offsetForLifetimeExpiredSound = 0f; impactExplosion.GetComponent <ProjectileDamage>().damageType = DamageType.Stun1s; impactExplosion.blastRadius = 40f; impactExplosion.lifetime = 12f; impactExplosion.timerAfterImpact = false; impactExplosion.impactEffect = Modules.Assets.gurrenBrokenBoulderEffect; impactExplosion.explosionSoundString = "Play_golem_impact"; ProjectileController projectileController = bigBoulderPrefab.GetComponent <ProjectileController>(); projectileController.ghostPrefab = CreateGhostPrefab("BigBoulderPrefab"); projectileController.startSound = ""; //anim params = isHoldingObject //states = GURREN_LiftingObject, GURREN_HoldingObject, GURREN_ThrowingObject }
private static void CreateVoidBlast() { voidBlastPrefab = CloneProjectilePrefab("CommandoGrenadeProjectile", "NemryVoidBlastProjectile"); ProjectileImpactExplosion bombImpactExplosion = voidBlastPrefab.GetComponent <ProjectileImpactExplosion>(); InitializeImpactExplosion(bombImpactExplosion); bombImpactExplosion.blastRadius = 8f; bombImpactExplosion.destroyOnEnemy = true; bombImpactExplosion.lifetime = 12f; bombImpactExplosion.impactEffect = Resources.Load <GameObject>("Prefabs/Effects/NullifierExplosion"); //bombImpactExplosion.lifetimeExpiredSound = Modules.Assets.CreateNetworkSoundEventDef("HenryBombExplosion"); bombImpactExplosion.timerAfterImpact = true; bombImpactExplosion.lifetimeAfterImpact = 0.1f; ProjectileDamage bombDamage = voidBlastPrefab.GetComponent <ProjectileDamage>(); bombDamage.damageType = DamageType.Nullify; ProjectileController bombController = voidBlastPrefab.GetComponent <ProjectileController>(); bombController.ghostPrefab = Resources.Load <GameObject>("Prefabs/ProjectileGhosts/NullifierPreBombGhost"); bombController.startSound = ""; voidBlastPrefab.GetComponent <Rigidbody>().useGravity = false; }
private static void CreateYokoExplosiveRound() { explosiveRifleRoundPrefab = CloneProjectilePrefab("CommandoGrenadeProjectile", "YokoExplosiveRifleProjectile"); ProjectileImpactExplosion impactExplosion = explosiveRifleRoundPrefab.GetComponent <ProjectileImpactExplosion>(); impactExplosion.blastDamageCoefficient = 1f; impactExplosion.blastProcCoefficient = 1f; impactExplosion.bonusBlastForce = Vector3.zero; impactExplosion.childrenCount = 3; impactExplosion.childrenDamageCoefficient = 0.3f; impactExplosion.childrenProjectilePrefab = explosiveRifleClustersPrefab; impactExplosion.destroyOnWorld = true; impactExplosion.destroyOnEnemy = true; impactExplosion.falloffModel = RoR2.BlastAttack.FalloffModel.Linear; impactExplosion.fireChildren = false; impactExplosion.lifetimeRandomOffset = 0f; impactExplosion.offsetForLifetimeExpiredSound = 0f; impactExplosion.GetComponent <ProjectileDamage>().damageType = DamageType.Generic; impactExplosion.blastRadius = 20f; impactExplosion.lifetime = 12f; impactExplosion.impactEffect = Modules.Assets.yokoRifleExplosiveRoundExplosion; impactExplosion.timerAfterImpact = true; impactExplosion.lifetimeAfterImpact = 0.1f; ProjectileController projectileController = explosiveRifleRoundPrefab.GetComponent <ProjectileController>(); projectileController.ghostPrefab = CreateGhostPrefab("YokoRifleExplosiveRound"); projectileController.startSound = ""; }
//Adds tracking grenade to projectile register list internal static void RegisterDebuffNade() { //Start with base engi grenade cause it has a nice grenade shape debuffGrenadePrefab = LegacyResourcesAPI.Load <GameObject>("prefabs/projectiles/engigrenadeprojectile").InstantiateClone("DebuffGrenade", true); //As long as it actually exists we can do stuff with it if (debuffGrenadePrefab) { //We want ours to go a bit faster than the shitty nade that engi uses debuffGrenadePrefab.GetComponent <ProjectileSimple>().desiredForwardSpeed *= 1.5f; //We gotta take hold of the impact explosion component ProjectileImpactExplosion debuffGrenadeExplosion = debuffGrenadePrefab.GetComponent <ProjectileImpactExplosion>(); //We want ours to explode on impact instead of bouncing around debuffGrenadeExplosion.destroyOnWorld = true; //We want hella more radius debuffGrenadeExplosion.blastRadius = Configuration.GetConfigValue <float>(Configuration.CaptainDebuffnadeRadius); //Linear falloff, idk what it normally is but this way we know for sure its linear debuffGrenadeExplosion.falloffModel = BlastAttack.FalloffModel.Linear; //Implement our own proc coefficient-to-damage-type stuff debuffGrenadeExplosion.blastProcCoefficient = BuffsLoading.ProcToDamageTypeEncoder(BuffsLoading.trackingOnHit.procIndex, 1f); //Change the explosion fx to something cooler as well debuffGrenadeExplosion.impactEffect = LegacyResourcesAPI.Load <GameObject>("prefabs/effects/omnieffect/OmniExplosionVFXScavCannonImpactExplosion"); //Nab the damage component of it ProjectileDamage debuffGrenadeDamage = debuffGrenadePrefab.GetComponent <ProjectileDamage>(); //This lets us use our own special damage type, it converts back to generic when being read off debuffGrenadeDamage.damageType = DamageType.NonLethal; //Add the projectile to the list projList.Add(debuffGrenadePrefab); } }
private static void CreateBazookaRocket() { bazookaRocketPrefab = CloneProjectilePrefab("CommandoGrenadeProjectile", "HenryBazookaRocketProjectile"); bazookaRocketPrefab.AddComponent <Modules.Components.BazookaRotation>(); bazookaRocketPrefab.transform.localScale *= 2f; ProjectileImpactExplosion bazookaImpactExplosion = bazookaRocketPrefab.GetComponent <ProjectileImpactExplosion>(); InitializeImpactExplosion(bazookaImpactExplosion); bazookaImpactExplosion.blastRadius = 8f; bazookaImpactExplosion.destroyOnEnemy = true; bazookaImpactExplosion.lifetime = 12f; bazookaImpactExplosion.impactEffect = Modules.Assets.bazookaExplosionEffect; //bazookaImpactExplosion.lifetimeExpiredSound = Modules.Assets.CreateNetworkSoundEventDef("HenryBazookaExplosion"); bazookaImpactExplosion.timerAfterImpact = true; bazookaImpactExplosion.lifetimeAfterImpact = 0f; ProjectileController bazookaController = bazookaRocketPrefab.GetComponent <ProjectileController>(); GameObject bazookaGhost = CreateGhostPrefab("HenryBazookaRocketGhost"); bazookaGhost.GetComponentInChildren <ParticleSystem>().gameObject.AddComponent <Modules.Components.DetachOnDestroy>(); bazookaController.ghostPrefab = bazookaGhost; bazookaController.startSound = ""; }
private static void Createprojectile() { ProjectileImpactExplosion projectileImpactExplosion = projectile.GetComponent <ProjectileImpactExplosion>(); ProjectileDotZone projectileDotZone = dotZone.GetComponent <ProjectileDotZone>(); projectileImpactExplosion.offsetForLifetimeExpiredSound = 0; projectileImpactExplosion.destroyOnWorld = true; projectileImpactExplosion.timerAfterImpact = true; projectileImpactExplosion.falloffModel = BlastAttack.FalloffModel.None; projectileImpactExplosion.lifetime = 10; projectileImpactExplosion.lifetimeAfterImpact = 0; projectileImpactExplosion.lifetimeRandomOffset = 0; projectileImpactExplosion.blastRadius = 10; projectileImpactExplosion.blastDamageCoefficient = 6; projectileImpactExplosion.blastProcCoefficient = 2; projectileImpactExplosion.blastAttackerFiltering = default; projectileImpactExplosion.bonusBlastForce = new Vector3(0.0f, 600.0f, 0.0f); projectileImpactExplosion.fireChildren = true; projectileImpactExplosion.childrenProjectilePrefab = dotZone; projectileImpactExplosion.childrenCount = 1; projectileImpactExplosion.childrenDamageCoefficient = 1; projectileDotZone.overlapProcCoefficient = 0.5F; projectileDotZone.fireFrequency = 15; projectileDotZone.resetFrequency = 60; projectileDotZone.lifetime = 14; dotZone.transform.localScale = dotZone.transform.localScale * 3; }
private void EditNovaBomb() { GameObject novaProj = Resources.Load <GameObject>("Prefabs/Projectiles/MageLightningBombProjectile"); ProjectileSimple novaSimp = novaProj.GetComponent <ProjectileSimple>(); novaSimp.velocity *= 1.25f; Rigidbody rb = novaProj.GetComponent <Rigidbody>(); rb.useGravity = true; rb.drag = 1f; novaProj.GetComponent <Rigidbody>().useGravity = true; ProjectileImpactExplosion novaImpact = novaProj.GetComponent <ProjectileImpactExplosion>(); novaImpact.blastDamageCoefficient = 1.0f; novaImpact.falloffModel = RoR2.BlastAttack.FalloffModel.None; novaImpact.blastRadius = 15f; ProjectileProximityBeamController novaBeams = novaProj.GetComponent <ProjectileProximityBeamController>(); novaBeams.attackRange *= 1.25f; novaBeams.attackInterval *= 0.9f; novaBeams.bounces += 1; }
private void BuildFlareProjectile() { GameObject flareProjectile = Resources.Load <GameObject>("prefabs/projectiles/magefireboltbasic").InstantiateClone("SS2PyroFlare", true); ProjectileCatalog.getAdditionalEntries += delegate(List <GameObject> list) { list.Add(flareProjectile); }; ProjectileSimple ps = flareProjectile.GetComponent <ProjectileSimple>(); ps.lifetime = 18f; ProjectileImpactExplosion pie = flareProjectile.GetComponent <ProjectileImpactExplosion>(); pie.blastRadius = 8f; pie.blastDamageCoefficient = 1f; pie.blastProcCoefficient = 1f; pie.timerAfterImpact = false; pie.falloffModel = BlastAttack.FalloffModel.None; pie.lifetime = 18f; pie.destroyOnEnemy = true; pie.destroyOnWorld = true; ProjectileDamage pd = flareProjectile.GetComponent <ProjectileDamage>(); pd.damage = 0f; pd.damageColorIndex = DamageColorIndex.Default; pd.damageType = DamageType.IgniteOnHit; Flaregun.projectilePrefab = flareProjectile; FireFlareBurst.projectilePrefab = flareProjectile; //unused skill GameObject reflectProjectile = Resources.Load <GameObject>("prefabs/projectiles/magefireboltbasic").InstantiateClone("SS2PyroFlareReflect", true); ProjectileCatalog.getAdditionalEntries += delegate(List <GameObject> list) { list.Add(reflectProjectile); }; ProjectileImpactExplosion pie2 = reflectProjectile.GetComponent <ProjectileImpactExplosion>(); pie2.blastRadius = 8f; pie2.blastDamageCoefficient = 1f; pie2.blastProcCoefficient = 1f; pie2.timerAfterImpact = false; pie2.falloffModel = BlastAttack.FalloffModel.None; pie2.lifetime = 18f; pie2.destroyOnEnemy = true; pie2.destroyOnWorld = true; ProjectileDamage pd2 = reflectProjectile.GetComponent <ProjectileDamage>(); pd2.damage = 0f; pd2.damageColorIndex = DamageColorIndex.Default; pd2.damageType = DamageType.IgniteOnHit; HeatWave.reflectProjectilePrefab = reflectProjectile; }
public static void UpdateYokoExposionScale(float scale) { var explosionEffect = Modules.Assets.yokoRifleExplosiveRoundExplosion; explosionEffect.transform.localScale = Vector3.one * (5f * scale); ProjectileImpactExplosion impactExplosion = explosiveRifleRoundPrefab.GetComponent <ProjectileImpactExplosion>(); impactExplosion.blastRadius = (20f * scale); }
//Adds nano beacon to the projectile register list internal static void RegisterNanoBeacon() { //Nab the projectile that's usually used for MUL-T scrap launcher nanoBeaconPrefab = LegacyResourcesAPI.Load <GameObject>("prefabs/projectiles/toolbotgrenadelauncherprojectile").InstantiateClone("NanoBeacon", true); //Ofc check if it actually exists if (nanoBeaconPrefab) { //Make it move at our own speed of choice nanoBeaconPrefab.GetComponent <ProjectileSimple>().desiredForwardSpeed = 140f; //Make it so it won't kersplode itself on impact ProjectileSingleTargetImpact nanoBeaconSingle = nanoBeaconPrefab.AddComponent <ProjectileSingleTargetImpact>(); nanoBeaconSingle.destroyWhenNotAlive = false; nanoBeaconSingle.destroyOnWorld = false; //This timed buff only applies on direct hit with nano beacon ProjectileInflictTimedBuff nanoDebuff = nanoBeaconPrefab.AddComponent <ProjectileInflictTimedBuff>(); nanoDebuff.buffDef = BuffsLoading.buffDefTracking; //Tracking lasts for 5 seconds from this nanoDebuff.duration = 5f; //We do in fact want it to stick on impact ProjectileStickOnImpact nanoBeaconStick = nanoBeaconPrefab.AddComponent <ProjectileStickOnImpact>(); //This makes it so it doesn't pass through anything nanoBeaconStick.ignoreCharacters = false; nanoBeaconStick.ignoreWorld = false; //If we enable this the beacon sticks at gross angles, it feels more natural this way nanoBeaconStick.alignNormals = false; //This handles the 'explosion' of the beacon, we are changing it a lot ProjectileImpactExplosion nanoBeaconExplosion = nanoBeaconPrefab.GetComponent <ProjectileImpactExplosion>(); //No more self-destruction nanoBeaconExplosion.destroyOnEnemy = false; nanoBeaconExplosion.destroyOnWorld = false; //No more blast radius nanoBeaconExplosion.blastRadius = 0f; //Live 'forever' or until our code says we want it to vanish nanoBeaconExplosion.lifetime = 100f; //Which is here, it should die 3.5 seconds after impact nanoBeaconExplosion.lifetimeAfterImpact = 3.5f; //No damage for the blast nanoBeaconExplosion.blastDamageCoefficient = 0f; //No blast force nanoBeaconExplosion.bonusBlastForce = Vector3.zero; //Basically no blast, so no falloffmodel either nanoBeaconExplosion.falloffModel = BlastAttack.FalloffModel.None; //This is our component that 'talks' to the MUL-T player's swarm component nanoBeaconPrefab.AddComponent <OnStuckCaller>(); //Add it to the list projList.Add(nanoBeaconPrefab); } }
private static void CheckAndApplySkin(EffectData data, ProjectileImpactExplosion explosion) { if (explosion.explosionSoundString == Main.skinnedProjExplosionString) { var ownerBody = getController(explosion)?.owner?.GetComponent <CharacterBody>(); if (ownerBody != null) { data.genericUInt = ownerBody.skinIndex; } } }
private static void SetupProjectiles() { projectileBombletsPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("prefabs/projectiles/CryoCanisterBombletsProjectile"), "ClusterBombletsArrow"); ProjectileImpactExplosion projectileImpactExplosion1 = projectileBombletsPrefab.GetComponent <ProjectileImpactExplosion>(); projectileImpactExplosion1.lifetime = 0.5f; projectileBombletsPrefab.GetComponent <ProjectileDamage>().damageType = DamageType.Generic; projectilePrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("prefabs/projectiles/PaladinRocket"), "ClusterBombletsArrow"); var projectileSimple = projectilePrefab.GetComponent <ProjectileSimple>(); projectileSimple.desiredForwardSpeed = 150; var projectileImpactExplosion = projectilePrefab.GetComponent <ProjectileImpactExplosion>(); projectileImpactExplosion.lifetime = 8; projectileImpactExplosion.lifetimeAfterImpact = 0; //projectileImpactExplosion.blastRadius = 0; projectileImpactExplosion.blastDamageCoefficient = clusterBombDamageCoefficient; projectileImpactExplosion.blastProcCoefficient = 0; projectileImpactExplosion.blastAttackerFiltering = AttackerFiltering.Default; projectileImpactExplosion.fireChildren = true; projectileImpactExplosion.childrenProjectilePrefab = projectileBombletsPrefab; projectileImpactExplosion.childrenCount = clusterBombChildCount; projectileImpactExplosion.childrenDamageCoefficient = clusterBombChildDamageCoefficient; projectileImpactExplosion.minAngleOffset = new Vector3(-2, -2, -2); projectileImpactExplosion.maxAngleOffset = new Vector3(2, 2, 2); projectileImpactExplosion.useLocalSpaceForChildren = false; if (projectileBombletsPrefab) { PrefabAPI.RegisterNetworkPrefab(projectileBombletsPrefab); } if (projectilePrefab) { PrefabAPI.RegisterNetworkPrefab(projectilePrefab); } ProjectileAPI.Add(projectileBombletsPrefab); ProjectileAPI.Add(projectilePrefab); }
private static GameObject CreateLightningWaveExplosion(float blastRadius, float blastDelay) { GameObject lightningExplosionPrefab = CloneProjectilePrefab("StickyBomb", "ManipulatorLightningExplosion"); ProjectileImpactExplosion lightningExplosionImpact = lightningExplosionPrefab.GetComponent <ProjectileImpactExplosion>(); ProjectileController lightningExplosionController = lightningExplosionPrefab.GetComponent <ProjectileController>(); lightningExplosionController.ghostPrefab = CreateGhostPrefab("ManipulatorInvisibleSticky"); lightningExplosionImpact.impactEffect = Resources.Load <GameObject>("Prefabs/Effects/LightningStakeNova"); lightningExplosionImpact.impactEffect.transform.localScale = new Vector3(1.4f, 1.4f, 1.4f); lightningExplosionImpact.lifetime = blastDelay; lightningExplosionImpact.lifetimeAfterImpact = StatValues.lightningBlastAfterLifetime; lightningExplosionImpact.blastRadius = blastRadius; lightningExplosionImpact.blastDamageCoefficient = StatValues.lightningBlastCoefficient; lightningExplosionImpact.blastProcCoefficient = 0f; lightningExplosionImpact.falloffModel = BlastAttack.FalloffModel.None; UnityEngine.Object.Destroy(lightningExplosionPrefab.GetComponent <LoopSound>()); return(lightningExplosionPrefab); }
private static void CreateBomb() { bombPrefab = CloneProjectilePrefab("CommandoGrenadeProjectile", "HenryBombProjectile"); ProjectileImpactExplosion bombImpactExplosion = bombPrefab.GetComponent <ProjectileImpactExplosion>(); InitializeImpactExplosion(bombImpactExplosion); bombImpactExplosion.blastRadius = 16f; bombImpactExplosion.destroyOnEnemy = true; bombImpactExplosion.lifetime = 12f; bombImpactExplosion.impactEffect = Modules.Assets.bombExplosionEffect; bombImpactExplosion.explosionSoundString = "HenryBombExplosion"; bombImpactExplosion.timerAfterImpact = true; bombImpactExplosion.lifetimeAfterImpact = 0.1f; ProjectileController bombController = bombPrefab.GetComponent <ProjectileController>(); bombController.ghostPrefab = CreateGhostPrefab("HenryBombGhost"); bombController.startSound = ""; }
public override void SetupBehavior() { base.SetupBehavior(); GameObject sporeGrenadeDotZonePrefab = Resources.Load <GameObject>("prefabs/projectiles/SporeGrenadeProjectileDotZone"); WaterPoolPrefab = sporeGrenadeDotZonePrefab.InstantiateClone("Bulletstorm_WaterPool"); ProjectileDotZone projectileDotZone = WaterPoolPrefab.GetComponent <ProjectileDotZone>(); projectileDotZone.attackerFiltering = AttackerFiltering.Default; projectileDotZone.lifetime = CoolantLeak_Duration; ProjectileDamage projectileDamage = WaterPoolPrefab.GetComponent <ProjectileDamage>(); projectileDamage.damageType = DamageType.Shock5s; projectileDamage.enabled = false; GameObject sporeGrenadePrefab = Resources.Load <GameObject>("prefabs/projectiles/SporeGrenadeProjectile"); WaterPoolPlacerPrefab = sporeGrenadePrefab.InstantiateClone("Bulletstorm_WaterPoolPlacer"); WaterPoolPlacerPrefab.GetComponent <ProjectileDamage>().damageColorIndex = DamageColorIndex.Item; ProjectileImpactExplosion projectileImpactExplosion = WaterPoolPlacerPrefab.GetComponent <ProjectileImpactExplosion>(); projectileImpactExplosion.impactEffect = null; projectileImpactExplosion.childrenProjectilePrefab = WaterPoolPrefab; ProjectileCatalog.getAdditionalEntries += list => list.Add(WaterPoolPlacerPrefab); ProjectileCatalog.getAdditionalEntries += list => list.Add(WaterPoolPrefab); if (WaterPoolPlacerPrefab) { PrefabAPI.RegisterNetworkPrefab(WaterPoolPlacerPrefab); } if (WaterPoolPrefab) { PrefabAPI.RegisterNetworkPrefab(WaterPoolPrefab); } }
// Base Stuff // private static void InitializeImpactExplosion(ProjectileImpactExplosion projectileImpactExplosion) { projectileImpactExplosion.blastDamageCoefficient = 1f; projectileImpactExplosion.blastProcCoefficient = 1f; projectileImpactExplosion.blastRadius = 1f; projectileImpactExplosion.bonusBlastForce = Vector3.zero; projectileImpactExplosion.childrenCount = 0; projectileImpactExplosion.childrenDamageCoefficient = 0f; projectileImpactExplosion.childrenProjectilePrefab = null; projectileImpactExplosion.destroyOnEnemy = false; projectileImpactExplosion.destroyOnWorld = false; //projectileImpactExplosion.explosionSoundString = ""; projectileImpactExplosion.falloffModel = RoR2.BlastAttack.FalloffModel.None; projectileImpactExplosion.fireChildren = false; projectileImpactExplosion.impactEffect = null; projectileImpactExplosion.lifetime = 0f; projectileImpactExplosion.lifetimeAfterImpact = 0f; //projectileImpactExplosion.lifetimeExpiredSoundString = ""; projectileImpactExplosion.lifetimeRandomOffset = 0f; projectileImpactExplosion.offsetForLifetimeExpiredSound = 0f; projectileImpactExplosion.timerAfterImpact = false; projectileImpactExplosion.GetComponent <ProjectileDamage>().damageType = DamageType.Generic; }
//Adds cluster bomblets to projectile register list internal static void RegisterArrowBomblet() { //As usual grab the prefab we want to base it off of bombletPrefab = LegacyResourcesAPI.Load <GameObject>("prefabs/projectiles/engigrenadeprojectile").InstantiateClone("ClusterBomblets", true); //If it exists if (bombletPrefab) { //We want ours to actually be a quarter the speed of the actual engi bomblets bombletPrefab.GetComponent <ProjectileSimple>().desiredForwardSpeed /= 4; //This helps them not collide with things except the world bombletPrefab.gameObject.layer = 13; //Grab the explodey component ProjectileImpactExplosion bombletExplosion = bombletPrefab.GetComponent <ProjectileImpactExplosion>(); //Higher blast radius bombletExplosion.blastRadius = 8; //Falloffmodel makes these feel bad so it's same damage regardless of the (small) distance bombletExplosion.falloffModel = BlastAttack.FalloffModel.None; //Reduce the proc coeff a bit for the sake of not making it busted bombletExplosion.blastProcCoefficient = 0.6f; //Make it a cooler kersplodey fx bombletExplosion.impactEffect = LegacyResourcesAPI.Load <GameObject>("prefabs/effects/omnieffect/OmniExplosionVFXCommandoGrenade"); //We want it to blow up on world only, if it's on enemy it just instantly all explodes which is no fun bombletExplosion.destroyOnWorld = true; bombletExplosion.destroyOnEnemy = false; //The projectiles 'live' a long time after impact, but not actually bombletExplosion.lifetimeAfterImpact = 100f; //Explode themselves after 0.8 seconds bombletExplosion.lifetime = 0.8f; //Give or take one second bombletExplosion.lifetimeRandomOffset = 1f; //Add the projectile to the list projList.Add(bombletPrefab); } }
private static void CreateBomb() { bombPrefab = CloneProjectilePrefab("CommandoGrenadeProjectile", "HenryBombProjectile"); ProjectileImpactExplosion bombImpactExplosion = bombPrefab.GetComponent <ProjectileImpactExplosion>(); InitializeImpactExplosion(bombImpactExplosion); bombImpactExplosion.blastRadius = 16f; bombImpactExplosion.destroyOnEnemy = true; bombImpactExplosion.lifetime = 12f; bombImpactExplosion.impactEffect = Modules.Assets.bombExplosionEffect; //bombImpactExplosion.lifetimeExpiredSound = Modules.Assets.CreateNetworkSoundEventDef("HenryBombExplosion"); bombImpactExplosion.timerAfterImpact = true; bombImpactExplosion.lifetimeAfterImpact = 0.1f; ProjectileController bombController = bombPrefab.GetComponent <ProjectileController>(); if (Modules.Assets.mainAssetBundle.LoadAsset <GameObject>("HenryBombGhost") != null) { bombController.ghostPrefab = CreateGhostPrefab("HenryBombGhost"); } bombController.startSound = ""; }
public static void AddHook() { On.RoR2.HealthComponent.TakeDamage += (orig, self, damageInfo) => { bool aliveBeforeHit = self.alive; bool resetCooldownsOnKill = false; bool isDynamiteBundle = false; bool isBarrage = false; float resetDuration = 0f; GracePeriodComponent graceComponent = self.gameObject.GetComponent <GracePeriodComponent>(); if (!graceComponent) { graceComponent = self.gameObject.AddComponent <GracePeriodComponent>(); } bool banditAttacker = false; AssignDynamiteTeamFilter ad = self.gameObject.GetComponent <AssignDynamiteTeamFilter>(); if (ad) { isDynamiteBundle = true; } CharacterBody attackerCB = null; if (damageInfo.attacker) { attackerCB = damageInfo.attacker.GetComponent <CharacterBody>(); if (attackerCB) { banditAttacker = attackerCB.baseNameToken == "BANDITRELOADED_BODY_NAME"; } } if (banditAttacker && graceComponent) { if ((damageInfo.damageType & DamageType.ResetCooldownsOnKill) > 0) { resetCooldownsOnKill = true; if ((damageInfo.damageType & DamageType.SlowOnHit) > 0) { damageInfo.damageType &= ~DamageType.SlowOnHit; isBarrage = true; } int debuffCount = 0; DotController d = DotController.FindDotController(self.gameObject); foreach (BuffIndex buffType in BuffCatalog.debuffBuffIndices) { if (self.body.HasBuff(buffType)) { if (buffType != ModContentPack.skullBuff.buffIndex) { debuffCount++; } else { debuffCount += self.body.GetBuffCount(buffType); } } } DotController dotController = DotController.FindDotController(self.gameObject); if (dotController) { for (DotController.DotIndex dotIndex = DotController.DotIndex.Bleed; dotIndex < DotController.DotIndex.Count; dotIndex++) { if (dotController.HasDotActive(dotIndex)) { debuffCount++; } } } if (isBarrage && self.body.HasBuff(ModContentPack.lightsOutBuff)) { debuffCount--; } float buffDamage = 0f; float buffBaseDamage = damageInfo.damage * specialDebuffBonus; buffDamage = buffBaseDamage * debuffCount; damageInfo.damage += buffDamage; bool lightWeight = false; if (self.body) { Rigidbody rb = self.body.rigidbody; if (rb) { if (rb.mass < 50f) { lightWeight = true; } } } resetDuration = 3.6f; if (!lightWeight) { resetDuration = GracePeriodComponent.graceDuration; } } if (self.alive && (damageInfo.damageType & DamageType.ResetCooldownsOnKill) == 0 && graceComponent.HasReset(attackerCB)) { damageInfo.damageType |= DamageType.ResetCooldownsOnKill; } } if (isDynamiteBundle) { if (!ad.fired && banditAttacker && (damageInfo.damageType & DamageType.AOE) == 0 && damageInfo.procCoefficient > 0f) { ad.fired = true; damageInfo.crit = true; damageInfo.procCoefficient = 0f; ProjectileImpactExplosion pie = self.gameObject.GetComponent <ProjectileImpactExplosion>(); if (pie) { pie.blastRadius *= 2f; } ProjectileDamage pd = self.gameObject.GetComponent <ProjectileDamage>(); if (pd) { if (resetCooldownsOnKill) { pd.damage *= 2f; BanditNetworkCommands bnc = damageInfo.attacker.GetComponent <BanditNetworkCommands>(); if (bnc) { bnc.RpcResetSpecialCooldown(); } } else { pd.damage *= 1.5f; } } } else { damageInfo.rejected = true; } } orig(self, damageInfo); if (!self.alive && graceComponent) { if (aliveBeforeHit && self.globalDeathEventChanceCoefficient > 0f && self.body && self.body.master) { graceComponent.TriggerEffects(attackerCB); } } else if (!damageInfo.rejected && self.alive) { if (banditAttacker) { if (resetCooldownsOnKill) { if (isBarrage) { self.body.AddTimedBuff(ModContentPack.skullBuff, 3f); } self.body.AddTimedBuff(ModContentPack.lightsOutBuff, resetDuration); if (graceComponent && resetDuration > 0f) { graceComponent.AddTimer(attackerCB, damageInfo.damageType, resetDuration); } } } if (self.body.HasBuff(ModContentPack.lightsOutBuff) && specialExecuteThreshold > 0f) { if (((self.body.bodyFlags & CharacterBody.BodyFlags.ImmuneToExecutes) == 0 && !self.body.isChampion) || specialExecuteBosses) { float executeThreshold = specialExecuteThreshold; float executeToAdd = 0f; if (self.body.isElite) { executeToAdd = damageInfo.inflictor.GetComponent <CharacterBody>().executeEliteHealthFraction; } if (self.isInFrozenState && executeToAdd < 0.3f) { executeToAdd = 0.3f; } executeThreshold += executeToAdd; if (self.alive && (self.combinedHealthFraction < executeThreshold)) { damageInfo.damage = self.combinedHealth / 2f + 1f; damageInfo.damageType = (DamageType.ResetCooldownsOnKill | DamageType.BypassArmor); damageInfo.procCoefficient = 0f; damageInfo.crit = true; damageInfo.damageColorIndex = DamageColorIndex.WeakPoint; orig(self, damageInfo); } } } } }; }
private void CreateLightningSword(Int32 meshInd) { GameObject ghost = this.CreateLightningSwordGhost(meshInd); GameObject proj = Resources.Load <GameObject>("Prefabs/Projectiles/LunarNeedleProjectile").InstantiateClone("LightningSwordProjectile" + meshInd.ToString()); ProjectileCatalog.getAdditionalEntries += (list) => list.Add(proj); AltArtiPassive.lightningProjectile[meshInd] = proj; ProjectileController projController = proj.GetComponent <ProjectileController>(); projController.ghostPrefab = ghost; projController.procCoefficient = 0.2f; ProjectileSimple projSimple = proj.GetComponent <ProjectileSimple>(); projSimple.enabled = true; projSimple.enableVelocityOverLifetime = false; projSimple.velocity = 60f; ProjectileDirectionalTargetFinder projTargetFind = proj.GetComponent <ProjectileDirectionalTargetFinder>(); projTargetFind.enabled = false; ProjectileSteerTowardTarget projSteering = proj.GetComponent <ProjectileSteerTowardTarget>(); projSteering.enabled = true; projSteering.rotationSpeed = 140f; ProjectileStickOnImpact projStick = proj.GetComponent <ProjectileStickOnImpact>(); //projStick.ignoreCharacters = false; //projStick.ignoreWorld = false; projStick.alignNormals = false; ProjectileImpactExplosion projExpl = proj.GetComponent <ProjectileImpactExplosion>(); projExpl.impactEffect = Resources.Load <GameObject>("Prefabs/Effects/LightningStakeNova"); projExpl.explosionSoundString = "Play_item_lunar_primaryReplace_impact"; projExpl.lifetimeExpiredSoundString = ""; projExpl.offsetForLifetimeExpiredSound = 0f; projExpl.destroyOnEnemy = false; projExpl.destroyOnWorld = false; projExpl.timerAfterImpact = true; projExpl.falloffModel = BlastAttack.FalloffModel.None; projExpl.lifetime = 10f; projExpl.lifetimeAfterImpact = 1f; projExpl.lifetimeRandomOffset = 0f; projExpl.blastRadius = 1f; projExpl.blastDamageCoefficient = 1f; projExpl.blastProcCoefficient = 0.2f; projExpl.bonusBlastForce = Vector3.zero; projExpl.fireChildren = false; projExpl.childrenProjectilePrefab = null; projExpl.childrenCount = 0; projExpl.childrenDamageCoefficient = 0f; projExpl.minAngleOffset = Vector3.zero; projExpl.maxAngleOffset = Vector3.zero; projExpl.transformSpace = ProjectileImpactExplosion.TransformSpace.World; projExpl.projectileHealthComponent = null; ProjectileSingleTargetImpact projStimp = proj.GetComponent <ProjectileSingleTargetImpact>(); projStimp.destroyOnWorld = false; projStimp.hitSoundString = "Play_item_proc_dagger_impact"; projStimp.enemyHitSoundString = "Play_item_proc_dagger_impact"; proj.AddComponent <Components.SoundOnAwake>().sound = "Play_item_proc_dagger_spawn"; //UnityEngine.Object.DestroyImmediate( proj.GetComponent<ProjectileSingleTargetImpact>() ); UnityEngine.Object.Destroy(proj.GetComponent <AwakeEvent>()); UnityEngine.Object.Destroy(proj.GetComponent <DelayedEvent>()); }
public static void UpdateYokoExplosionCluster(bool isCluster) { ProjectileImpactExplosion impactExplosion = explosiveRifleRoundPrefab.GetComponent <ProjectileImpactExplosion>(); impactExplosion.fireChildren = isCluster; }