Skip to content

Commit

Permalink
New alt secondary for Cyborg.
Browse files Browse the repository at this point in the history
  • Loading branch information
Moffein committed Jan 5, 2023
1 parent 1e6b36c commit 50707b8
Show file tree
Hide file tree
Showing 12 changed files with 319 additions and 20 deletions.
57 changes: 57 additions & 0 deletions Starstorm 2/Components/Projectiles/ShootableProjectileComponent.cs
Original file line number Diff line number Diff line change
@@ -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<TeamComponent>();
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<ShootableProjectileComponent>();
if (sp)
{
if (damageInfo.HasModdedDamageType(sp.targetDamageType))
{
sp.OnShootActionsInternal(damageInfo);
}
else
{
damageInfo.rejected = true;
}
}
}
orig(self, damageInfo);
}
}
}
2 changes: 2 additions & 0 deletions Starstorm 2/Cores/DamageTypeCore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -29,6 +30,7 @@ public DamageTypeCore()
{
instance = this;

ModdedDamageTypes.CyborgPrimary = DamageAPI.ReserveDamageType();
ModdedDamageTypes.ScaleForceToMass = DamageAPI.ReserveDamageType();
ModdedDamageTypes.GougeOnHit = DamageAPI.ReserveDamageType();
ModdedDamageTypes.ExtendFear = DamageAPI.ReserveDamageType();
Expand Down
5 changes: 4 additions & 1 deletion Starstorm 2/Starstorm2.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@
<Compile Include="Survivors\Cyborg\Components\OverheatProjectile\BFGGhostReduceSizeOverTime.cs" />
<Compile Include="Survivors\Cyborg\Components\OverheatProjectile\LightningSoundComponent.cs" />
<Compile Include="Survivors\Cyborg\Components\OverheatProjectile\OverheatReduceTickrateOverTime.cs" />
<Compile Include="Components\Projectiles\ShootableProjectileComponent.cs" />
<Compile Include="Survivors\Cyborg\Components\ShockCoreProjectile\ShootableShockCore.cs" />
<Compile Include="Survivors\Cyborg\Components\TeleportProjectile\AssignToTeleportTracker.cs" />
<Compile Include="Survivors\Cyborg\CyborgTeleSkillDef.cs" />
<Compile Include="Survivors\Cyborg\DefenseMatrixManager.cs" />
Expand All @@ -114,6 +116,7 @@
<Compile Include="Survivors\Cyborg\EntityStates\ChargeRifle\ChargeBeam.cs" />
<Compile Include="Survivors\Cyborg\EntityStates\Secondary\DefenseMatrix.cs" />
<Compile Include="Survivors\Cyborg\EntityStates\ChargeRifle\FireBeam.cs" />
<Compile Include="Survivors\Cyborg\EntityStates\Secondary\ShockCore.cs" />
<Compile Include="Survivors\Cyborg\EntityStates\Teleporter\DeployTeleporter.cs" />
<Compile Include="Survivors\Cyborg\EntityStates\Teleporter\UseTeleporter.cs" />
<Compile Include="Survivors\Executioner\Components\ExecutionerController.cs" />
Expand Down Expand Up @@ -177,7 +180,7 @@
<Compile Include="Survivors\Chirr\EntityStates\ChirrMain.cs" />
<Compile Include="Survivors\Chirr\EntityStates\ChirrHeal.cs" />
<Compile Include="Survivors\Cyborg\EntityStates\CyborgMain.cs" />
<Compile Include="Survivors\Cyborg\EntityStates\Secondary.cs" />
<Compile Include="Survivors\Cyborg\EntityStates\Secondary\FireTrackShot.cs" />
<Compile Include="Survivors\Cyborg\EntityStates\CyborgFireOverheat.cs" />
<Compile Include="Modules\EntityStates\Emotes\BaseEmote.cs" />
<Compile Include="Modules\EntityStates\Emotes\RestEmote.cs" />
Expand Down
7 changes: 5 additions & 2 deletions Starstorm 2/StarstormPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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<ProjectileDamage>();
if (pd)
{
pd.damage *= 4f;
}

DamageAPI.ModdedDamageTypeHolderComponent mdc = base.gameObject.GetComponent<DamageAPI.ModdedDamageTypeHolderComponent>();
if (!mdc) mdc = base.gameObject.AddComponent<DamageAPI.ModdedDamageTypeHolderComponent>();
mdc.Add(this.targetDamageType);

ProjectileImpactExplosion pie = base.gameObject.GetComponent<ProjectileImpactExplosion>();
if (pie)
{
pie.blastRadius = 14f;
pie.falloffModel = BlastAttack.FalloffModel.None;
pie.explosionEffect = ShootableShockCore.explosionEffectPrefab;

//Why doesn't BanditDynamite need to call this?
pie.Detonate();
}
}
}
}
138 changes: 134 additions & 4 deletions Starstorm 2/Survivors/Cyborg/CyborgCore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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<GameObject>("RoR2/Junk/Mage/MageLightningBombExplosion.prefab").WaitForCompletion().InstantiateClone("SS2UShockCoreImplosionEffect", false);
EffectComponent ec2 = ShootableShockCore.explosionEffectPrefab.GetComponent<EffectComponent>();
ec2.soundName = "Play_mage_m2_impact";
Modules.Assets.effectDefs.Add(new EffectDef(ShootableShockCore.explosionEffectPrefab));
}

private GameObject CreateShockCoreProjectile()
{
GameObject projectilePrefab = Addressables.LoadAssetAsync<GameObject>("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<GameObject>("RoR2/Base/Mage/MageLightningboltGhost.prefab").WaitForCompletion().InstantiateClone("SS2UCyborgShockCoreGhost", false);
ghostPrefab.transform.localScale = 2f * Vector3.one; //vector3.one

ProjectileController pc = projectilePrefab.GetComponent<ProjectileController>();
pc.ghostPrefab = ghostPrefab;

ProjectileSimple ps = projectilePrefab.GetComponent<ProjectileSimple>();
ps.desiredForwardSpeed = 80;//lightning bomb 40, lightning bolt 80
ps.lifetime = 10f;

ProjectileDamage pd = projectilePrefab.GetComponent<ProjectileDamage>();
pd.damageType = DamageType.Shock5s;

ProjectileImpactExplosion pie = projectilePrefab.GetComponent<ProjectileImpactExplosion>();
pie.blastRadius = 4f;

TeamComponent tc = projectilePrefab.AddComponent<TeamComponent>();
tc.hideAllyCardDisplay = true;

projectilePrefab.AddComponent<SkillLocator>();
CharacterBody cb = projectilePrefab.AddComponent<CharacterBody>();
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<HealthComponent>();
hc.globalDeathEventChanceCoefficient = 0f;
hc.body = cb;

ShootableShockCore sp = projectilePrefab.AddComponent<ShootableShockCore>();
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<SphereCollider>();
goCollider.radius = 1f;

HurtBoxGroup goHurtBoxGroup = hbObject.AddComponent<HurtBoxGroup>();
HurtBox goHurtBox = hbObject.AddComponent<HurtBox>();
goHurtBox.isBullseye = false;
goHurtBox.healthComponent = go.GetComponent<HealthComponent>();
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<DisableCollisionsBetweenColliders>();
dc.collidersA = go.GetComponentsInChildren<Collider>();
dc.collidersB = hbObject.GetComponents<Collider>();
}

private GameObject CreateOverheatProjectile(string name, GameObject ghostPrefab, int bounceCount, float pullStrength)
Expand Down Expand Up @@ -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 <style=cIsUtility>neutralizes ranged attacks</style>. Reduce skill cooldowns by <style=cIsUtility>0.5s</style> for every <style=cIsUtility>projectile</style> deleted.");
LanguageAPI.Add("CYBORG_SECONDARY_DEFENSEMATRIX_DESCRIPTION", "Project an energy field that <style=cIsUtility>neutralizes ranged attacks</style>. Reduce skill cooldowns by <style=cIsUtility>1s</style> for every <style=cIsUtility>projectile</style> deleted.");
SkillDef defenseMatrixDef = ScriptableObject.CreateInstance<SkillDef>();
defenseMatrixDef.activationState = new SerializableEntityStateType(typeof(DefenseMatrix));
defenseMatrixDef.activationStateMachineName = "DefenseMatrix";
Expand All @@ -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", "<style=cIsDamage>Shocking</style>. Fire an energy core for <style=cIsDamage>300% damage</style>. Shoot the core to detonate it for <style=cIsDamage>1200% damage</style>.");
CyborgCore.defenseMatrixDef = defenseMatrixDef;
SkillDef shockCoreDef = ScriptableObject.CreateInstance<SkillDef>();
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<Sprite>("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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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,
Expand All @@ -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();
}
Expand Down
Loading

0 comments on commit 50707b8

Please sign in to comment.