From 50707b8a3120d7f0f3e940fc135f7f0a9c3d5b50 Mon Sep 17 00:00:00 2001 From: Moffein <22742925+Moffein@users.noreply.github.com> Date: Thu, 5 Jan 2023 01:40:05 -0800 Subject: [PATCH] New alt secondary for Cyborg. --- .../ShootableProjectileComponent.cs | 57 ++++++++ Starstorm 2/Cores/DamageTypeCore.cs | 2 + Starstorm 2/Starstorm2.csproj | 5 +- Starstorm 2/StarstormPlugin.cs | 7 +- .../ShockCoreProjectile/ShootableShockCore.cs | 44 ++++++ Starstorm 2/Survivors/Cyborg/CyborgCore.cs | 138 +++++++++++++++++- .../EntityStates/ChargeRifle/FireBeam.cs | 5 +- .../Cyborg/EntityStates/Jetpack/FlightMode.cs | 7 +- .../Cyborg/EntityStates/PrimaryLaser.cs | 10 +- .../EntityStates/Secondary/DefenseMatrix.cs | 2 +- .../FireTrackShot.cs} | 13 +- .../EntityStates/Secondary/ShockCore.cs | 49 +++++++ 12 files changed, 319 insertions(+), 20 deletions(-) create mode 100644 Starstorm 2/Components/Projectiles/ShootableProjectileComponent.cs create mode 100644 Starstorm 2/Survivors/Cyborg/Components/ShockCoreProjectile/ShootableShockCore.cs rename Starstorm 2/Survivors/Cyborg/EntityStates/{Secondary.cs => Secondary/FireTrackShot.cs} (93%) create mode 100644 Starstorm 2/Survivors/Cyborg/EntityStates/Secondary/ShockCore.cs diff --git a/Starstorm 2/Components/Projectiles/ShootableProjectileComponent.cs b/Starstorm 2/Components/Projectiles/ShootableProjectileComponent.cs new file mode 100644 index 00000000..8b3e5ca6 --- /dev/null +++ b/Starstorm 2/Components/Projectiles/ShootableProjectileComponent.cs @@ -0,0 +1,57 @@ +using R2API; +using RoR2; +using RoR2.Projectile; +using UnityEngine; +using UnityEngine.Networking; + +namespace Starstorm2.Components.Projectiles +{ + public class ShootableProjectileComponent : MonoBehaviour + { + public DamageAPI.ModdedDamageType targetDamageType; //DamageType that detonates the projectile + private bool hasFired = false; + + private void OnShootActionsInternal(DamageInfo damageInfo) + { + if (hasFired) return; + hasFired = true; + OnShootActions(damageInfo); + } + + public virtual void OnShootActions(DamageInfo damageInfo) { } + + private void Start() + { + if (NetworkServer.active) + { + TeamComponent teamComponent = base.GetComponent(); + if (teamComponent) teamComponent.teamIndex = TeamIndex.None; + } + } + + internal static void AddHooks() + { + On.RoR2.HealthComponent.TakeDamage += ShootableProjectileHook; + } + + private static void ShootableProjectileHook(On.RoR2.HealthComponent.orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo) + { + if (NetworkServer.active) + { + ShootableProjectileComponent sp = self.GetComponent(); + if (sp) + { + if (damageInfo.HasModdedDamageType(sp.targetDamageType)) + { + sp.OnShootActionsInternal(damageInfo); + } + else + { + damageInfo.rejected = true; + } + } + } + orig(self, damageInfo); + } + } +} diff --git a/Starstorm 2/Cores/DamageTypeCore.cs b/Starstorm 2/Cores/DamageTypeCore.cs index 4884456b..9961db2f 100644 --- a/Starstorm 2/Cores/DamageTypeCore.cs +++ b/Starstorm 2/Cores/DamageTypeCore.cs @@ -14,6 +14,7 @@ public class DamageTypeCore public static class ModdedDamageTypes { + public static DamageAPI.ModdedDamageType CyborgPrimary; //Used for Cyborg Shock Rifle combo public static DamageAPI.ModdedDamageType ScaleForceToMass; public static DamageAPI.ModdedDamageType GougeOnHit; public static DamageAPI.ModdedDamageType ExtendFear; @@ -29,6 +30,7 @@ public DamageTypeCore() { instance = this; + ModdedDamageTypes.CyborgPrimary = DamageAPI.ReserveDamageType(); ModdedDamageTypes.ScaleForceToMass = DamageAPI.ReserveDamageType(); ModdedDamageTypes.GougeOnHit = DamageAPI.ReserveDamageType(); ModdedDamageTypes.ExtendFear = DamageAPI.ReserveDamageType(); diff --git a/Starstorm 2/Starstorm2.csproj b/Starstorm 2/Starstorm2.csproj index 716a63df..1ce7d891 100644 --- a/Starstorm 2/Starstorm2.csproj +++ b/Starstorm 2/Starstorm2.csproj @@ -105,6 +105,8 @@ + + @@ -114,6 +116,7 @@ + @@ -177,7 +180,7 @@ - + diff --git a/Starstorm 2/StarstormPlugin.cs b/Starstorm 2/StarstormPlugin.cs index bb571daa..7dacddd3 100644 --- a/Starstorm 2/StarstormPlugin.cs +++ b/Starstorm 2/StarstormPlugin.cs @@ -2,6 +2,7 @@ using BepInEx.Configuration; using R2API.Utils; using RoR2; +using Starstorm2.Components.Projectiles; using Starstorm2.Cores; using Starstorm2.Cores.Equipment; using Starstorm2.Cores.Items; @@ -47,7 +48,7 @@ public class StarstormPlugin : BaseUnityPlugin { internal const string guid = "com.ChirrLover.Starstorm2Unofficial"; internal const string modName = "Starstorm 2 Unofficial"; - internal const string version = "0.7.1"; + internal const string version = "0.7.2"; public static StarstormPlugin instance; @@ -110,8 +111,10 @@ public void Awake() CommandHelper.AddToConsoleWhenReady(); new Modules.ContentPacks().Initialize(); - } + //Figure out where to place this later. + ShootableProjectileComponent.AddHooks(); + } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void SetArena(Stage obj) diff --git a/Starstorm 2/Survivors/Cyborg/Components/ShockCoreProjectile/ShootableShockCore.cs b/Starstorm 2/Survivors/Cyborg/Components/ShockCoreProjectile/ShootableShockCore.cs new file mode 100644 index 00000000..14d7aff6 --- /dev/null +++ b/Starstorm 2/Survivors/Cyborg/Components/ShockCoreProjectile/ShootableShockCore.cs @@ -0,0 +1,44 @@ +using R2API; +using RoR2; +using RoR2.Projectile; +using Starstorm2.Components.Projectiles; +using UnityEngine; +using UnityEngine.AddressableAssets; + +namespace Starstorm2.Survivors.Cyborg.Components.ShockCoreProjectile +{ + public class ShootableShockCore : ShootableProjectileComponent + { + public static GameObject explosionEffectPrefab; + + public override void OnShootActions(DamageInfo damageInfo) + { + base.OnShootActions(damageInfo); + + damageInfo.crit = true; + damageInfo.procCoefficient = 0f; + damageInfo.force = Vector3.zero; + + ProjectileDamage pd = base.gameObject.GetComponent(); + if (pd) + { + pd.damage *= 4f; + } + + DamageAPI.ModdedDamageTypeHolderComponent mdc = base.gameObject.GetComponent(); + if (!mdc) mdc = base.gameObject.AddComponent(); + mdc.Add(this.targetDamageType); + + ProjectileImpactExplosion pie = base.gameObject.GetComponent(); + if (pie) + { + pie.blastRadius = 14f; + pie.falloffModel = BlastAttack.FalloffModel.None; + pie.explosionEffect = ShootableShockCore.explosionEffectPrefab; + + //Why doesn't BanditDynamite need to call this? + pie.Detonate(); + } + } + } +} diff --git a/Starstorm 2/Survivors/Cyborg/CyborgCore.cs b/Starstorm 2/Survivors/Cyborg/CyborgCore.cs index 6ece04ba..e8695183 100644 --- a/Starstorm 2/Survivors/Cyborg/CyborgCore.cs +++ b/Starstorm 2/Survivors/Cyborg/CyborgCore.cs @@ -21,6 +21,8 @@ using Starstorm2.Survivors.Cyborg.Components.Crosshair; using EntityStates.SS2UStates.Cyborg.ChargeRifle; using EntityStates.SS2UStates.Cyborg.Jetpack; +using Starstorm2.Components.Projectiles; +using Starstorm2.Survivors.Cyborg.Components.ShockCoreProjectile; namespace Starstorm2.Survivors.Cyborg { @@ -147,7 +149,9 @@ private void RegisterStates() Modules.States.AddState(typeof(ChargeBeam)); Modules.States.AddState(typeof(FireBeam)); + Modules.States.AddState(typeof(DefenseMatrix)); + Modules.States.AddState(typeof(ShockCore)); } private void RegisterProjectiles() @@ -214,6 +218,107 @@ private void RegisterProjectiles() ec.soundName = "Play_mage_R_lightningBlast"; Modules.Assets.effectDefs.Add(new EffectDef(telefragExplosionEffect)); UseTeleporter.explosionEffectPrefab = telefragExplosionEffect; + + ShockCore.projectilePrefab = CreateShockCoreProjectile(); + ShootableShockCore.explosionEffectPrefab = Addressables.LoadAssetAsync("RoR2/Junk/Mage/MageLightningBombExplosion.prefab").WaitForCompletion().InstantiateClone("SS2UShockCoreImplosionEffect", false); + EffectComponent ec2 = ShootableShockCore.explosionEffectPrefab.GetComponent(); + ec2.soundName = "Play_mage_m2_impact"; + Modules.Assets.effectDefs.Add(new EffectDef(ShootableShockCore.explosionEffectPrefab)); + } + + private GameObject CreateShockCoreProjectile() + { + GameObject projectilePrefab = Addressables.LoadAssetAsync("RoR2/Base/Mage/MageLightningboltBasic.prefab").WaitForCompletion().InstantiateClone("SS2UCyborgShockCoreProjectile", true); + //projectilePrefab.transform.localScale = 2f * Vector3.one; //0.1, 0.1, 1.0 + + GameObject ghostPrefab = Addressables.LoadAssetAsync("RoR2/Base/Mage/MageLightningboltGhost.prefab").WaitForCompletion().InstantiateClone("SS2UCyborgShockCoreGhost", false); + ghostPrefab.transform.localScale = 2f * Vector3.one; //vector3.one + + ProjectileController pc = projectilePrefab.GetComponent(); + pc.ghostPrefab = ghostPrefab; + + ProjectileSimple ps = projectilePrefab.GetComponent(); + ps.desiredForwardSpeed = 80;//lightning bomb 40, lightning bolt 80 + ps.lifetime = 10f; + + ProjectileDamage pd = projectilePrefab.GetComponent(); + pd.damageType = DamageType.Shock5s; + + ProjectileImpactExplosion pie = projectilePrefab.GetComponent(); + pie.blastRadius = 4f; + + TeamComponent tc = projectilePrefab.AddComponent(); + tc.hideAllyCardDisplay = true; + + projectilePrefab.AddComponent(); + CharacterBody cb = projectilePrefab.AddComponent(); + cb.rootMotionInMainState = false; + cb.bodyFlags = CharacterBody.BodyFlags.Masterless; + cb.baseMaxHealth = 1f; + cb.baseCrit = 0f; + cb.baseAcceleration = 0f; + cb.baseArmor = 0f; + cb.baseAttackSpeed = 0f; + cb.baseDamage = 0f; + cb.baseJumpCount = 0; + cb.baseJumpPower = 0f; + cb.baseMoveSpeed = 0f; + cb.baseMaxShield = 0f; + cb.baseRegen = 0f; + cb.autoCalculateLevelStats = true; + cb.levelArmor = 0f; + cb.levelAttackSpeed = 0f; + cb.levelCrit = 0f; + cb.levelDamage = 0f; + cb.levelJumpPower = 0f; + cb.levelMaxHealth = 0f; + cb.levelMaxShield = 0f; + cb.levelMoveSpeed = 0f; + cb.levelRegen = 0f; + cb.hullClassification = HullClassification.Human; + + HealthComponent hc = projectilePrefab.AddComponent(); + hc.globalDeathEventChanceCoefficient = 0f; + hc.body = cb; + + ShootableShockCore sp = projectilePrefab.AddComponent(); + sp.targetDamageType = DamageTypeCore.ModdedDamageTypes.CyborgPrimary; + + AddShockCoreHurtbox(projectilePrefab); + + Modules.Prefabs.projectilePrefabs.Add(projectilePrefab); + return projectilePrefab; + } + private void AddShockCoreHurtbox(GameObject go) + { + GameObject hbObject = new GameObject(); + hbObject.transform.parent = go.transform; + //GameObject hbObject = go; + + hbObject.layer = LayerIndex.entityPrecise.intVal; + SphereCollider goCollider = hbObject.AddComponent(); + goCollider.radius = 1f; + + HurtBoxGroup goHurtBoxGroup = hbObject.AddComponent(); + HurtBox goHurtBox = hbObject.AddComponent(); + goHurtBox.isBullseye = false; + goHurtBox.healthComponent = go.GetComponent(); + goHurtBox.damageModifier = HurtBox.DamageModifier.Normal; + goHurtBox.hurtBoxGroup = goHurtBoxGroup; + goHurtBox.indexInGroup = 0; + + HurtBox[] goHurtBoxArray = new HurtBox[] + { + goHurtBox + }; + + goHurtBoxGroup.bullseyeCount = 0; + goHurtBoxGroup.hurtBoxes = goHurtBoxArray; + goHurtBoxGroup.mainHurtBox = goHurtBox; + + DisableCollisionsBetweenColliders dc = go.AddComponent(); + dc.collidersA = go.GetComponentsInChildren(); + dc.collidersB = hbObject.GetComponents(); } private GameObject CreateOverheatProjectile(string name, GameObject ghostPrefab, int bounceCount, float pullStrength) @@ -366,7 +471,7 @@ private void SetUpPrimaries(SkillLocator skillLocator) private void SetUpSecondaries(SkillLocator skillLocator) { LanguageAPI.Add("CYBORG_SECONDARY_DEFENSEMATRIX_NAME", "Defense Matrix"); - LanguageAPI.Add("CYBORG_SECONDARY_DEFENSEMATRIX_DESCRIPTION", "Project an energy field that neutralizes ranged attacks. Reduce skill cooldowns by 0.5s for every projectile deleted."); + LanguageAPI.Add("CYBORG_SECONDARY_DEFENSEMATRIX_DESCRIPTION", "Project an energy field that neutralizes ranged attacks. Reduce skill cooldowns by 1s for every projectile deleted."); SkillDef defenseMatrixDef = ScriptableObject.CreateInstance(); defenseMatrixDef.activationState = new SerializableEntityStateType(typeof(DefenseMatrix)); defenseMatrixDef.activationStateMachineName = "DefenseMatrix"; @@ -389,11 +494,36 @@ private void SetUpSecondaries(SkillLocator skillLocator) defenseMatrixDef.keywordTokens = new string[] {}; Modules.Skills.FixSkillName(defenseMatrixDef); Utils.RegisterSkillDef(defenseMatrixDef); - SkillFamily.Variant secondaryVariant2 = Utils.RegisterSkillVariant(defenseMatrixDef); - - skillLocator.secondary = Utils.RegisterSkillsToFamily(cybPrefab, new SkillFamily.Variant[] { secondaryVariant2 }); + SkillFamily.Variant secondaryVariant1 = Utils.RegisterSkillVariant(defenseMatrixDef); + LanguageAPI.Add("CYBORG_SECONDARY_SHOCKCORE_NAME", "Shock Core"); + LanguageAPI.Add("CYBORG_SECONDARY_SHOCKCORE_DESCRIPTION", "Shocking. Fire an energy core for 300% damage. Shoot the core to detonate it for 1200% damage."); CyborgCore.defenseMatrixDef = defenseMatrixDef; + SkillDef shockCoreDef = ScriptableObject.CreateInstance(); + shockCoreDef.activationState = new SerializableEntityStateType(typeof(ShockCore)); + shockCoreDef.activationStateMachineName = "Weapon"; + shockCoreDef.skillName = "CYBORG_SECONDARY_SHOCKCORE_NAME"; + shockCoreDef.skillNameToken = "CYBORG_SECONDARY_SHOCKCORE_NAME"; + shockCoreDef.skillDescriptionToken = "CYBORG_SECONDARY_SHOCKCORE_DESCRIPTION"; + shockCoreDef.icon = Modules.Assets.mainAssetBundle.LoadAsset("cyborgsecondary"); + shockCoreDef.baseMaxStock = 1; + shockCoreDef.baseRechargeInterval = 6f; + shockCoreDef.beginSkillCooldownOnSkillEnd = false; + shockCoreDef.canceledFromSprinting = false; + shockCoreDef.fullRestockOnAssign = true; + shockCoreDef.interruptPriority = EntityStates.InterruptPriority.Skill; + shockCoreDef.isCombatSkill = true; + shockCoreDef.mustKeyPress = true; + shockCoreDef.cancelSprintingOnActivation = true; + shockCoreDef.rechargeStock = 1; + shockCoreDef.requiredStock = 1; + shockCoreDef.stockToConsume = 1; + shockCoreDef.keywordTokens = new string[] { "KEYWORD_SHOCKING" }; + Modules.Skills.FixSkillName(shockCoreDef); + Utils.RegisterSkillDef(shockCoreDef); + SkillFamily.Variant secondaryVariant2 = Utils.RegisterSkillVariant(shockCoreDef); + + skillLocator.secondary = Utils.RegisterSkillsToFamily(cybPrefab, new SkillFamily.Variant[] { secondaryVariant1, secondaryVariant2 }); } private void SetUpUtilities(SkillLocator skillLocator) diff --git a/Starstorm 2/Survivors/Cyborg/EntityStates/ChargeRifle/FireBeam.cs b/Starstorm 2/Survivors/Cyborg/EntityStates/ChargeRifle/FireBeam.cs index 8673fe0d..1a62a362 100644 --- a/Starstorm 2/Survivors/Cyborg/EntityStates/ChargeRifle/FireBeam.cs +++ b/Starstorm 2/Survivors/Cyborg/EntityStates/ChargeRifle/FireBeam.cs @@ -4,6 +4,8 @@ using UnityEngine.AddressableAssets; using Starstorm2.Survivors.Cyborg.Components; using RoR2.Skills; +using R2API; +using Starstorm2.Cores; namespace EntityStates.SS2UStates.Cyborg.ChargeRifle { @@ -86,7 +88,7 @@ public override void OnEnter() aimVector = r.direction, origin = r.origin, damage = dmg, - damageType = DamageType.Generic, + damageType = DamageType.SlowOnHit, damageColorIndex = DamageColorIndex.Default, minSpread = 0f, maxSpread = 0f, @@ -104,6 +106,7 @@ public override void OnEnter() hitEffectPrefab = FireBeam.hitEffectPrefab, maxDistance = 1000f }; + bullet.AddModdedDamageType(DamageTypeCore.ModdedDamageTypes.CyborgPrimary); if (perfectCharge || charge >= 1f) bullet.stopperMask = LayerIndex.world.mask; bullet.Fire(); } diff --git a/Starstorm 2/Survivors/Cyborg/EntityStates/Jetpack/FlightMode.cs b/Starstorm 2/Survivors/Cyborg/EntityStates/Jetpack/FlightMode.cs index 53fe3fec..3668ca43 100644 --- a/Starstorm 2/Survivors/Cyborg/EntityStates/Jetpack/FlightMode.cs +++ b/Starstorm 2/Survivors/Cyborg/EntityStates/Jetpack/FlightMode.cs @@ -22,6 +22,7 @@ public class FlightMode : BaseState private BaseState.HitStopCachedState hitStopCachedState; private Vector3 storedVelocity; private Animator animator; + private float speedDamageFactor; private float stopwatch; private float baseSpeed; @@ -43,6 +44,8 @@ public override void OnEnter() desiredSpeed = this.moveSpeedStat * FlightMode.speedMultCoefficient; Util.PlaySound("Play_MULT_shift_start", base.gameObject); + speedDamageFactor = Mathf.Max(desiredSpeed / (7f * 1.45f * FlightMode.speedMultCoefficient), 1f); + if (base.isAuthority) { InitOverlapAttack(); @@ -60,14 +63,12 @@ private void InitOverlapAttack() if (hitBoxGroup) { - float speedFactor = Mathf.Max(desiredSpeed / (7f * 1.45f * FlightMode.speedMultCoefficient), 1f); - this.attack = new OverlapAttack { attacker = base.gameObject, attackerFiltering = AttackerFiltering.NeverHitSelf, pushAwayForce = 0f, - damage = this.damageStat * FlightMode.damageCoefficient * speedFactor, + damage = this.damageStat * FlightMode.damageCoefficient * speedDamageFactor, damageColorIndex = DamageColorIndex.Default, damageType = DamageType.Stun1s, forceVector = Vector3.zero, diff --git a/Starstorm 2/Survivors/Cyborg/EntityStates/PrimaryLaser.cs b/Starstorm 2/Survivors/Cyborg/EntityStates/PrimaryLaser.cs index f932a016..9d0d73d5 100644 --- a/Starstorm 2/Survivors/Cyborg/EntityStates/PrimaryLaser.cs +++ b/Starstorm 2/Survivors/Cyborg/EntityStates/PrimaryLaser.cs @@ -1,5 +1,7 @@ -using RoR2; +using R2API; +using RoR2; using RoR2.Skills; +using Starstorm2.Cores; using UnityEngine; using UnityEngine.AddressableAssets; @@ -44,7 +46,7 @@ private void FireLaser() if (base.isAuthority) { - new BulletAttack + BulletAttack bullet = new BulletAttack { owner = base.gameObject, weapon = base.gameObject, @@ -63,7 +65,9 @@ private void FireLaser() falloffModel = BulletAttack.FalloffModel.None, damageType = DamageType.SlowOnHit, maxDistance = 1000f - }.Fire(); + }; + bullet.AddModdedDamageType(DamageTypeCore.ModdedDamageTypes.CyborgPrimary); + bullet.Fire(); base.AddRecoil(-0.5f * recoil, -0.8f * recoil, -0.3f * recoil, 0.3f * recoil); } if (base.characterBody) diff --git a/Starstorm 2/Survivors/Cyborg/EntityStates/Secondary/DefenseMatrix.cs b/Starstorm 2/Survivors/Cyborg/EntityStates/Secondary/DefenseMatrix.cs index 17e9ec84..c6e52e2b 100644 --- a/Starstorm 2/Survivors/Cyborg/EntityStates/Secondary/DefenseMatrix.cs +++ b/Starstorm 2/Survivors/Cyborg/EntityStates/Secondary/DefenseMatrix.cs @@ -30,7 +30,7 @@ public class DefenseMatrix : BaseState public static GameObject projectileDeletionEffectPrefab; public static GameObject matrixPrefab; public static float ticksPerSecond = 30; - public static float cdrPerProjectile = 0.5f; + public static float cdrPerProjectile = 1f; public static float blinkTime = 0.5f; public static float blinkFrequency = 20f; diff --git a/Starstorm 2/Survivors/Cyborg/EntityStates/Secondary.cs b/Starstorm 2/Survivors/Cyborg/EntityStates/Secondary/FireTrackShot.cs similarity index 93% rename from Starstorm 2/Survivors/Cyborg/EntityStates/Secondary.cs rename to Starstorm 2/Survivors/Cyborg/EntityStates/Secondary/FireTrackShot.cs index b2feb73b..d3e234ec 100644 --- a/Starstorm 2/Survivors/Cyborg/EntityStates/Secondary.cs +++ b/Starstorm 2/Survivors/Cyborg/EntityStates/Secondary/FireTrackShot.cs @@ -14,7 +14,7 @@ using UnityEngine.Networking; using KinematicCharacterController; -namespace EntityStates.SS2UStates.Cyborg +namespace EntityStates.SS2UStates.Cyborg.Secondary { public class CyborgFireTrackshot : BaseSkillState { @@ -30,6 +30,7 @@ public class CyborgFireTrackshot : BaseSkillState private bool firstShot = false; private bool secondShot = false; private bool thirdShot = false; + private bool isCrit = false; private Animator animator; private string muzzleString; private BullseyeSearch search = new BullseyeSearch(); @@ -44,6 +45,7 @@ public override void OnEnter() this.animator = base.GetModelAnimator(); this.muzzleString = "Lowerarm.L_end"; + isCrit = base.RollCrit(); base.PlayAnimation("Gesture, Override", "FireM2", "FireArrow.playbackRate", this.duration); } @@ -84,7 +86,7 @@ private void FireTrackshot() Util.PlaySound(soundString, base.gameObject); if (base.isAuthority) { - new BulletAttack + BulletAttack bullet = new BulletAttack { owner = base.gameObject, weapon = base.gameObject, @@ -96,10 +98,11 @@ private void FireTrackshot() force = 100, tracerEffectPrefab = CyborgFireTrackshot.tracerEffectPrefab, muzzleName = muzzleString, - hitEffectPrefab = (Util.CheckRoll(this.critStat, base.characterBody.master)) ? critEffectPrefab : effectPrefab, - isCrit = Util.CheckRoll(this.critStat, base.characterBody.master), + hitEffectPrefab = isCrit ? critEffectPrefab : effectPrefab, + isCrit = isCrit, damageType = DamageType.Stun1s - }.Fire(); + }; + bullet.Fire(); //ProjectileManager.instance.FireProjectile(ExampleSurvivor.ExampleSurvivor.bfgProjectile, aimRay.origin, Util.QuaternionSafeLookRotation(aimRay.direction), base.gameObject, this.damageCoefficient * this.damageStat, 0f, Util.CheckRoll(this.critStat, base.characterBody.master), DamageColorIndex.Default, null, -1f); } } diff --git a/Starstorm 2/Survivors/Cyborg/EntityStates/Secondary/ShockCore.cs b/Starstorm 2/Survivors/Cyborg/EntityStates/Secondary/ShockCore.cs new file mode 100644 index 00000000..b5a673b4 --- /dev/null +++ b/Starstorm 2/Survivors/Cyborg/EntityStates/Secondary/ShockCore.cs @@ -0,0 +1,49 @@ +using RoR2; +using UnityEngine; +using RoR2.Projectile; +using UnityEngine.AddressableAssets; + +namespace EntityStates.SS2UStates.Cyborg.Secondary +{ + public class ShockCore : BaseState + { + public override void OnEnter() + { + base.OnEnter(); + this.duration = ShockCore.baseDuration / this.attackSpeedStat; + + Ray aimRay = base.GetAimRay(); + base.StartAimMode(aimRay, 2f, false); + base.PlayAnimation("Gesture, Override", "FireM2", "FireArrow.playbackRate", this.duration); + Util.PlaySound("Play_voidman_m2_shoot_fullCharge", base.gameObject); + EffectManager.SimpleMuzzleFlash(muzzleflashEffectPrefab, base.gameObject, "Lowerarm.L_end", false); + + if (base.isAuthority) + { + ProjectileManager.instance.FireProjectile(ShockCore.projectilePrefab, aimRay.origin, Util.QuaternionSafeLookRotation(aimRay.direction), base.gameObject, this.damageStat * ShockCore.damageCoefficient, 0f, base.RollCrit(), DamageColorIndex.Default, null, -1f); + } + } + + public override void FixedUpdate() + { + base.FixedUpdate(); + if (base.fixedAge >= this.duration && base.isAuthority) + { + this.outer.SetNextStateToMain(); + return; + } + } + + public override InterruptPriority GetMinimumInterruptPriority() + { + return InterruptPriority.PrioritySkill; + } + + public static GameObject muzzleflashEffectPrefab = Addressables.LoadAssetAsync("RoR2/Base/Captain/CaptainChargeTazer.prefab").WaitForCompletion(); + public static GameObject projectilePrefab; + public static float damageCoefficient = 4f; + public static float baseDuration = 0.5f; + + private float duration; + } +}