From 4fdfc95c1bea2cf2db474f5d4a5b2b49ea532d3e Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 15:17:01 -0700 Subject: [PATCH 01/68] mimic and typhoon lang fix --- .../Languages/en/SS2Lang_Difficulties_en.json | 2 +- .../Components/MimicInventoryManager.cs | 9 +++++ .../Modules/Difficulties/Typhoon.cs | 37 +++++++++++-------- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/SS2-Project/Assets/Languages/en/SS2Lang_Difficulties_en.json b/SS2-Project/Assets/Languages/en/SS2Lang_Difficulties_en.json index dc455ddcf..78e4aae99 100644 --- a/SS2-Project/Assets/Languages/en/SS2Lang_Difficulties_en.json +++ b/SS2-Project/Assets/Languages/en/SS2Lang_Difficulties_en.json @@ -22,7 +22,7 @@ "SS2_DIFFICULTY_CYCLONE3_NAME": "Cyclone +3", "SS2_DIFFICULTY_TYPHOON_NAME": "Typhoon", - "SS2_DIFFICULTY_TYPHOON_DESC": "Maximum challenge. The world is a nightmare, and survival is merely an illusion. Nobody has what it takes.\n\n>Player Health Regeneration: -40%\n>Difficulty Scaling: +75%\n>Monster Spawn Limit: +100%\n>Monster Spawn Rate: +25%\n>Gold and Experience Rewards: -20%", + "SS2_DIFFICULTY_TYPHOON_DESC": "Maximum challenge. The world is a nightmare, and survival is merely an illusion. Nobody has what it takes.\n\n>Player Health Regeneration: -40%\n>Difficulty Scaling: +75%\n>Monster Spawn Limit: +{0}%\n>Monster Spawn Rate: +{1}%\n>Experience Rewards: -{2}%\n>Gold Rewards: -{3}%", "SS2_DIFFICULTY_SUPERTYPHOON_NAME": "Super Typhoon", "SS2_DIFFICULTY_SUPERTYPHOON_DESC": "", diff --git a/SS2-Project/Assets/Starstorm2/Components/MimicInventoryManager.cs b/SS2-Project/Assets/Starstorm2/Components/MimicInventoryManager.cs index 27bca09c4..b304c8a95 100644 --- a/SS2-Project/Assets/Starstorm2/Components/MimicInventoryManager.cs +++ b/SS2-Project/Assets/Starstorm2/Components/MimicInventoryManager.cs @@ -81,6 +81,15 @@ public void AddItem(ItemIndex ind) public void DropItems() { + // Fix for Github Issue #936 + if (!pickupPivot) + FindPivot(); + if (!pickupPivot) + { + SS2Log.Error("MimicInventoryManager.DropItems: pickupPivot is null, cannot drop items"); + return; + } + var temp = pickupPivot.position; EffectData effectData = new EffectData { diff --git a/SS2-Project/Assets/Starstorm2/Modules/Difficulties/Typhoon.cs b/SS2-Project/Assets/Starstorm2/Modules/Difficulties/Typhoon.cs index faddd8e1e..9a31459d1 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Difficulties/Typhoon.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Difficulties/Typhoon.cs @@ -13,21 +13,27 @@ public class Typhoon : SS2Difficulty { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("Typhoon", SS2Bundle.Base); + private const string token = "SS2_DIFFICULTY_TYPHOON_DESC"; + // Typhoon Config - [RiskOfOptionsConfigureField(SS2Config.ID_MAIN, configSectionOverride = "Typhoon", configNameOverride = "Increase Team Limit", configDescOverride = "Multiplies the Monster, Lunar, and Void Team maximum size by 2 (or the configured value) when enabled. May affect performance.")] + [RiskOfOptionsConfigureField(SS2Config.ID_MAIN, configSectionOverride = "Typhoon", configNameOverride = "Increase Team Limit", configDescOverride = "Multiplies the Monster, Lunar, and Void Team maximum size when enabled. May affect performance.")] internal static bool IncreaseSpawnCap = true; - [RiskOfOptionsConfigureField(SS2Config.ID_MAIN, configSectionOverride = "Typhoon", configNameOverride = "Spawn Cap Multiplier", configDescOverride = "The spawn cap multiplier to increase enemy team sizes by. Only works if you have Increase Team Limit enabled. Default is 2.")] - public static int spawnCapMultiplier = 2; + [RiskOfOptionsConfigureField(SS2Config.ID_MAIN, configSectionOverride = "Typhoon", configNameOverride = "Spawn Cap Increase Percent", configDescOverride = "Percentage to increase enemy team sizes by. Only works if you have Increase Team Limit enabled. Default is 100 (doubles team size).")] + [FormatToken(token, 0)] + public static float spawnCapIncrease = 100f; - [RiskOfOptionsConfigureField(SS2Config.ID_MAIN, configSectionOverride = "Typhoon", configNameOverride = "Credit Multiplier", configDescOverride = "The credit multipler the monster director has for spawning enemies.")] - public static float creditMultiplierVal = 1.4f; + [RiskOfOptionsConfigureField(SS2Config.ID_MAIN, configSectionOverride = "Typhoon", configNameOverride = "Credit Increase Percent", configDescOverride = "Percentage to increase monster director credits by. Default is 40.")] + [FormatToken(token, 1)] + public static float creditIncrease = 40f; - [RiskOfOptionsConfigureField(SS2Config.ID_MAIN, configSectionOverride = "Typhoon", configNameOverride = "Experience Reward Multipler", configDescOverride = "The experience reward multipler when defeating an enemy.")] - public static float expRewardCoefficientVal = 0.8f; + [RiskOfOptionsConfigureField(SS2Config.ID_MAIN, configSectionOverride = "Typhoon", configNameOverride = "Experience Reward Reduction Percent", configDescOverride = "Percentage to reduce experience rewards by. Default is 20.")] + [FormatToken(token, 2)] + public static float expRewardReduction = 20f; - [RiskOfOptionsConfigureField(SS2Config.ID_MAIN, configSectionOverride = "Typhoon", configNameOverride = "Gold Reward Multipler", configDescOverride = "The gold reward multipler when defeating an enemy.")] - public static float goldRewardCoefficientVal = 0.8f; + [RiskOfOptionsConfigureField(SS2Config.ID_MAIN, configSectionOverride = "Typhoon", configNameOverride = "Gold Reward Reduction Percent", configDescOverride = "Percentage to reduce gold rewards by. Default is 20.")] + [FormatToken(token, 3)] + public static float goldRewardReduction = 20f; private int defMonsterCap; @@ -62,9 +68,10 @@ public override void OnRunStart(Run run) if (IncreaseSpawnCap) { - TeamCatalog.GetTeamDef(TeamIndex.Monster).softCharacterLimit *= spawnCapMultiplier; - TeamCatalog.GetTeamDef(TeamIndex.Void).softCharacterLimit *= spawnCapMultiplier; - TeamCatalog.GetTeamDef(TeamIndex.Lunar).softCharacterLimit *= spawnCapMultiplier; + int newCap = (int)(defMonsterCap * (1f + spawnCapIncrease / 100f)); + TeamCatalog.GetTeamDef(TeamIndex.Monster).softCharacterLimit = newCap; + TeamCatalog.GetTeamDef(TeamIndex.Void).softCharacterLimit = newCap; + TeamCatalog.GetTeamDef(TeamIndex.Lunar).softCharacterLimit = newCap; On.RoR2.CombatDirector.Awake += CombatDirector_Awake; } run.SetEventFlag("PermanentStorms"); @@ -74,9 +81,9 @@ private void CombatDirector_Awake(On.RoR2.CombatDirector.orig_Awake orig, Combat { if (IncreaseSpawnCap) { - self.creditMultiplier *= creditMultiplierVal; - self.expRewardCoefficient *= expRewardCoefficientVal; - self.goldRewardCoefficient *= goldRewardCoefficientVal; + self.creditMultiplier *= (1f + creditIncrease / 100f); + self.expRewardCoefficient *= (1f - expRewardReduction / 100f); + self.goldRewardCoefficient *= (1f - goldRewardReduction / 100f); } orig(self); } From 4597d5b8fdb54c1703a24a74368cfa931cc0949f Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 15:25:32 -0700 Subject: [PATCH 02/68] Storm NRE and ShockDroneVFX --- .../Starstorm2/Components/ShockDroneVFX.cs | 37 +++++++++++++------ .../EntityStates/Events/Weather/Storm.cs | 8 ++-- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Components/ShockDroneVFX.cs b/SS2-Project/Assets/Starstorm2/Components/ShockDroneVFX.cs index 64a763b90..b9d15e9b6 100644 --- a/SS2-Project/Assets/Starstorm2/Components/ShockDroneVFX.cs +++ b/SS2-Project/Assets/Starstorm2/Components/ShockDroneVFX.cs @@ -6,23 +6,35 @@ namespace SS2.Components { public class ShockDroneVFX : NetworkBehaviour { - private ModelLocator modelLocator; - private GameObject model; - private ChildLocator childLocator; private GameObject chargeVFX; private SkillLocator skillLocator; private HealthComponent healthComponent; - private bool chargeEnabled; private AkEvent[] droneAkEvents; private void Awake() { - modelLocator = GetComponent(); - model = modelLocator.modelTransform.gameObject; - childLocator = model.GetComponent(); - chargeVFX = childLocator.FindChild("ChargeSparks").gameObject; - skillLocator = GetComponent(); - healthComponent = GetComponent(); + if (!TryGetComponent(out var modelLocator)) + { + SS2Log.Error("ShockDroneVFX: missing ModelLocator"); + return; + } + + var modelTransform = modelLocator.modelTransform; + if (!modelTransform) + { + SS2Log.Error("ShockDroneVFX: modelTransform is null"); + return; + } + + if (modelTransform.TryGetComponent(out var childLocator)) + { + var chargeSparks = childLocator.FindChild("ChargeSparks"); + if (chargeSparks) + chargeVFX = chargeSparks.gameObject; + } + + TryGetComponent(out skillLocator); + TryGetComponent(out healthComponent); var droneBody = Addressables.LoadAssetAsync("RoR2/Base/Drones/Drone1Body.prefab").WaitForCompletion(); @@ -45,7 +57,10 @@ private void Awake() private void FixedUpdate() { - if (skillLocator.primary.stock == 0 || !healthComponent.alive) + if (!chargeVFX) + return; + + if (!skillLocator || !healthComponent || skillLocator.primary.stock == 0 || !healthComponent.alive) { chargeVFX.SetActive(false); } diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Events/Weather/Storm.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Events/Weather/Storm.cs index e23682a35..460098c00 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Events/Weather/Storm.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Events/Weather/Storm.cs @@ -102,10 +102,12 @@ public override void OnEnter() TeleporterUpgradeController.instance.UpgradeStorm(false); } + // TODO: Not 100% sure if every new director needs a new class object created. is this ok? + modifyMonsters = new UnityAction(ModifySpawnedMasters); foreach (CombatDirector combatDirector in CombatDirector.instancesList) { if (combatDirector != bossDirector) - combatDirector.onSpawnedServer.AddListener(modifyMonsters = new UnityAction(ModifySpawnedMasters)); + combatDirector.onSpawnedServer.AddListener(modifyMonsters); } CharacterBody.onBodyStartGlobal += BuffEnemy; @@ -307,7 +309,7 @@ public override void OnExit() { // removelistener makes it so we cant add it back in the next state's onenter. (wtf?????) CombatDirector bossDirector = TeleporterInteraction.instance?.bossDirector; - if (bossDirector && stormLevel >= 4) + if (bossDirector && stormLevel >= 4 && modifyBoss != null) { bossDirector.onSpawnedServer.RemoveListener(modifyBoss); } @@ -315,7 +317,7 @@ public override void OnExit() { foreach (CombatDirector combatDirector in CombatDirector.instancesList) { - if (combatDirector != bossDirector) + if (combatDirector != bossDirector && modifyMonsters != null) combatDirector.onSpawnedServer.RemoveListener(modifyMonsters); } } From 1fa2cf3790dafb24b3506bc707b31145d3bbaf42 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 15:29:48 -0700 Subject: [PATCH 03/68] the stormborn templar nerf everyone wanted + misc. exe fix --- .../Modules/Characters/Survivors/Executioner2.cs | 2 +- .../Starstorm2/Modules/Pickups/Items/Affix/AffixStorm.cs | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Executioner2.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Executioner2.cs index ea85887bd..dbc0e4e33 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Executioner2.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Executioner2.cs @@ -312,7 +312,7 @@ private void OnStackGained() { if (effectInstance) Destroy(effectInstance); - effectInstance = Instantiate(inMasterySkin ? fearEffectPrefabMastery : fearEffectPrefab, characterBody.coreTransform.position, Quaternion.identity); + effectInstance = Instantiate(inMasterySkin ? fearEffectPrefabMastery : fearEffectPrefab, characterBody.corePosition, Quaternion.identity); Util.PlaySound(activationSoundString, gameObject); //????????????? } diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Affix/AffixStorm.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Affix/AffixStorm.cs index 386df2b07..2b1db0d29 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Affix/AffixStorm.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Affix/AffixStorm.cs @@ -13,9 +13,14 @@ public sealed class AffixStorm : SS2Item { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acAffixStorm", SS2Bundle.Equipments); + private static BodyIndex clayTemplarBodyIndex; + private static int boostAttackSpeedStacks = 10; + private static int clayTemplarBoostAttackSpeedStacks = boostAttackSpeedStacks / 2; + public override void Initialize() { BuffOverlays.AddBuffOverlay(AssetCollection.FindAsset("BuffAffixStorm"), SS2Assets.LoadAsset("matAffixLightning", SS2Bundle.Equipments)); + RoR2Application.onLoad += () => clayTemplarBodyIndex = BodyCatalog.FindBodyIndex("ClayBruiserBody"); } public override bool IsAvailable(ContentPack contentPack) { @@ -41,7 +46,7 @@ public void Start() body.inventory.GiveItem(SS2Content.Items.BoostMovespeed, 25); body.inventory.GiveItem(SS2Content.Items.BoostCharacterSize, 20); body.inventory.GiveItem(RoR2Content.Items.BoostHp, 25); - body.inventory.GiveItem(RoR2Content.Items.BoostAttackSpeed, 10); + body.inventory.GiveItem(RoR2Content.Items.BoostAttackSpeed, body.bodyIndex == clayTemplarBodyIndex ? clayTemplarBoostAttackSpeedStacks : boostAttackSpeedStacks); } // If something else is going to override death states, then we need to make a skilloverride equivalent system. From a93ff43fa632a981db2ff9e9869a11e6c2a8182c Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 15:42:40 -0700 Subject: [PATCH 04/68] droid heads wont die on spawn anymore yay. Also Empy simulacrum fix --- .../Modules/Pickups/Items/Tier3/DroidHead.cs | 9 ++++++++- .../Modules/RunBehaviors/CustomEliteDirector.cs | 15 ++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier3/DroidHead.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier3/DroidHead.cs index 93e1fa71a..e5dd2dcb5 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier3/DroidHead.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier3/DroidHead.cs @@ -84,7 +84,14 @@ public void OnKilledOtherServer(DamageReport damageReport) droneMaster.gameObject.AddComponent().lifeTimer = baseLifeTime + (stackLifeTime * (stack - 1)); CharacterBody droidBody = droneMaster.GetBody(); - droidBody.baseDamage *= (baseDamage * stack); + + // In order for Droid Head drones to not just die on spawn from Elite death effects, + // give them a small window of invic + if (droidBody) + { + droidBody.baseDamage *= (baseDamage * stack); + droidBody.AddTimedBuff(RoR2Content.Buffs.Immune, 4f); + } Inventory droidInventory = droneMaster.inventory; diff --git a/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/CustomEliteDirector.cs b/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/CustomEliteDirector.cs index 4e7f08990..cbd008670 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/CustomEliteDirector.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/CustomEliteDirector.cs @@ -75,9 +75,15 @@ public void Awake() #endif } + private void OnDestroy() + { + if (instance == this) + instance = null; + } + public void FixedUpdate() { - if(NetworkServer.active && Run.instance) + if(NetworkServer.active && Run.instance && rng != null) { timer += Time.fixedDeltaTime; if (timer > directorTickInterval) @@ -244,7 +250,7 @@ public class Empyrean : StackableAffix public override bool IsBoss => true; public override bool IsAvailable() { - return Run.instance.stageClearCount > 7; + return Run.instance && Run.instance.stageClearCount > 7 && !(Run.instance is InfiniteTowerRun); } public override bool CanAfford(float baseCost, float totalCost, CombatDirector combatDirector) { @@ -299,7 +305,10 @@ public override void MakeElite(CharacterBody body) } // create separate class for drop component. create catalog of super elites somewhere - body.gameObject.AddComponent().drop = CustomEliteDirector.instance.treasureRng.NextElementUniform(new ItemIndex[] { SS2Content.Items.ShardEarth.itemIndex, SS2Content.Items.ShardFire.itemIndex, SS2Content.Items.ShardIce.itemIndex, SS2Content.Items.ShardLightning.itemIndex }); // hi + if (CustomEliteDirector.instance && CustomEliteDirector.instance.treasureRng != null) + { + body.gameObject.AddComponent().drop = CustomEliteDirector.instance.treasureRng.NextElementUniform(new ItemIndex[] { SS2Content.Items.ShardEarth.itemIndex, SS2Content.Items.ShardFire.itemIndex, SS2Content.Items.ShardIce.itemIndex, SS2Content.Items.ShardLightning.itemIndex }); // hi + } if (body.TryGetComponent(out RigidbodyMotor motor)) { From 3ebd0d9958e05669511c27293c8b68f41b7b35c4 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 15:52:33 -0700 Subject: [PATCH 05/68] NRE Fix for Nems when players spawn late --- .../Events/Nemesis/GenericNemesisBossState.cs | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Events/Nemesis/GenericNemesisBossState.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Events/Nemesis/GenericNemesisBossState.cs index cbaa5f65b..d7e4cfc95 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Events/Nemesis/GenericNemesisBossState.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Events/Nemesis/GenericNemesisBossState.cs @@ -84,12 +84,13 @@ public override void FixedUpdate() } public void StartEvent() { + HasWarned = true; if (musicOverridePrefab) musicTrack.track = mainTrack; if (NetworkServer.active && !hasSpawned) { - SpawnNemesisBoss(); hasSpawned = true; + SpawnNemesisBoss(); } } private void FindSpawnTarget() @@ -180,17 +181,29 @@ private void OnBossSpawned(SpawnCard.SpawnResult spawnResult) { if (pcmc && pcmc.master && pcmc.master.inventory.GetItemCount(SS2Content.Items.VoidRock) > 0) { - target = pcmc.master.GetBodyObject(); + if (pcmc.master.hasBody) + { + target = pcmc.master.GetBodyObject(); + } break; } } - RoR2.CharacterAI.BaseAI ai = master.GetComponent(); - if (ai) - ai.currentEnemy.gameObject = target; + if (master.TryGetComponent(out var ai)) + { + if (target) + ai.currentEnemy.gameObject = target; + } + else + { + SS2Log.Error("GenericNemesisBossState: master missing BaseAI component"); + } new FriendManager.SyncBaseStats(nemesisBossBody).Send(R2API.Networking.NetworkDestination.Clients); combatSquad.AddMember(master); - combatSquad.GetComponent().defaultTeam = TeamIndex.Monster; + if (combatSquad.TryGetComponent(out var teamFilter)) + teamFilter.defaultTeam = TeamIndex.Monster; + else + SS2Log.Error("GenericNemesisBossState: combatSquad missing TeamFilter component"); NetworkServer.Spawn(combatSquad.gameObject); } From cec6cc6dacc87d641ace95c52cab5babb7a21d12 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 16:07:20 -0700 Subject: [PATCH 06/68] Eth pilllars no longer destroy drones --- .../Pickups/Equipments/AffixEthereal.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixEthereal.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixEthereal.cs index c689c29fd..68c1f4e86 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixEthereal.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixEthereal.cs @@ -27,6 +27,9 @@ public override bool Execute(EquipmentSlot slot) } public static GameObject projectilePrefab; + + private static int etherealFirePillarIndex = -1; + public override void Initialize() { Material matEtherealOverlay = AssetCollection.FindAsset("matEtherealOverlay"); @@ -41,6 +44,26 @@ public override void Initialize() BuffOverlays.AddBuffOverlay(EquipmentDef.passiveBuffDef, matEtherealOverlay); // Used for suicide buff BuffOverlays.AddBuffOverlay(buffHakai, matHakaiOverlay); + + On.RoR2.HealthComponent.TakeDamageProcess += OnTakeDamageProcess; + RoR2Application.onLoad += () => + { + etherealFirePillarIndex = ProjectileCatalog.FindProjectileIndex("EtherealFirePillar"); + }; + } + + private static void OnTakeDamageProcess(On.RoR2.HealthComponent.orig_TakeDamageProcess orig, HealthComponent self, DamageInfo damageInfo) + { + // I know haha Eth is hard but we dont need to one shot peoples drones + // We could also explore reducing the damage here if it turns out its too OP + if (etherealFirePillarIndex >= 0 + && self.body && self.body.IsDrone + && damageInfo.inflictor && damageInfo.inflictor.TryGetComponent(out ProjectileController pc) + && pc.catalogIndex == etherealFirePillarIndex) + { + damageInfo.rejected = true; + } + orig(self, damageInfo); } From ca9a9519d04d8d1e63629245a6df7fe277fa27e6 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 16:13:48 -0700 Subject: [PATCH 07/68] Empyreans are invincible during spawn anim like SSR --- .../Modules/EntityStates/AffixEmpyrean/SpawnState.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AffixEmpyrean/SpawnState.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AffixEmpyrean/SpawnState.cs index 80137480d..4a1786f7d 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AffixEmpyrean/SpawnState.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AffixEmpyrean/SpawnState.cs @@ -12,6 +12,11 @@ public override void OnEnter() { base.OnEnter(); + if (NetworkServer.active) + { + characterBody.AddBuff(RoR2Content.Buffs.HiddenInvincibility); + } + // NEED CUSTOM SFX float minX = Mathf.Infinity; @@ -96,6 +101,11 @@ public override void FixedUpdate() public override void OnExit() { base.OnExit(); + + if (NetworkServer.active) + { + characterBody.RemoveBuff(RoR2Content.Buffs.HiddenInvincibility); + } Transform modelTransform = base.GetModelTransform(); if(modelTransform) { @@ -109,7 +119,7 @@ public override void OnExit() } - characterBody.bodyFlags &= CharacterBody.BodyFlags.IgnoreKnockup; + characterBody.bodyFlags &= ~CharacterBody.BodyFlags.IgnoreKnockup; if (animator) animator.enabled = true; if (aimAnimator) { From 3cd9513c0fb15bcfcc763b11b98b9797738a93f2 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 16:31:05 -0700 Subject: [PATCH 08/68] sketchy fix for mimic bug --- .../Modules/EntityStates/Mimic/MimicChestDeath.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Mimic/MimicChestDeath.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Mimic/MimicChestDeath.cs index 6ea0be3bf..617e5229e 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Mimic/MimicChestDeath.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Mimic/MimicChestDeath.cs @@ -25,6 +25,13 @@ public override void OnEnter() { base.OnEnter(); + // TODO: Idk if this works actually - Buns + // Deactivate hurtboxes so the corpse can't be targeted or procced off by damage sources (ATG, Ukulele, etc.) + if (characterBody && characterBody.hurtBoxGroup) + { + characterBody.hurtBoxGroup.hurtBoxesDeactivatorCounter++; + } + PlayAnimation("Gesture, Override", "BufferEmpty"); if(characterBody.modelLocator.modelTransform.TryGetComponent(out var cmodel)) From 75e072283f2eff14e0377d039e8b07f0c2176f2f Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 17:04:39 -0700 Subject: [PATCH 09/68] shardpoison/shardvoid zanzan trader fix --- .../Starstorm2/Components/TradeController.cs | 26 +++++++++++-------- .../Pickups/Items/Curio/ShardPoison.cs | 18 +++++++++++++ 2 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardPoison.cs diff --git a/SS2-Project/Assets/Starstorm2/Components/TradeController.cs b/SS2-Project/Assets/Starstorm2/Components/TradeController.cs index 510e43ba0..d64b443d9 100644 --- a/SS2-Project/Assets/Starstorm2/Components/TradeController.cs +++ b/SS2-Project/Assets/Starstorm2/Components/TradeController.cs @@ -43,7 +43,7 @@ private void Start() { for (int i = 0; i < trades.Length; i++) { - if (trades[i].desiredItem) + if (trades[i].desiredItem && trades[i].desiredItem.itemIndex != ItemIndex.None) desiredItems.Add(trades[i].desiredItem.itemIndex); } if(NetworkServer.active) @@ -88,22 +88,26 @@ public void SetOptionsFromInteractor(Interactor activator) public void BeginTrading(int intPickupIndex) { PickupDef pickupDef = PickupCatalog.GetPickupDef(new PickupIndex(intPickupIndex)); - if (pickupDef != null && this.interactor) + if (pickupDef == null || !this.interactor) { - this.lastTradedItemIndex = pickupDef.itemIndex; - CharacterBody component = this.interactor.GetComponent(); - if (component && component.inventory) + SS2Log.Error("TradeController.BeginTrading: pickupDef or interactor is null"); + return; + } + + this.lastTradedItemIndex = pickupDef.itemIndex; + CharacterBody component = this.interactor.GetComponent(); + if (component && component.inventory) + { + if (component.inventory.GetItemCount(pickupDef.itemIndex) > 0) { - if (component.inventory.GetItemCount(pickupDef.itemIndex) > 0) - { - component.inventory.RemoveItem(pickupDef.itemIndex); - ScrapperController.CreateItemTakenOrb(component.corePosition, base.gameObject, pickupDef.itemIndex); - } + component.inventory.RemoveItem(pickupDef.itemIndex); + ScrapperController.CreateItemTakenOrb(component.corePosition, base.gameObject, pickupDef.itemIndex); } } + foreach(TradeDef trade in trades) // temp /////////////////////////////////////////////////////////////////////////////////// { - if(trade.desiredItem.itemIndex == pickupDef.itemIndex) + if(trade.desiredItem && trade.desiredItem.itemIndex == pickupDef.itemIndex) { Transform dropTransform = this.dropTransform ? this.dropTransform : base.transform; GenericPickupController.CreatePickupInfo createPickupInfo = new GenericPickupController.CreatePickupInfo diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardPoison.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardPoison.cs new file mode 100644 index 000000000..721978b6d --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardPoison.cs @@ -0,0 +1,18 @@ +using MSU; +using RoR2; +using RoR2.ContentManagement; +namespace SS2.Items +{ + // TODO: ShardPoison.asset is in AssetStorm/Base/Elites/SuperElites/AffixSuperPoison/. + // TODO: Are we even using this? What did Orbeez mean by super poison? + public sealed class ShardPoison : SS2Item + { + public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("ShardPoison", SS2Bundle.Items); + + public override void Initialize() + { + + } + public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + } +} From 203716ed1a84718119319e8f2d20ec99189ca1c8 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 17:19:41 -0700 Subject: [PATCH 10/68] dead code spotted idk? --- SS2-Project/Assets/Starstorm2/Modules/Orbs/ChirrSiphonOrb.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Orbs/ChirrSiphonOrb.cs b/SS2-Project/Assets/Starstorm2/Modules/Orbs/ChirrSiphonOrb.cs index b3d1703bd..422951c28 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Orbs/ChirrSiphonOrb.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Orbs/ChirrSiphonOrb.cs @@ -3,6 +3,7 @@ using UnityEngine; namespace SS2.Orbs { + // TODO: Is this dead code? Looks like we're using ChirrFriendOrb now public class ChirrSiphonOrb : Orb { public float siphonPercent; From 83a5f204bc182a7ef1daf578e7d8c0c3e997bad9 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 17:29:40 -0700 Subject: [PATCH 11/68] Xi cant run away now --- .../Modules/EntityStates/AI/Fear.cs | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs index 988b73194..3636533a1 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs @@ -1,4 +1,5 @@ -using RoR2.CharacterAI; +using RoR2; +using RoR2.CharacterAI; using RoR2.Navigation; using UnityEngine; using SS2; @@ -16,9 +17,30 @@ public class Fear : BaseAIState private float fallbackNodeStartAge; private readonly float fallbackNodeDuration = 4f; + + private static BodyIndex xiConstructBodyIndex = BodyIndex.None; + + [SystemInitializer] + private static void Init() + { + RoR2Application.onLoad += () => + { + xiConstructBodyIndex = BodyCatalog.FindBodyIndex("MajorConstructBody"); + }; + } + public override void OnEnter() { base.OnEnter(); + + // Xi Construct flies to unreachable heights when feared + // Instead we jump straight into LookBusy. O(1) check, Nebby will be proud + if (base.body && base.body.bodyIndex == xiConstructBodyIndex) + { + this.outer.SetNextState(new LookBusy()); + return; + } + if (base.ai) { this.lastPathUpdate = base.ai.broadNavigationAgent.output.lastPathUpdate; From 5dfb6ea3e869ef473b572d3e1cfc5f29ad2bd088 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 17:38:45 -0700 Subject: [PATCH 12/68] need to ensure its not a player controlled drone --- .../Starstorm2/Modules/Pickups/Equipments/AffixEthereal.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixEthereal.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixEthereal.cs index 68c1f4e86..6786a7740 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixEthereal.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixEthereal.cs @@ -57,7 +57,7 @@ private static void OnTakeDamageProcess(On.RoR2.HealthComponent.orig_TakeDamageP // I know haha Eth is hard but we dont need to one shot peoples drones // We could also explore reducing the damage here if it turns out its too OP if (etherealFirePillarIndex >= 0 - && self.body && self.body.IsDrone + && self.body && self.body.IsDrone && !self.body.isPlayerControlled && damageInfo.inflictor && damageInfo.inflictor.TryGetComponent(out ProjectileController pc) && pc.catalogIndex == etherealFirePillarIndex) { From d23e010c986e9c59b33ac10ccd76ca97a2fbc55b Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sat, 18 Apr 2026 12:28:21 -0700 Subject: [PATCH 13/68] mimic chirr death friend fix --- .../Modules/EntityStates/Mimic/MimicChestDeath.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Mimic/MimicChestDeath.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Mimic/MimicChestDeath.cs index 617e5229e..b882c08f1 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Mimic/MimicChestDeath.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Mimic/MimicChestDeath.cs @@ -32,6 +32,20 @@ public override void OnEnter() characterBody.hurtBoxGroup.hurtBoxesDeactivatorCounter++; } + // TODO: I also have no clue if this works, need to test - Buns + // Force all non-Body ESMs (e.g. Weapon) to idle so the dead mimic stops attacking. + // GenericCharacterDeath only enters the Body ESM — other ESMs keep running. + // Without this, a Chirr-tamed mimic reverts to the Monster team on death + // (via ChirrFriendController.RemoveFriend) while its weapon ESM still fires, + // causing bullets to target the player. + foreach (EntityStateMachine esm in gameObject.GetComponents()) + { + if (esm != outer) + { + esm.SetNextStateToMain(); + } + } + PlayAnimation("Gesture, Override", "BufferEmpty"); if(characterBody.modelLocator.modelTransform.TryGetComponent(out var cmodel)) From 5c4551036cfddfdbe49e9b3246a5af0c2162622d Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sat, 18 Apr 2026 12:49:55 -0700 Subject: [PATCH 14/68] knight clientside parry fixes --- .../Components/Knight/KnightBlockTracker.cs | 43 ++++++++++++++++- .../Modules/Characters/Survivors/Knight.cs | 10 ++++ .../Modules/EntityStates/Knight/Parry.cs | 13 ++++-- .../Modules/EntityStates/Knight/Shield.cs | 46 ++++++++++++------- 4 files changed, 91 insertions(+), 21 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Components/Knight/KnightBlockTracker.cs b/SS2-Project/Assets/Starstorm2/Components/Knight/KnightBlockTracker.cs index 91d769215..70a310f2e 100644 --- a/SS2-Project/Assets/Starstorm2/Components/Knight/KnightBlockTracker.cs +++ b/SS2-Project/Assets/Starstorm2/Components/Knight/KnightBlockTracker.cs @@ -1,6 +1,9 @@ using RoR2; +using System; +using EntityStates; using UnityEngine; using UnityEngine.Networking; +using SS2.Survivors; namespace SS2.Components { @@ -9,6 +12,9 @@ public class KnightBlockTracker : NetworkBehaviour, IOnIncomingDamageServerRecei private GameObject lastAttacker; private float lastAttackTime; + private float parryWindowEndTime; + private bool hasStunned; + public delegate void OnIncomingDamageAuthority(GameObject attacker); public OnIncomingDamageAuthority onIncomingDamageAuthority; @@ -23,8 +29,43 @@ void Update() public GameObject GetLastAttacker() => lastAttacker; + [Command] + public void CmdArmParry(float duration) + { + parryWindowEndTime = Time.fixedTime + duration; + hasStunned = false; + } + + [Command] + public void CmdDisarmParry() + { + parryWindowEndTime = 0f; + } + public void OnIncomingDamageServer(DamageInfo damageInfo) { + if (Time.fixedTime < parryWindowEndTime) + { + damageInfo.rejected = true; + + if (!hasStunned) + { + hasStunned = true; + + if (damageInfo.attacker + && damageInfo.attacker.TryGetComponent(out SetStateOnHurt setStateOnHurt) + && setStateOnHurt.canBeStunned) + { + Type state = setStateOnHurt.targetStateMachine.state.GetType(); + if (state != typeof(StunState) + && state != typeof(ShockState) + && state != typeof(FrozenState)) + { + setStateOnHurt.SetStun(3f); + } + } + } + } RpcSetLastAttacker(damageInfo.attacker); } @@ -32,7 +73,7 @@ public void OnIncomingDamageServer(DamageInfo damageInfo) public void RpcSetLastAttacker(GameObject attacker) { lastAttacker = attacker; - lastAttackTime = 0.2f; + lastAttackTime = Knight.lastAttackWindow; onIncomingDamageAuthority?.Invoke(attacker); } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs index 48cfb2fbf..16c85e8d0 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs @@ -10,8 +10,18 @@ namespace SS2.Survivors { + // TODO: When I am back in Unityland to bump parryBuffDuration from 0.4s to 1.0s+ in escKnightShield.asset public sealed class Knight : SS2Survivor { + /// + /// How long (in seconds) the "before" parry window remembers the last attacker + /// When the player presses secondary, Shield.OnEnter checks if an attack landed within + /// this window and triggers a retroactive parry (visual feedback + buffed skills) + /// We want to reward players whose timing was slightly late by still granting the parry payoff + /// and where network latency might have caused issues too + /// This wont retroactively reject damage though + /// + public static float lastAttackWindow = 0.5f; public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acKnight", SS2Bundle.Indev); public static GameObject KnightImpactEffect; diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/Parry.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/Parry.cs index de541890f..016f0c524 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/Parry.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/Parry.cs @@ -7,6 +7,7 @@ using System; using UnityEngine; using UnityEngine.AddressableAssets; +using UnityEngine.Networking; namespace EntityStates.Knight { @@ -44,7 +45,10 @@ public override void OnEnter() base.OnEnter(); - characterBody.AddBuff(RoR2Content.Buffs.HiddenInvincibility); + if (NetworkServer.active) + { + characterBody.AddBuff(RoR2Content.Buffs.HiddenInvincibility); + } animator = GetModelAnimator(); // Grab and set the original skills @@ -52,7 +56,7 @@ public override void OnEnter() utilitySkill = skillLocator.utility; specialSkill = skillLocator.special; - upgradedSkillCache = gameObject.GetComponent(); + gameObject.TryGetComponent(out upgradedSkillCache); TryOverrideSkill(primarySkill, ref buffedPrimarySkillDef); TryOverrideSkill(utilitySkill, ref buffedUtilitySkillDef); @@ -153,7 +157,10 @@ public override void OnExit() TryUnsetOverride(utilitySkill, buffedUtilitySkillDef); TryUnsetOverride(specialSkill, buffedSpecialSkillDef); - characterBody.RemoveBuff(RoR2Content.Buffs.HiddenInvincibility); + if (NetworkServer.active) + { + characterBody.RemoveBuff(RoR2Content.Buffs.HiddenInvincibility); + } base.OnExit(); } diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/Shield.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/Shield.cs index 0b229930f..ecb14ee4e 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/Shield.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/Shield.cs @@ -2,10 +2,8 @@ using RoR2; using RoR2.Skills; using SS2; -using System; using UnityEngine.Networking; using MSU.Config; -using EntityStates.BrotherMonster; using SS2.Components; namespace EntityStates.Knight @@ -41,7 +39,11 @@ public override void OnEnter() base.OnEnter(); rollStateMachine = EntityStateMachine.FindByCustomName(this.characterBody.gameObject, "Roll"); parryHurtbox = FindModelChildGameObject("ParryHurtbox"); - blockTracker = characterBody.GetComponent(); + if (!characterBody.TryGetComponent(out blockTracker)) + { + SS2Log.Error("Shield.OnEnter: KnightBlockTracker missing"); + return; + } animator = GetModelAnimator(); PlayCrossfade("Gesture, Override", "RaiseShield", 0.1f); @@ -120,7 +122,16 @@ private void BeginParrying() blockTracker.onIncomingDamageAuthority += ParryAttacker; parryHurtbox.SetActive(true); - characterBody.AddBuff(RoR2Content.Buffs.HiddenInvincibility); + + if (NetworkServer.active) + { + characterBody.AddBuff(RoR2Content.Buffs.HiddenInvincibility); + } + + if (isAuthority && blockTracker) + { + blockTracker.CmdArmParry(parryBuffDuration); + } // TODO //EffectData effectData = new EffectData(); @@ -138,22 +149,20 @@ private void EndParrying() blockTracker.onIncomingDamageAuthority -= ParryAttacker; parryHurtbox.SetActive(false); - characterBody.RemoveBuff(RoR2Content.Buffs.HiddenInvincibility); - } - private void ParryAttacker(GameObject attacker) - { - if (attacker && attacker.TryGetComponent(out SetStateOnHurt setStateOnHurt) && setStateOnHurt.canBeStunned) + if (NetworkServer.active) { - // Stun the enemy - Type state = setStateOnHurt.targetStateMachine.state.GetType(); - if (state != typeof(StunState) && state != typeof(ShockState) && state != typeof(FrozenState)) - { - setStateOnHurt.SetStun(3f); - } + characterBody.RemoveBuff(RoR2Content.Buffs.HiddenInvincibility); + } + + if (isAuthority && blockTracker) + { + blockTracker.CmdDisarmParry(); } + } - // TODO: Should we have a custom sound for this? + private void ParryAttacker(GameObject attacker) + { Util.PlaySound("NemmandoDecisiveStrikeReady", gameObject); EndParrying(); @@ -228,7 +237,10 @@ public override void OnExit() characterBody.SetAimTimer(0.5f); PlayCrossfade("Gesture, Override", "BufferEmpty", 0.1f); - characterBody.RemoveBuff(shieldBuff); + if (NetworkServer.active) + { + characterBody.RemoveBuff(shieldBuff); + } SetPrimaryOverride(false); EndParrying(); From f4eb8552ce4768831677caaa58fd5c2f99bee93b Mon Sep 17 00:00:00 2001 From: hevia Date: Sat, 18 Apr 2026 13:54:37 -0700 Subject: [PATCH 15/68] I think EnemiesReturns caused a teleporter charge bug with Cyborg bc of missing Model Skin Controller? Not sure if I understand either but I'll try this to see if it fixes anything --- .../Characters/Cyborg2/Cyborg2Body.prefab | 25 +++++++++++++++++++ .../Pickups/Items/Curio/ShardPoison.cs.meta | 11 ++++++++ 2 files changed, 36 insertions(+) create mode 100644 SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardPoison.cs.meta diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab index 97242a424..07df425f7 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab @@ -1793,6 +1793,31 @@ MonoBehaviour: oldHeal: 0 oldFade: 0 forceUpdate: 0 +--- !u!114 &7060471386824513616 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5008875975933509408} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: + m_EditorClassIdentifier: + DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 + _animatorControllerAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _animatorController: {fileID: 0} + _avatarAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _avatar: {fileID: 0} + skins: [] + prefabInstantiationDatas: [] --- !u!4 &5677010006892963226 stripped Transform: m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 577b3c79db118904c8eda5144dd41024, diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardPoison.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardPoison.cs.meta new file mode 100644 index 000000000..827798296 --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardPoison.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 858c0306741bdfd4cb62522f6677c9e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From ef0f460a37ccc5a8214ab77b8ec96903c5954d0b Mon Sep 17 00:00:00 2001 From: hevia Date: Sat, 18 Apr 2026 14:34:56 -0700 Subject: [PATCH 16/68] increase knight parry window to address latency issues --- .../InDev/Characters/Knight/Skills/escKnightShield.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Knight/Skills/escKnightShield.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Knight/Skills/escKnightShield.asset index f0049d49f..b8fef8500 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Knight/Skills/escKnightShield.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Knight/Skills/escKnightShield.asset @@ -27,7 +27,7 @@ MonoBehaviour: objectValue: {fileID: 11400000, guid: 5849d64b8d77076478f1da59bc884d6d, type: 2} - fieldName: parryBuffDuration fieldValue: - stringValue: 0.4 + stringValue: 1.2 objectValue: {fileID: 0} - fieldName: shieldBashSkillDef fieldValue: From fa92cca4b8a42bb59979c58e5f27548a8e74dd69 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sat, 18 Apr 2026 20:42:11 -0700 Subject: [PATCH 17/68] add debug commands --- .../Modules/Characters/Monsters/Mimic.cs | 28 +++++++++++++++++++ .../Modules/RunBehaviors/EtherealBehavior.cs | 14 ++++++++++ SS2-Project/Assets/Starstorm2/SS2Util.cs | 16 +++++++++++ 3 files changed, 58 insertions(+) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Mimic.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Mimic.cs index f47a0df39..2af2993e4 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Mimic.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Mimic.cs @@ -269,6 +269,34 @@ private void ServerDamageStealItem(DamageReport obj) } } } + + [ConCommand(commandName = "mimic_debug", flags = ConVarFlags.Cheat | ConVarFlags.ExecuteOnServer, helpText = "Spawns a mimic chest interactable at the sender's position.")] + public static void CCSpawnMimic(ConCommandArgs args) + { + if (!NetworkServer.active) return; + + CharacterMaster master = args.GetSenderMaster(); + if (!master || !master.GetBody()) + { + SS2Log.Error("mimic_debug: No valid body found."); + return; + } + + InteractableSpawnCard spawnCard = SS2Assets.LoadAsset("iscMimic", SS2Bundle.Monsters); + if (!spawnCard) + { + SS2Log.Error("mimic_debug: Could not load iscMimic."); + return; + } + + DirectorPlacementRule placementRule = new DirectorPlacementRule + { + placementMode = DirectorPlacementRule.PlacementMode.Direct, + position = master.GetBody().footPosition + }; + + DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(spawnCard, placementRule, Run.instance.spawnRng)); + } } public class MimicTheftMessage : SubjectChatMessage diff --git a/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/EtherealBehavior.cs b/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/EtherealBehavior.cs index 1b97484c4..a630881ed 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/EtherealBehavior.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/EtherealBehavior.cs @@ -327,6 +327,20 @@ public static void CCSetEtherealsCleared(ConCommandArgs args) FindObjectOfType()?.Start(); // XDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD } } + + [ConCommand(commandName = "activate_eth", flags = ConVarFlags.Cheat | ConVarFlags.ExecuteOnServer, helpText = "Activates ethereal difficulty on the current teleporter.")] + public static void CCActivateEthereal(ConCommandArgs args) + { + if (!NetworkServer.active) return; + + if (!TeleporterUpgradeController.instance) + { + SS2Log.Error("activate_eth: No TeleporterUpgradeController found."); + return; + } + + TeleporterUpgradeController.instance.UpgradeEthereal(); + } } public struct EtherealDifficulty diff --git a/SS2-Project/Assets/Starstorm2/SS2Util.cs b/SS2-Project/Assets/Starstorm2/SS2Util.cs index 9b9b237db..71db21ab0 100644 --- a/SS2-Project/Assets/Starstorm2/SS2Util.cs +++ b/SS2-Project/Assets/Starstorm2/SS2Util.cs @@ -3,6 +3,7 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +using UnityEngine.Networking; using System.Linq; using MSU; using RoR2.ExpansionManagement; @@ -376,6 +377,21 @@ public static void CmdGrantOneOfEachItem(ConCommandArgs args) } } + [ConCommand(commandName = "give_voidrock", flags = ConVarFlags.Cheat | ConVarFlags.ExecuteOnServer, helpText = "Gives the VoidRock item to the sender.")] + public static void CCGiveVoidRock(ConCommandArgs args) + { + if (!NetworkServer.active) return; + + CharacterMaster master = args.GetSenderMaster(); + if (!master || !master.inventory) + { + SS2Log.Error("give_voidrock: No valid master or inventory found."); + return; + } + + master.inventory.GiveItem(SS2Content.Items.VoidRock, 1); + } + public static T CopyComponent(T original, GameObject destination) where T : Component { var type = original.GetType(); From 71b1f1a9296546d59ae04a153be5e775cb604ec2 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sat, 18 Apr 2026 21:35:31 -0700 Subject: [PATCH 18/68] unlock all config returns --- .../Modules/Unlockables/Unlockables.cs | 89 +++++++------------ SS2-Project/Assets/Starstorm2/SS2Config.cs | 9 ++ SS2-Project/Assets/Starstorm2/SS2Main.cs | 2 + 3 files changed, 41 insertions(+), 59 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs b/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs index 2eff2cccb..c0abde186 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs @@ -1,76 +1,47 @@ -using R2API.ScriptableObjects; -using R2API.Utils; -using RoR2; +using RoR2; using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using UObject = UnityEngine.Object; -//TODO: refactor this into its own unique class because MSU no longer has an unlockables module. -N -/* -namespace SS2.Modules + +namespace SS2 { - public sealed class Unlockables : UnlockablesModuleBase + public static class UnlockAllHandler { - public static Unlockables Instance { get; private set; } - - public override R2APISerializableContentPack SerializableContentPack { get; } = SS2Content.Instance.SerializableContentPack; + private static HashSet ss2Unlockables; - public override void Initialize() + internal static void Init() { - Instance = this; - base.Initialize(); - SS2Log.Info($"Initializing Unlockables."); - GetUnlockableBases(); + if (!SS2Config.unlockAll.value) + return; + + UnlockableCatalog.availability.onAvailable += BuildCacheAndHook; } - protected override IEnumerable GetUnlockableBases() + private static void BuildCacheAndHook() { - var allUnlocks = base.GetUnlockableBases(); - if (SS2Config.unlockAll) + ss2Unlockables = new HashSet(); + + var unlockables = SS2Content.SS2ContentPack.unlockableDefs; + for (int i = 0; i < unlockables.Length; i++) { - RemoveAllNonSkinUnlocks(); - allUnlocks = allUnlocks.Where(unlock => unlock.UnlockableDef.cachedName.Contains("skin")); - } + UnlockableDef def = unlockables[i]; + if (def == null) continue; - allUnlocks.ToList().ForEach(unlock => AddUnlockable(unlock)); + // skip skins we want players to still earn those + if (def.cachedName.IndexOf("skin", System.StringComparison.OrdinalIgnoreCase) >= 0) + continue; - return null; + ss2Unlockables.Add(def); + } + + On.RoR2.UserProfile.HasUnlockable_UnlockableDef += ForceHasUnlockable; + SS2Log.Info($"UnlockAllHandler: Forcing {ss2Unlockables.Count} SS2 unlockables as unlocked (skins excluded)."); } - private void RemoveAllNonSkinUnlocks() + private static bool ForceHasUnlockable(On.RoR2.UserProfile.orig_HasUnlockable_UnlockableDef orig, UserProfile self, UnlockableDef unlockableDef) { -#if DEBUG - SS2Log.Info("Unlock all is enabled, removing unlocks for everything except skins"); -#endif - //This should load all the assets we have that: - //Are not skin defs - //Have a field that has an unlockableDef field. - var allAssets = SS2Assets.LoadAllAssets(SS2Bundle.All) - .Where(asset => !(asset is SkinDef)) - .Where(asset => asset.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) - .Where(fInfo => - { - bool isNotStatic = !fInfo.IsStatic; - var fieldType = fInfo.FieldType; - bool isUnlockableDefOrDerived = fieldType.IsSameOrSubclassOf(); - return isNotStatic && isUnlockableDefOrDerived; - }).Count() > 0); - - foreach (UObject asset in allAssets) - { - var fieldsInAsset = asset.GetType() - .GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) - .Where(fieldInfo => fieldInfo.FieldType.IsSameOrSubclassOf()).ToArray(); + if (unlockableDef != null && ss2Unlockables.Contains(unlockableDef)) + return true; - foreach (FieldInfo field in fieldsInAsset) - { - field.SetValue(asset, null); - } - -#if DEBUG - SS2Log.Info($"Removed {fieldsInAsset.Length} unlockableDef references from {asset}"); -#endif - } + return orig(self, unlockableDef); } } -}*/ +} diff --git a/SS2-Project/Assets/Starstorm2/SS2Config.cs b/SS2-Project/Assets/Starstorm2/SS2Config.cs index 3076d0b07..8922dd9e3 100644 --- a/SS2-Project/Assets/Starstorm2/SS2Config.cs +++ b/SS2-Project/Assets/Starstorm2/SS2Config.cs @@ -51,6 +51,7 @@ public class SS2Config public static float FlashingEffectsIntensity = 100f; public static ConfiguredBool enableBeta; + public static ConfiguredBool unlockAll; internal static IEnumerator RegisterToModSettingsManager() @@ -99,6 +100,14 @@ internal SS2Config(BaseUnityPlugin bup) }).DoConfigure(); ConfigAccessibility = CreateConfigFile(ID_ACCESSIBILITY, true); + + unlockAll = SS2Config.ConfigFactory.MakeConfiguredBool(false, b => + { + b.section = "General"; + b.key = "Unlock All"; + b.description = "Unlocks all SS2 content (items, survivors, skills) without needing to complete achievements. Skins are excluded. Requires a restart to take effect."; + b.configFile = SS2Config.ConfigMain; + }).DoConfigure(); } diff --git a/SS2-Project/Assets/Starstorm2/SS2Main.cs b/SS2-Project/Assets/Starstorm2/SS2Main.cs index b0b3374a3..9ff3d4afd 100644 --- a/SS2-Project/Assets/Starstorm2/SS2Main.cs +++ b/SS2-Project/Assets/Starstorm2/SS2Main.cs @@ -53,6 +53,8 @@ public void Awake() new SS2Config(this); new SS2Content(); + UnlockAllHandler.Init(); + LoadBurstAssembly(); LanguageFileLoader.AddLanguageFilesFromMod(this, "languages"); LoadingScreenSpriteUtility.AddSpriteAnimations(SS2Assets.GetLoadingScreenBundle()); From 2551429cbf1a9d78107951043dc4d819df54a0af Mon Sep 17 00:00:00 2001 From: hevia Date: Sat, 18 Apr 2026 21:51:52 -0700 Subject: [PATCH 19/68] Add curio disabling, and elite equipment disabling. The haters wanna silence our content --- .../ContentClasses/SS2EliteEquipment.cs | 17 ++++++++++++++++- .../Starstorm2/ContentClasses/SS2Equipment.cs | 4 ++-- .../Assets/Starstorm2/ContentClasses/SS2Item.cs | 2 +- .../Modules/Pickups/Equipments/AffixPurple.cs | 5 ++++- .../Pickups/Equipments/AffixSuperEarth.cs | 5 ++++- .../Pickups/Equipments/AffixSuperFire.cs | 5 ++++- .../Modules/Pickups/Equipments/AffixSuperIce.cs | 5 ++++- .../Pickups/Equipments/AffixSuperLightning.cs | 5 ++++- .../Pickups/Equipments/SeismicOscillator.cs | 5 ++++- .../Modules/Pickups/Items/Curio/Bleedout.cs | 5 ++++- .../Pickups/Items/Curio/DebuffMissiles.cs | 5 ++++- .../Pickups/Items/Curio/EliteDamageBonus.cs | 5 ++++- .../Modules/Pickups/Items/Curio/HitList.cs | 5 ++++- .../Pickups/Items/Curio/ItemOnBossKill.cs | 5 ++++- .../Pickups/Items/Curio/ItemOnEliteKill.cs | 5 ++++- .../Modules/Pickups/Items/Curio/MaxHpOnKill.cs | 5 ++++- .../Pickups/Items/Curio/ScrapFromChest.cs | 5 ++++- .../Modules/Pickups/Items/Curio/ShardGold.cs | 5 ++++- .../Modules/Pickups/Items/Curio/ShardPoison.cs | 5 ++++- .../Modules/Pickups/Items/Curio/ShardScav.cs | 5 ++++- .../Modules/Pickups/Items/Curio/ShardStorm.cs | 5 ++++- .../Modules/Pickups/Items/Curio/ShardVoid.cs | 5 ++++- .../Modules/Pickups/Items/Curio/ShellPiece.cs | 5 ++++- .../Modules/Pickups/Items/Curio/ShieldGate.cs | 5 ++++- .../Modules/Pickups/Items/Curio/SnakeEyes.cs | 5 ++++- .../Pickups/Items/Tier2/BlastKnuckles.cs | 6 +++--- .../Modules/Pickups/Items/Tier2/RainbowRoot.cs | 2 +- 27 files changed, 111 insertions(+), 30 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/ContentClasses/SS2EliteEquipment.cs b/SS2-Project/Assets/Starstorm2/ContentClasses/SS2EliteEquipment.cs index c5652ca07..2b718437a 100644 --- a/SS2-Project/Assets/Starstorm2/ContentClasses/SS2EliteEquipment.cs +++ b/SS2-Project/Assets/Starstorm2/ContentClasses/SS2EliteEquipment.cs @@ -27,7 +27,22 @@ public abstract class SS2EliteEquipment : IEliteContentPiece, IContentPackModifi public EquipmentDef EquipmentDef { get; protected set; } public abstract SS2AssetRequest AssetRequest { get; } public abstract void Initialize(); - public abstract bool IsAvailable(ContentPack contentPack); + public virtual bool IsAvailable(ContentPack conentPack) + { + ConfiguredBool isDisabled = SS2Config.ConfigFactory.MakeConfiguredBool(false, b => + { + b.section = "00 - Elite Disabling"; + b.key = $"Disable Elite Equipment: {MSUtil.NicifyString(GetType().Name)}"; + b.description = "Set this to true if you want to disable this elite equipment (and the associated elite) from appearing in game. Make sure everyone has this enabled or disabled in multiplayer otherwise desyncs could occur as this prevents the content from being loaded entirely. Restart required."; + b.configFile = SS2Config.ConfigItem; + b.checkBoxConfig = new CheckBoxConfig + { + restartRequired = true + }; + }).DoConfigure(); + + return !isDisabled; + } public virtual IEnumerator LoadContentAsync() { SS2AssetRequest request = AssetRequest; diff --git a/SS2-Project/Assets/Starstorm2/ContentClasses/SS2Equipment.cs b/SS2-Project/Assets/Starstorm2/ContentClasses/SS2Equipment.cs index d8982814c..61866c8b9 100644 --- a/SS2-Project/Assets/Starstorm2/ContentClasses/SS2Equipment.cs +++ b/SS2-Project/Assets/Starstorm2/ContentClasses/SS2Equipment.cs @@ -44,8 +44,8 @@ public virtual bool IsAvailable(ContentPack conentPack) ConfiguredBool isDisabled = SS2Config.ConfigFactory.MakeConfiguredBool(false, b => { b.section = "00 - Equipment Disabling"; - b.key = $"Disable Eqipment: {MSUtil.NicifyString(GetType().Name)}"; - b.description = "Set this to true if you want to disable this eqipment from appearing in game."; + b.key = $"Disable Equipment: {MSUtil.NicifyString(GetType().Name)}"; + b.description = "Set this to true if you want to disable this equipment from appearing in game. Make sure everyone has this enabled or disabled in multiplayer otherwise desyncs could occur as this prevents the content from being loaded entirely. Restart required."; b.configFile = SS2Config.ConfigItem; b.checkBoxConfig = new CheckBoxConfig { diff --git a/SS2-Project/Assets/Starstorm2/ContentClasses/SS2Item.cs b/SS2-Project/Assets/Starstorm2/ContentClasses/SS2Item.cs index 4d7d3524c..00ac98d92 100644 --- a/SS2-Project/Assets/Starstorm2/ContentClasses/SS2Item.cs +++ b/SS2-Project/Assets/Starstorm2/ContentClasses/SS2Item.cs @@ -47,7 +47,7 @@ public virtual bool IsAvailable(ContentPack conentPack) { b.section = "00 - Item Disabling"; b.key = $"Disable Item: {MSUtil.NicifyString(GetType().Name)}"; - b.description = "Set this to true if you want to disable this item from appearing in game. Make sure everyone has this enabled or disabled in multiplayer otherwise desyncs could occur."; + b.description = "Set this to true if you want to disable this item from appearing in game. Make sure everyone has this enabled or disabled in multiplayer otherwise desyncs could occur as this prevents the content from being loaded entirely. Restart required."; b.configFile = SS2Config.ConfigItem; b.checkBoxConfig = new CheckBoxConfig { diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixPurple.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixPurple.cs index d0224db64..2bd550cc4 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixPurple.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixPurple.cs @@ -45,7 +45,10 @@ public override void Initialize() On.RoR2.GlobalEventManager.OnHitAllProcess += OnHitAllProcess; GlobalEventManager.onServerDamageDealt += OnServerDamageDealt; } - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public override bool Execute(EquipmentSlot slot) { return false; diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperEarth.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperEarth.cs index b2be2f5a2..651b12067 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperEarth.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperEarth.cs @@ -17,7 +17,10 @@ public override void Initialize() projectilePrefab = SS2Assets.LoadAsset("SuperEarthSunder", SS2Bundle.Equipments); } - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public override bool Execute(EquipmentSlot slot) { diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperFire.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperFire.cs index 350ea2d34..74be88880 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperFire.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperFire.cs @@ -16,7 +16,10 @@ public override void Initialize() projectilePrefab = SS2Assets.LoadAsset("SuperFireball", SS2Bundle.Equipments); } - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public override bool Execute(EquipmentSlot slot) { diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperIce.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperIce.cs index 7bba37af2..9c53eb96e 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperIce.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperIce.cs @@ -17,7 +17,10 @@ public override void Initialize() projectilePrefab = SS2Assets.LoadAsset("SuperIceMeteorPrediction", SS2Bundle.Equipments); } - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public override bool Execute(EquipmentSlot slot) { diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperLightning.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperLightning.cs index d10b586c0..d25d6e005 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperLightning.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/AffixSuperLightning.cs @@ -27,7 +27,10 @@ private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, R2API } } - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public override bool Execute(EquipmentSlot slot) { diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/SeismicOscillator.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/SeismicOscillator.cs index e230fc5e3..e17c7bc8f 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/SeismicOscillator.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Equipments/SeismicOscillator.cs @@ -18,7 +18,10 @@ public override void Initialize() { } - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public override bool Execute(EquipmentSlot slot) { var behaviour = slot.GetComponent(); diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/Bleedout.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/Bleedout.cs index 2c40a1f7a..eb730c726 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/Bleedout.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/Bleedout.cs @@ -8,7 +8,10 @@ namespace SS2.Items public sealed class Bleedout : SS2Item { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acBleedout", SS2Bundle.Items); - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public static DotController.DotIndex bleedout; public override void Initialize() diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/DebuffMissiles.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/DebuffMissiles.cs index be5d626fb..f0b7c86b0 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/DebuffMissiles.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/DebuffMissiles.cs @@ -11,7 +11,10 @@ namespace SS2.Items public sealed class DebuffMissiles : SS2Item { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acDebuffMissiles", SS2Bundle.Items); - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public static GameObject orbEffect; public static float healthDamage = .01f; public static float percentChancePerDebuff = 3f; diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/EliteDamageBonus.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/EliteDamageBonus.cs index 29fc296d7..b0ed2b5bb 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/EliteDamageBonus.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/EliteDamageBonus.cs @@ -12,7 +12,10 @@ namespace SS2.Items public sealed class EliteDamageBonus : SS2Item { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acEliteDamageBonus", SS2Bundle.Items); - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } static GameObject orbEffect; public override void Initialize() diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/HitList.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/HitList.cs index 05264af91..32435ae71 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/HitList.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/HitList.cs @@ -11,7 +11,10 @@ namespace SS2.Items public sealed class HitList : SS2Item // MAKE IT HIT LIST INSTEAD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acHitList", SS2Bundle.Items); - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } static GameObject orbEffect; static GameObject markEffect; public override void Initialize() diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnBossKill.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnBossKill.cs index b7a1eb8c9..f44e4f4c1 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnBossKill.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnBossKill.cs @@ -7,7 +7,10 @@ namespace SS2.Items public sealed class ItemOnBossKill : SS2Item { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("ItemOnBossKill", SS2Bundle.Items); - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } private static BossDropTable dropTable; private static Xoroshiro128Plus dropRng; public override void Initialize() diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnEliteKill.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnEliteKill.cs index 9f27f1eac..2e3377fef 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnEliteKill.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnEliteKill.cs @@ -7,7 +7,10 @@ namespace SS2.Items public sealed class ItemOnEliteKill : SS2Item { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("ItemOnEliteKill", SS2Bundle.Items); - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } private static BasicPickupDropTable dropTable; private static Xoroshiro128Plus dropRng; public override void Initialize() diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/MaxHpOnKill.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/MaxHpOnKill.cs index c0d8e6cc5..b65983c60 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/MaxHpOnKill.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/MaxHpOnKill.cs @@ -64,7 +64,10 @@ namespace SS2.Items public sealed class MaxHpOnKill : SS2Item { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acMaxHpOnKill", SS2Bundle.Items); - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public static GameObject orbEffect; public override void Initialize() { diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ScrapFromChest.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ScrapFromChest.cs index 4a99c6b34..053b0f6f8 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ScrapFromChest.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ScrapFromChest.cs @@ -11,7 +11,10 @@ namespace SS2.Items public sealed class ScrapFromChest : SS2Item { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("ScrapFromChest", SS2Bundle.Items); - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public override void Initialize() { diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardGold.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardGold.cs index edecc6734..74d107995 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardGold.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardGold.cs @@ -55,6 +55,9 @@ private void SpawnGoldShard(On.RoR2.HalcyoniteShrineInteractable.orig_DropReward } } - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardPoison.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardPoison.cs index 721978b6d..b70bf34fd 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardPoison.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardPoison.cs @@ -13,6 +13,9 @@ public override void Initialize() { } - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardScav.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardScav.cs index f27aabf61..f36e56981 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardScav.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardScav.cs @@ -15,6 +15,9 @@ public override void Initialize() { } - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardStorm.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardStorm.cs index 39c0dbd61..04cf277fa 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardStorm.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardStorm.cs @@ -15,6 +15,9 @@ public override void Initialize() { } - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardVoid.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardVoid.cs index 613b6cf47..27cf57596 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardVoid.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShardVoid.cs @@ -47,6 +47,9 @@ private void SpawnVoidShard(On.EntityStates.VoidCamp.Deactivate.orig_OnEnter ori } - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShellPiece.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShellPiece.cs index 952c68950..25e4f70d1 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShellPiece.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShellPiece.cs @@ -8,7 +8,10 @@ namespace SS2.Items public sealed class ShellPiece : SS2Item { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acShellPiece", SS2Bundle.Items); - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public override void Initialize() { On.RoR2.CharacterMaster.OnServerStageBegin += OnServerStageBegin; diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShieldGate.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShieldGate.cs index aa8ba6e45..bb3cd3ea5 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShieldGate.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ShieldGate.cs @@ -9,7 +9,10 @@ namespace SS2.Items public sealed class ShieldGate : SS2Item { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acShieldGate", SS2Bundle.Items); - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public static GameObject orbEffect; public override void Initialize() { diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/SnakeEyes.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/SnakeEyes.cs index 21c6c2409..4adcf3e78 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/SnakeEyes.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/SnakeEyes.cs @@ -11,7 +11,10 @@ namespace SS2.Items public sealed class SnakeEyes : SS2Item { public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acSnakeEyes", SS2Bundle.Items); - public override bool IsAvailable(ContentPack contentPack) => SS2Config.enableBeta; + public override bool IsAvailable(ContentPack contentPack) + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public static GameObject orbEffect; public override void Initialize() { diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/BlastKnuckles.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/BlastKnuckles.cs index e72d6690b..71822946c 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/BlastKnuckles.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/BlastKnuckles.cs @@ -83,9 +83,9 @@ private void OnHitEnemy(On.RoR2.GlobalEventManager.orig_ProcessHitEnemy orig, Gl } public override bool IsAvailable(ContentPack contentPack) - { - return SS2Config.enableBeta; - } + { + return SS2Config.enableBeta && base.IsAvailable(contentPack); + } public class BlastKnucklesBehavior : BaseItemBodyBehavior { diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/RainbowRoot.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/RainbowRoot.cs index f7aed960f..d5d8900ff 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/RainbowRoot.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/RainbowRoot.cs @@ -34,7 +34,7 @@ public override void Initialize() public override bool IsAvailable(ContentPack contentPack) { - return SS2Config.enableBeta; + return SS2Config.enableBeta && base.IsAvailable(contentPack); } public sealed class RootBehavior : BaseItemBodyBehavior, IOnTakeDamageServerReceiver From 7809cecbc56e39a7530bac7f8154b4e359224ff7 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sat, 18 Apr 2026 22:04:44 -0700 Subject: [PATCH 20/68] knight finally has a drop pod --- .../Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs index 16c85e8d0..c9aa68229 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs @@ -77,7 +77,7 @@ public override void Initialize() KnightImpactEffect = Addressables.LoadAssetAsync("RoR2/Base/Bandit2/Bandit2SmokeBomb.prefab").WaitForCompletion(); KnightCrosshair = Addressables.LoadAssetAsync("RoR2/Base/UI/SimpleDotCrosshair.prefab").WaitForCompletion(); - KnightDroppod = Addressables.LoadAssetAsync("Prefabs/NetworkedObjects/SurvivorPod").WaitForCompletion(); + KnightDroppod = Addressables.LoadAssetAsync("RoR2/Base/SurvivorPod/SurvivorPod.prefab").WaitForCompletion(); ExtendedStunDamageType = R2API.DamageAPI.ReserveDamageType(); Smite = R2API.ProcTypeAPI.ReserveProcType(); From e72ec188aa7020c51aa0a64f6b65b8d61ccdf07b Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sat, 18 Apr 2026 22:25:09 -0700 Subject: [PATCH 21/68] why unlock all no work?? --- .../Modules/Unlockables/Unlockables.cs | 80 ++++++++++++++++--- 1 file changed, 68 insertions(+), 12 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs b/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs index c0abde186..97fa73984 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs @@ -9,39 +9,95 @@ public static class UnlockAllHandler internal static void Init() { + SS2Log.Info($"UnlockAllHandler.Init() called. unlockAll value = {SS2Config.unlockAll.value}"); + if (!SS2Config.unlockAll.value) return; - UnlockableCatalog.availability.onAvailable += BuildCacheAndHook; + SS2Log.Info("UnlockAllHandler: Installing hooks..."); + On.RoR2.UserProfile.HasUnlockable_UnlockableDef += ForceHasUnlockable; + On.RoR2.UserProfile.HasSurvivorUnlocked += ForceHasSurvivorUnlocked; } - private static void BuildCacheAndHook() + private static void BuildCache() { ss2Unlockables = new HashSet(); - var unlockables = SS2Content.SS2ContentPack.unlockableDefs; - for (int i = 0; i < unlockables.Length; i++) + var contentPack = SS2Content.SS2ContentPack; + + SS2Log.Info($"UnlockAllHandler.BuildCache: itemDefs={contentPack.itemDefs.Length}, equipmentDefs={contentPack.equipmentDefs.Length}, survivorDefs={contentPack.survivorDefs.Length}, skillDefs={contentPack.skillDefs.Length}, artifactDefs={contentPack.artifactDefs.Length}, unlockableDefs={contentPack.unlockableDefs.Length}"); + + for (int i = 0; i < contentPack.itemDefs.Length; i++) { - UnlockableDef def = unlockables[i]; - if (def == null) continue; + var def = contentPack.itemDefs[i]; + if (def && def.unlockableDef) + ss2Unlockables.Add(def.unlockableDef); + } + for (int i = 0; i < contentPack.equipmentDefs.Length; i++) + { + var def = contentPack.equipmentDefs[i]; + if (def && def.unlockableDef) + ss2Unlockables.Add(def.unlockableDef); + } + for (int i = 0; i < contentPack.survivorDefs.Length; i++) + { + var def = contentPack.survivorDefs[i]; + if (def && def.unlockableDef) + { + SS2Log.Info($" Survivor '{def.cachedName}' has unlockableDef '{def.unlockableDef.cachedName}'"); + ss2Unlockables.Add(def.unlockableDef); + } + } + for (int i = 0; i < contentPack.skillDefs.Length; i++) + { + var def = contentPack.skillDefs[i]; + if (def && def.unlockableDef) + ss2Unlockables.Add(def.unlockableDef); + } + for (int i = 0; i < contentPack.artifactDefs.Length; i++) + { + var def = contentPack.artifactDefs[i]; + if (def && def.unlockableDef) + ss2Unlockables.Add(def.unlockableDef); + } - // skip skins we want players to still earn those + for (int i = 0; i < contentPack.unlockableDefs.Length; i++) + { + var def = contentPack.unlockableDefs[i]; + if (def == null) continue; if (def.cachedName.IndexOf("skin", System.StringComparison.OrdinalIgnoreCase) >= 0) continue; - ss2Unlockables.Add(def); } - On.RoR2.UserProfile.HasUnlockable_UnlockableDef += ForceHasUnlockable; - SS2Log.Info($"UnlockAllHandler: Forcing {ss2Unlockables.Count} SS2 unlockables as unlocked (skins excluded)."); + SS2Log.Info($"UnlockAllHandler: Built cache with {ss2Unlockables.Count} SS2 unlockables (skins excluded)."); } private static bool ForceHasUnlockable(On.RoR2.UserProfile.orig_HasUnlockable_UnlockableDef orig, UserProfile self, UnlockableDef unlockableDef) { - if (unlockableDef != null && ss2Unlockables.Contains(unlockableDef)) - return true; + if (unlockableDef != null) + { + if (ss2Unlockables == null) + BuildCache(); + if (ss2Unlockables.Contains(unlockableDef)) + return true; + } return orig(self, unlockableDef); } + + private static bool ForceHasSurvivorUnlocked(On.RoR2.UserProfile.orig_HasSurvivorUnlocked orig, UserProfile self, SurvivorIndex survivorIndex) + { + SurvivorDef survivorDef = SurvivorCatalog.GetSurvivorDef(survivorIndex); + if (survivorDef != null && survivorDef.unlockableDef != null) + { + if (ss2Unlockables == null) + BuildCache(); + + if (ss2Unlockables.Contains(survivorDef.unlockableDef)) + return true; + } + return orig(self, survivorIndex); + } } } From 74a6491e08d78d7c17a5fe82ea91217020efcc18 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sat, 18 Apr 2026 23:15:08 -0700 Subject: [PATCH 22/68] attempt to fix lampbeam and lamp commands --- .../Modules/Characters/Monsters/Lamp.cs | 36 ++++++++++++++++++ .../Modules/Characters/Monsters/LampBoss.cs | 38 +++++++++++++++++++ .../Modules/EntityStates/Lamp/HealBeam.cs | 32 ++++++++++------ 3 files changed, 95 insertions(+), 11 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs index f57e95351..08814d650 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs @@ -4,6 +4,7 @@ using RoR2.ContentManagement; using System.Collections; using UnityEngine; +using UnityEngine.Networking; namespace SS2.Monsters { public sealed class Lamp : SS2Monster @@ -18,5 +19,40 @@ public override void Initialize() _masterPrefab = AssetCollection.FindAsset("LampMaster"); RoR2Application.onLoad += () => BodyIndex = BodyCatalog.FindBodyIndex("LampBody"); } + + [ConCommand(commandName = "spawn_lamp", flags = ConVarFlags.Cheat | ConVarFlags.ExecuteOnServer, helpText = "Spawns Lamp (Follower) enemies at the sender's position. Usage: spawn_lamp [count=3]")] + public static void CCSpawnLamp(ConCommandArgs args) + { + if (!NetworkServer.active) return; + + int count = args.TryGetArgInt(0) ?? 3; + + CharacterMaster master = args.GetSenderMaster(); + if (!master || !master.GetBody()) + { + SS2Log.Error("spawn_lamp: No valid body found."); + return; + } + + if (!_masterPrefab) + { + SS2Log.Error("spawn_lamp: LampMaster prefab not loaded."); + return; + } + + Vector3 position = master.GetBody().footPosition; + for (int i = 0; i < count; i++) + { + MasterSummon summon = new MasterSummon + { + masterPrefab = _masterPrefab, + position = position + Vector3.up * 2f + Random.insideUnitSphere * 3f, + rotation = Quaternion.identity, + teamIndexOverride = TeamIndex.Monster + }; + summon.Perform(); + } + SS2Log.Info($"spawn_lamp: Spawned {count} Lamp(s)."); + } } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs index 3e8270322..f2f23cc21 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs @@ -5,6 +5,7 @@ using System; using System.Collections; using UnityEngine; +using UnityEngine.Networking; using RoR2.CameraModes; using System.Reflection; using static RoR2.ExplicitPickupDropTable; @@ -16,10 +17,12 @@ public sealed class LampBoss : SS2Monster public static BodyIndex BodyIndex; public static GameObject lampBuffEffectPrefab; + public static GameObject _masterPrefab; public override void Initialize() { lampBuffEffectPrefab = SS2Assets.LoadAsset("LampBuffEffect", SS2Bundle.Monsters); + _masterPrefab = AssetCollection.masterPrefab; RoR2Application.onLoad += () => BodyIndex = BodyCatalog.FindBodyIndex("LampBossBody"); R2API.RecalculateStatsAPI.GetStatCoefficients += GetStatCoefficients; On.RoR2.CameraModes.CameraModeBase.ApplyLookInput += CameraModeBase_ApplyLookInput; @@ -118,5 +121,40 @@ public class PhaseData { public string phase; } + + [ConCommand(commandName = "spawn_lampboss", flags = ConVarFlags.Cheat | ConVarFlags.ExecuteOnServer, helpText = "Spawns LampBoss enemies at the sender's position. Usage: spawn_lampboss [count=1]")] + public static void CCSpawnLampBoss(ConCommandArgs args) + { + if (!NetworkServer.active) return; + + int count = args.TryGetArgInt(0) ?? 1; + + CharacterMaster master = args.GetSenderMaster(); + if (!master || !master.GetBody()) + { + SS2Log.Error("spawn_lampboss: No valid body found."); + return; + } + + if (!_masterPrefab) + { + SS2Log.Error("spawn_lampboss: LampBossMaster prefab not loaded."); + return; + } + + Vector3 position = master.GetBody().footPosition; + for (int i = 0; i < count; i++) + { + MasterSummon summon = new MasterSummon + { + masterPrefab = _masterPrefab, + position = position + Vector3.up * 3f + Random.insideUnitSphere * 5f, + rotation = Quaternion.identity, + teamIndexOverride = TeamIndex.Monster + }; + summon.Perform(); + } + SS2Log.Info($"spawn_lampboss: Spawned {count} LampBoss(es)."); + } } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Lamp/HealBeam.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Lamp/HealBeam.cs index 8d7cdc106..868c6b289 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Lamp/HealBeam.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Lamp/HealBeam.cs @@ -264,6 +264,7 @@ protected void Lifto(HurtBox hurtBox) if (healthComponent && healthComponent.body && hurtBox.transform) { CharacterMotor characterMotor = healthComponent.body.characterMotor; + bool hasAuthority = healthComponent.body.hasEffectiveAuthority; Vector3 between = hurtBox.transform.position - transform.position; float heightDiff = Mathf.Abs(between.y); @@ -273,34 +274,43 @@ protected void Lifto(HurtBox hurtBox) float forceCoefficient = Mathf.Clamp(heightDiff / maxHeightDiff, 1f, forceCoefficientAtMaxHeightDiff); Vector3 forceVector = forceDirection * forceMagnitude * forceCoefficient; - Vector3 currentVerticalVelocity = Vector3.zero; float mass = 0f; - bool useGravity = false; + Vector3 dampingForce = Vector3.zero; + if (characterMotor) { - useGravity = characterMotor.useGravity; - currentVerticalVelocity = Vector3.up * characterMotor.velocity.y; mass = characterMotor.mass; + // only apply velocity damping for server-authoritative bodies; + // for client bodies the server has stale velocity data which causes + // force oscillation and violent slamming + if (hasAuthority) + { + Vector3 currentVerticalVelocity = Vector3.up * characterMotor.velocity.y; + if (characterMotor.useGravity) + currentVerticalVelocity.y += Physics.gravity.y * Time.fixedDeltaTime; + dampingForce = currentVerticalVelocity * forceDamping * mass * forceCoefficient; + } } else { Rigidbody rigidbody = healthComponent.body.rigidbody; if (rigidbody) { - useGravity = rigidbody.useGravity; - currentVerticalVelocity = Vector3.up * rigidbody.velocity.y; mass = rigidbody.mass; + if (hasAuthority) + { + Vector3 currentVerticalVelocity = Vector3.up * rigidbody.velocity.y; + if (rigidbody.useGravity) + currentVerticalVelocity.y += Physics.gravity.y * Time.fixedDeltaTime; + dampingForce = currentVerticalVelocity * forceDamping * mass * forceCoefficient; + } } } - if (useGravity) - { - currentVerticalVelocity.y += Physics.gravity.y * Time.fixedDeltaTime; - } if (ignoreMass) { forceVector *= mass; } - healthComponent.TakeDamageForce(forceVector - currentVerticalVelocity * forceDamping * mass * forceCoefficient, true, false); + healthComponent.TakeDamageForce(forceVector - dampingForce, true, false); } } From fb851c3486ceb2a64816e710ebded28311b33f52 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sun, 19 Apr 2026 00:57:16 -0700 Subject: [PATCH 23/68] OpenSlow Curse fixes with scav bag --- .../Assets/Starstorm2/Modules/CurseManager.cs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/CurseManager.cs b/SS2-Project/Assets/Starstorm2/Modules/CurseManager.cs index 6afac1e47..f0573846c 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/CurseManager.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/CurseManager.cs @@ -435,7 +435,10 @@ private static void AddBuff(CharacterBody body, BuffDef buff, int count) // doing this in awake didnt work idk private static void ChestBehavior_Open(On.RoR2.ChestBehavior.orig_Open orig, ChestBehavior self) { - if (GetActiveCurseCount(CurseIndex.ChestTimer) > 0) + // only override vanilla chests, + // non-standard chests (scav bags, lunar chests, void cradles) have their own opening states and break if we replace them with OpeningSlow + if (GetActiveCurseCount(CurseIndex.ChestTimer) > 0 + && self.openState.stateType == typeof(EntityStates.Barrel.Opening)) { self.openState = openState; } @@ -525,10 +528,6 @@ private static void OnInteractionGlobal(Interactor interactor, IInteractable int } } - if(chestTimer > 0) - { - chestBehavior.openState = openState; - } } } @@ -607,6 +606,13 @@ public override void FixedUpdate() return; } } + // always clean up timer VFX on state exit, even if isChestOpened was never set + // I think void cradles drop rewards through OptionChestBehavior, not ChestBehavior.ItemDrop + public override void OnExit() + { + if (timerInstance) Destroy(timerInstance); + base.OnExit(); + } private float duration = 1f; } private class SkillDisableBehavior : MonoBehaviour From e961ea5f49045acdafd49de4b8261f682e83797a Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 01:19:04 -0700 Subject: [PATCH 24/68] cyborg missing model skin controller on display prefab maybe is the issue? --- .../Characters/Cyborg2/Cyborg2Display.prefab | 25 +++++++++++++++++++ .../ContentClasses/SS2EliteEquipment.cs | 2 ++ .../Modules/Characters/Monsters/LampBoss.cs | 2 +- .../Modules/Unlockables/Unlockables.cs | 13 +++++----- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab index 1c08581f5..7602b3e48 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab @@ -933,3 +933,28 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: soundCenter: {fileID: 0} +--- !u!114 &2340112178752379690 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9176308721897938058} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: + m_EditorClassIdentifier: + DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 + _animatorControllerAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _animatorController: {fileID: 0} + _avatarAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _avatar: {fileID: 0} + skins: [] + prefabInstantiationDatas: [] diff --git a/SS2-Project/Assets/Starstorm2/ContentClasses/SS2EliteEquipment.cs b/SS2-Project/Assets/Starstorm2/ContentClasses/SS2EliteEquipment.cs index 2b718437a..5509bb24b 100644 --- a/SS2-Project/Assets/Starstorm2/ContentClasses/SS2EliteEquipment.cs +++ b/SS2-Project/Assets/Starstorm2/ContentClasses/SS2EliteEquipment.cs @@ -8,6 +8,8 @@ using System.Threading.Tasks; using UnityEngine; using RoR2.ContentManagement; +using MSU.Config; +using RiskOfOptions.OptionConfigs; namespace SS2 { diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs index f2f23cc21..3f6d6b02d 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs @@ -148,7 +148,7 @@ public static void CCSpawnLampBoss(ConCommandArgs args) MasterSummon summon = new MasterSummon { masterPrefab = _masterPrefab, - position = position + Vector3.up * 3f + Random.insideUnitSphere * 5f, + position = position + Vector3.up * 3f + UnityEngine.Random.insideUnitSphere * 5f, rotation = Quaternion.identity, teamIndexOverride = TeamIndex.Monster }; diff --git a/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs b/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs index 97fa73984..f6f7b74e1 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs @@ -48,12 +48,13 @@ private static void BuildCache() ss2Unlockables.Add(def.unlockableDef); } } - for (int i = 0; i < contentPack.skillDefs.Length; i++) - { - var def = contentPack.skillDefs[i]; - if (def && def.unlockableDef) - ss2Unlockables.Add(def.unlockableDef); - } + // TODO: WWoops + //for (int i = 0; i < contentPack.skillDefs.Length; i++) + //{ + // var def = contentPack.skillDefs[i]; + // if (def && def.unlockableDef) + // ss2Unlockables.Add(def.unlockableDef); + //} for (int i = 0; i < contentPack.artifactDefs.Length; i++) { var def = contentPack.artifactDefs[i]; From 161f1cef6f9cdb171dd725c2c47f62e6e9f7093d Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sun, 19 Apr 2026 01:25:10 -0700 Subject: [PATCH 25/68] shock mine fix attempt --- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 3 +++ .../Components/Borg/ProjectileRemoteDetonator.cs | 8 ++++++++ .../Starstorm2/Components/Borg/TeleporterProjectile.cs | 8 ++++++++ .../Modules/EntityStates/Cyborg2/ShockMine/Burrow.cs | 6 ++++-- .../Modules/EntityStates/Cyborg2/ShockMine/Expire.cs | 5 ++--- .../Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs | 6 +++--- .../Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs | 4 +++- .../EntityStates/Cyborg2/ShockMine/WaitForStick.cs | 6 ++++-- .../EntityStates/Cyborg2/ShockMine/WaitForTarget.cs | 2 +- 9 files changed, 36 insertions(+), 12 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index 87f97b026..739d6291b 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -1,4 +1,7 @@ **Warning: content spoilers below!** +### 0.6.XX +* General +* Beta ### 0.6.36 buns wheres the changelogs * General diff --git a/SS2-Project/Assets/Starstorm2/Components/Borg/ProjectileRemoteDetonator.cs b/SS2-Project/Assets/Starstorm2/Components/Borg/ProjectileRemoteDetonator.cs index ae844c61f..5fbe58fb5 100644 --- a/SS2-Project/Assets/Starstorm2/Components/Borg/ProjectileRemoteDetonator.cs +++ b/SS2-Project/Assets/Starstorm2/Components/Borg/ProjectileRemoteDetonator.cs @@ -72,6 +72,14 @@ public void UnsetOverride() Destroy(this); } + private void OnDestroy() + { + if (this.skillLocator) + { + this.skillLocator.special.UnsetSkillOverride(this, detonateSkillDef, GenericSkill.SkillOverridePriority.Contextual); + } + } + private void FixedUpdate() { if (!this.projectile) diff --git a/SS2-Project/Assets/Starstorm2/Components/Borg/TeleporterProjectile.cs b/SS2-Project/Assets/Starstorm2/Components/Borg/TeleporterProjectile.cs index 6cab30741..ef7f9af41 100644 --- a/SS2-Project/Assets/Starstorm2/Components/Borg/TeleporterProjectile.cs +++ b/SS2-Project/Assets/Starstorm2/Components/Borg/TeleporterProjectile.cs @@ -139,6 +139,14 @@ public void UnsetOverride() Destroy(this); } + private void OnDestroy() + { + if (this.skillLocator) + { + this.skillLocator.utility.UnsetSkillOverride(this, teleportSkillDef, GenericSkill.SkillOverridePriority.Contextual); + } + } + private void FixedUpdate() { if(!this.teleporter) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Burrow.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Burrow.cs index 82549cbec..7d23ed831 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Burrow.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Burrow.cs @@ -1,4 +1,6 @@ -namespace EntityStates.Cyborg2.ShockMine +using UnityEngine.Networking; + +namespace EntityStates.Cyborg2.ShockMine { public class Burrow : BaseShockMineState { @@ -11,7 +13,7 @@ public override void OnEnter() public override void FixedUpdate() { base.FixedUpdate(); - if (base.isAuthority) + if (NetworkServer.active) { EntityState entityState = null; if (!base.projectileStickOnImpact.stuck) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Expire.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Expire.cs index 27a7d17a8..8c39d5bab 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Expire.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Expire.cs @@ -24,10 +24,9 @@ public override void OnEnter() origin = base.transform.position, }, true); } - } - - Destroy(base.gameObject); + Destroy(base.gameObject); + } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs index e1372870a..eef6c8855 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs @@ -33,6 +33,9 @@ public override void FixedUpdate() { base.FixedUpdate(); + if (!NetworkServer.active) + return; + base.rigidbody.velocity = Vector3.zero; this.shockTimer -= Time.fixedDeltaTime; @@ -52,9 +55,6 @@ public override void FixedUpdate() private void Shock() { - if (!NetworkServer.active) - return; - if (shockEffectPrefab) { EffectManager.SpawnEffect(shockEffectPrefab, new EffectData diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs index 7092e05da..eff855c28 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs @@ -1,4 +1,6 @@ using UnityEngine; +using UnityEngine.Networking; + namespace EntityStates.Cyborg2.ShockMine { public class Unburrow : BaseShockMineState @@ -15,7 +17,7 @@ public override void OnEnter() public override void FixedUpdate() { base.FixedUpdate(); - if (base.isAuthority) + if (NetworkServer.active) { if(base.fixedAge >= this.duration) { diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForStick.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForStick.cs index d0aa97397..ad084cc58 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForStick.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForStick.cs @@ -1,4 +1,6 @@ -namespace EntityStates.Cyborg2.ShockMine +using UnityEngine.Networking; + +namespace EntityStates.Cyborg2.ShockMine { public class WaitForStick : BaseShockMineState { @@ -9,7 +11,7 @@ public override void OnEnter() public override void FixedUpdate() { base.FixedUpdate(); - if (base.isAuthority && base.projectileStickOnImpact.stuck) + if (NetworkServer.active && base.projectileStickOnImpact.stuck) { this.outer.SetNextState(new Burrow()); } diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForTarget.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForTarget.cs index 68cf11928..ac9ff401f 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForTarget.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForTarget.cs @@ -20,7 +20,7 @@ public override void OnEnter() public override void FixedUpdate() { base.FixedUpdate(); - if (base.isAuthority) + if (NetworkServer.active) { EntityState entityState = null; if (!base.projectileStickOnImpact.stuck) From 61c448fd4a2fb40d0ae6d2a758b6d89ef2060e7d Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 01:30:32 -0700 Subject: [PATCH 26/68] unlockall wont work for skills for now, thats k with me --- .../Assets/Starstorm2/Modules/Unlockables/Unlockables.cs | 3 ++- SS2-Project/Assets/Starstorm2/SS2Config.cs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs b/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs index f6f7b74e1..8d1434181 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Unlockables/Unlockables.cs @@ -48,7 +48,8 @@ private static void BuildCache() ss2Unlockables.Add(def.unlockableDef); } } - // TODO: WWoops + // TODO: Have UnlockAll work for Skills too + // This is what happens when I code without Unity installed and then push this to my computer with Unity //for (int i = 0; i < contentPack.skillDefs.Length; i++) //{ // var def = contentPack.skillDefs[i]; diff --git a/SS2-Project/Assets/Starstorm2/SS2Config.cs b/SS2-Project/Assets/Starstorm2/SS2Config.cs index 8922dd9e3..72edf69b0 100644 --- a/SS2-Project/Assets/Starstorm2/SS2Config.cs +++ b/SS2-Project/Assets/Starstorm2/SS2Config.cs @@ -105,7 +105,7 @@ internal SS2Config(BaseUnityPlugin bup) { b.section = "General"; b.key = "Unlock All"; - b.description = "Unlocks all SS2 content (items, survivors, skills) without needing to complete achievements. Skins are excluded. Requires a restart to take effect."; + b.description = "Unlocks all SS2 content (items, and survivors) without needing to complete achievements. Skills and skins are excluded. Requires a restart to take effect."; b.configFile = SS2Config.ConfigMain; }).DoConfigure(); } From 11adb056b0c1f74cb1157af1e89c11d17f5a4976 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sun, 19 Apr 2026 01:39:35 -0700 Subject: [PATCH 27/68] harmless NRE on Ethreal when closing ror2 --- .../Starstorm2/Modules/RunBehaviors/EtherealBehavior.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/EtherealBehavior.cs b/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/EtherealBehavior.cs index a630881ed..67f226cfa 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/EtherealBehavior.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/EtherealBehavior.cs @@ -364,7 +364,12 @@ private static void ResetAll(Run obj) { foreach(EtherealDifficulty diff in instances) { - DifficultyCatalog.GetDifficultyDef(diff.index).scalingValue = diff.defaultScalingValue; + // DifficultyCatalog is null when closing RoR2, this is a harmless NRE, but good practice :) + DifficultyDef def = DifficultyCatalog.GetDifficultyDef(diff.index); + if (def != null) + def.scalingValue = diff.defaultScalingValue; + else + SS2Log.Warning($"EtherealDifficulty.ResetAll: DifficultyDef for index {diff.index} is null, catalog may be torn down."); } } public DifficultyIndex index; From de0a90296a8fce9193f12aeffa9a7877f4eb89cf Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sun, 19 Apr 2026 01:44:22 -0700 Subject: [PATCH 28/68] fix eth icon position --- .../Starstorm2/Components/TeleporterUpgradeController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs b/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs index f3352b0ae..b8cc45478 100644 --- a/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs +++ b/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs @@ -155,12 +155,12 @@ private void FixedUpdate() if (isEthereal) { - etherealIcon.transform.localPosition = position + Vector3.forward * z; + etherealIcon.transform.localPosition = position + Vector3.up * z; z += iconHeightOffset; } if (isStorm) { - stormIcon.transform.localPosition = position + Vector3.forward * z; + stormIcon.transform.localPosition = position + Vector3.up * z; z += iconHeightOffset; } } From 737cb71136103058406bb33d2a05b42d822e5f2c Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 09:46:32 -0700 Subject: [PATCH 29/68] put the spawn lamp commands behind debug builds only --- .../Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs | 3 +++ .../Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs index 08814d650..b9de1bc2d 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs @@ -20,6 +20,8 @@ public override void Initialize() RoR2Application.onLoad += () => BodyIndex = BodyCatalog.FindBodyIndex("LampBody"); } + // Shorthand dev command for testing since I am lazy + #if DEBUG [ConCommand(commandName = "spawn_lamp", flags = ConVarFlags.Cheat | ConVarFlags.ExecuteOnServer, helpText = "Spawns Lamp (Follower) enemies at the sender's position. Usage: spawn_lamp [count=3]")] public static void CCSpawnLamp(ConCommandArgs args) { @@ -54,5 +56,6 @@ public static void CCSpawnLamp(ConCommandArgs args) } SS2Log.Info($"spawn_lamp: Spawned {count} Lamp(s)."); } + #endif } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs index 3f6d6b02d..ac8f06f2b 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs @@ -122,6 +122,8 @@ public class PhaseData public string phase; } + // Shorthand dev command for testing since I am lazy + #if DEBUG [ConCommand(commandName = "spawn_lampboss", flags = ConVarFlags.Cheat | ConVarFlags.ExecuteOnServer, helpText = "Spawns LampBoss enemies at the sender's position. Usage: spawn_lampboss [count=1]")] public static void CCSpawnLampBoss(ConCommandArgs args) { @@ -156,5 +158,6 @@ public static void CCSpawnLampBoss(ConCommandArgs args) } SS2Log.Info($"spawn_lampboss: Spawned {count} LampBoss(es)."); } + #endif } } From dc878031375d01f68e646ebf39dbc27d6ca02a35 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sun, 19 Apr 2026 10:19:22 -0700 Subject: [PATCH 30/68] cyborg client tele bug and more shock mine --- .../Components/Borg/TeleporterProjectile.cs | 24 +++++++++++++++---- .../Cyborg2/ShockMine/BaseShockMineState.cs | 10 ++++++-- .../Cyborg2/ShockMine/ShockNearby.cs | 3 ++- .../Cyborg2/ShockMine/Unburrow.cs | 9 +++++-- .../Cyborg2/ShockMine/WaitForTarget.cs | 7 ++++-- .../Modules/EntityStates/Cyborg2/Teleport.cs | 5 ++-- 6 files changed, 44 insertions(+), 14 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Components/Borg/TeleporterProjectile.cs b/SS2-Project/Assets/Starstorm2/Components/Borg/TeleporterProjectile.cs index ef7f9af41..0dec4b720 100644 --- a/SS2-Project/Assets/Starstorm2/Components/Borg/TeleporterProjectile.cs +++ b/SS2-Project/Assets/Starstorm2/Components/Borg/TeleporterProjectile.cs @@ -5,6 +5,7 @@ using RoR2.Orbs; using System.Collections.Generic; using UnityEngine.Networking; +using SS2; namespace SS2.Components { public class TeleporterProjectile : MonoBehaviour @@ -21,13 +22,24 @@ public class TeleporterProjectile : MonoBehaviour private static float funnyNumber = 0.5f; void Start() { - this.controller = base.GetComponent(); + if (!base.TryGetComponent(out this.controller)) + { + SS2Log.Warning("TeleporterProjectile.Start: missing ProjectileController"); + return; + } this.owner = this.controller.owner; if(this.owner) { - this.ownership = this.owner.AddComponent(); + // TODO: This might be another issue but trying this for duplicate teleporters on client fix + // Reuse existing ownership component if one exists + // This prevents duplicate skill overrides when both prediction and authoritative + // copies of the projectile call Start() + if (!this.owner.TryGetComponent(out this.ownership)) + { + this.ownership = this.owner.AddComponent(); + } this.ownership.teleporter = this; - ownerBody = owner.GetComponent(); + this.owner.TryGetComponent(out ownerBody); } } @@ -112,7 +124,11 @@ public class ProjectileTeleporterOwnership : MonoBehaviour public static bool destroyOnFirstTeleport = true; private void Awake() { - this.body = base.GetComponent(); + if (!base.TryGetComponent(out this.body)) + { + SS2Log.Warning("ProjectileTeleporterOwnership.Awake: missing CharacterBody"); + return; + } this.teleportSkillDef = SS2Assets.LoadAsset("Cyborg2Teleport", SS2Bundle.Indev); if (this.body) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/BaseShockMineState.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/BaseShockMineState.cs index 209c04826..03dae9f29 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/BaseShockMineState.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/BaseShockMineState.cs @@ -1,4 +1,5 @@ using RoR2.Projectile; +using SS2; namespace EntityStates.Cyborg2.ShockMine { public class BaseShockMineState : BaseState @@ -9,8 +10,13 @@ public override void OnEnter() { base.OnEnter(); - this.projectileTargetComponent = base.GetComponent(); - this.projectileStickOnImpact = base.GetComponent(); + if (!base.TryGetComponent(out this.projectileTargetComponent)) + SS2Log.Warning("BaseShockMineState: missing ProjectileTargetComponent"); + if (!base.TryGetComponent(out this.projectileStickOnImpact)) + { + SS2Log.Warning("BaseShockMineState: missing ProjectileStickOnImpact"); + return; + } if (this.projectileStickOnImpact.enabled != this.shouldStick) { diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs index eef6c8855..0e71c7813 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs @@ -24,7 +24,8 @@ public override void OnEnter() { base.OnEnter(); - this.projectileDamage = base.GetComponent(); + if (!base.TryGetComponent(out this.projectileDamage)) + SS2Log.Warning("ShockNearby missing ProjectileDamage"); this.shockInterval = numShocks / baseDuration; } diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs index eff855c28..457aef6db 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs @@ -10,8 +10,13 @@ public override void OnEnter() base.OnEnter(); this.duration = Unburrow.baseDuration; - Vector3 upVelocity = Vector3.up * hopVelocity; - base.rigidbody.velocity = upVelocity;// base.transform.rotation * upVelocity; + // Only set velocity on server + // clients receive position via ProjectileNetworkTransform + if (NetworkServer.active) + { + Vector3 upVelocity = Vector3.up * hopVelocity; + base.rigidbody.velocity = upVelocity; + } } public override void FixedUpdate() diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForTarget.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForTarget.cs index ac9ff401f..82ba9ab5b 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForTarget.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForTarget.cs @@ -1,5 +1,6 @@ using RoR2.Projectile; using UnityEngine.Networking; +using SS2; namespace EntityStates.Cyborg2.ShockMine { @@ -12,8 +13,10 @@ public override void OnEnter() base.OnEnter(); if (NetworkServer.active) { - this.targetFinder = base.GetComponent(); - this.targetFinder.enabled = true; + if (base.TryGetComponent(out this.targetFinder)) + this.targetFinder.enabled = true; + else + SS2Log.Warning("WaitForTarget missing ProjectileSphereTargetFinder"); } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/Teleport.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/Teleport.cs index b7669b06a..ad55419b6 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/Teleport.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/Teleport.cs @@ -23,10 +23,9 @@ public override void OnEnter() { base.OnEnter(); - this.teleporterOwnership = base.GetComponent(); - if(!this.teleporterOwnership) + if (!base.TryGetComponent(out this.teleporterOwnership)) { - Debug.LogError("Cyborg2 teleport failed! No teleporter component. (howw?????)"); + SS2Log.Error("Cyborg2 teleport failed! No teleporter component."); this.outer.SetNextStateToMain(); return; } From 2e2126a406d0362cd24a2442fb1daad3a46ef74c Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sun, 19 Apr 2026 10:23:18 -0700 Subject: [PATCH 31/68] attempting to fix eth icon placement pt 2 --- .../Components/TeleporterUpgradeController.cs | 41 +++++++------------ 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs b/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs index b8cc45478..430edc0e9 100644 --- a/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs +++ b/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs @@ -134,35 +134,22 @@ private void FixedUpdate() { stormIcon.gameObject.SetActive(isStorm && !ti.isCharged); etherealIcon.gameObject.SetActive(isEthereal && !ti.isCharged); - Vector3 position = ti._bossShrineCounter.transform.localPosition; - float z = 0; - // Buns: Adding a cautious null check here post-AC since I dont understand how this code worked previously and dont - // wanna break someones game over an indicator error - if (position != null) - { - // Buns: The new bossShrineCounter added support for multiple indicators and removed activeSelf param - // Buns: idk if this will work but need to fix the compile error to get SS2 to work so YOLO - // TODO: Might be the source of a bug! - if (ti._bossShrineCounter.indicatorCount == 0) - { - z += iconHeightOffset; - } - else if (ti._bossShrineCounter.indicatorCount >= 1) - { - z += iconHeightOffset * ti._bossShrineCounter.indicatorCount; - } - if (isEthereal) - { - etherealIcon.transform.localPosition = position + Vector3.up * z; - z += iconHeightOffset; - } - if (isStorm) - { - stormIcon.transform.localPosition = position + Vector3.up * z; - z += iconHeightOffset; - } + Vector3 basePosition = teleBase.InverseTransformPoint( + ti._bossShrineCounter.targetTransform.position); + + // Stack SS2 icons above any existing mountain shrine indicators. + float y = iconHeightOffset * ti._bossShrineCounter.indicatorCount; + + if (isEthereal) + { + etherealIcon.transform.localPosition = basePosition + Vector3.up * y; + y += iconHeightOffset; + } + if (isStorm) + { + stormIcon.transform.localPosition = basePosition + Vector3.up * y; } } From e6dd197f0bf77aa856f941ed1350850c08ffec4c Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 11:55:57 -0700 Subject: [PATCH 32/68] give cyborg default skin in model skin controller --- .../Characters/Cyborg2/Cyborg2Body.prefab | 51 ++++++++++--------- .../Characters/Cyborg2/Cyborg2Display.prefab | 51 ++++++++++--------- .../Cyborg2/Projectiles/meshTeleporter.mesh | 1 + .../Cyborg2/SkinCyborgDefault.asset | 36 +++++++++++++ .../Cyborg2/SkinCyborgDefault.asset.meta | 8 +++ .../Characters/Cyborg2/meshBorgTele.mesh | 1 + 6 files changed, 98 insertions(+), 50 deletions(-) create mode 100644 SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset create mode 100644 SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset.meta diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab index 07df425f7..c4e96fed2 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab @@ -1748,6 +1748,32 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: soundCenter: {fileID: 0} +--- !u!114 &7060471386824513616 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5008875975933509408} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: + m_EditorClassIdentifier: + DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 + _animatorControllerAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _animatorController: {fileID: 0} + _avatarAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _avatar: {fileID: 0} + skins: + - {fileID: 11400000, guid: a38e0ea4218dc9e4bb177461ead40ffc, type: 2} + prefabInstantiationDatas: [] --- !u!114 &7720387413032466013 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1793,31 +1819,6 @@ MonoBehaviour: oldHeal: 0 oldFade: 0 forceUpdate: 0 ---- !u!114 &7060471386824513616 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5008875975933509408} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} - m_Name: - m_EditorClassIdentifier: - DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 - _animatorControllerAddress: - m_AssetGUID: - m_SubObjectName: - m_SubObjectType: - _animatorController: {fileID: 0} - _avatarAddress: - m_AssetGUID: - m_SubObjectName: - m_SubObjectType: - _avatar: {fileID: 0} - skins: [] - prefabInstantiationDatas: [] --- !u!4 &5677010006892963226 stripped Transform: m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 577b3c79db118904c8eda5144dd41024, diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab index 7602b3e48..8eb6a15ca 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab @@ -812,6 +812,32 @@ MonoBehaviour: transform: {fileID: 7715746942834777419} - name: MuzzleLaser transform: {fileID: 7536965916930200193} +--- !u!114 &2340112178752379690 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9176308721897938058} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: + m_EditorClassIdentifier: + DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 + _animatorControllerAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _animatorController: {fileID: 0} + _avatarAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _avatar: {fileID: 0} + skins: + - {fileID: 11400000, guid: a38e0ea4218dc9e4bb177461ead40ffc, type: 2} + prefabInstantiationDatas: [] --- !u!114 &2666917881116076054 MonoBehaviour: m_ObjectHideFlags: 0 @@ -933,28 +959,3 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: soundCenter: {fileID: 0} ---- !u!114 &2340112178752379690 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9176308721897938058} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} - m_Name: - m_EditorClassIdentifier: - DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 - _animatorControllerAddress: - m_AssetGUID: - m_SubObjectName: - m_SubObjectType: - _animatorController: {fileID: 0} - _avatarAddress: - m_AssetGUID: - m_SubObjectName: - m_SubObjectType: - _avatar: {fileID: 0} - skins: [] - prefabInstantiationDatas: [] diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Projectiles/meshTeleporter.mesh b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Projectiles/meshTeleporter.mesh index c611741c2..165bcbbcc 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Projectiles/meshTeleporter.mesh +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Projectiles/meshTeleporter.mesh @@ -232,6 +232,7 @@ Mesh: m_MeshMetrics[1]: 1 m_MeshOptimizationFlags: -1 m_StreamData: + serializedVersion: 2 offset: 0 size: 0 path: diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset new file mode 100644 index 000000000..8e13ad4ec --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1255927399, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: SkinCyborgDefault + m_EditorClassIdentifier: + baseSkins: [] + icon: {fileID: 21300000, guid: 569d613e909cca4429fa126c8fc9f44e, type: 3} + nameToken: SS2_SKIN_CYBORG_DEFAULT + unlockableName: + unlockableDef: {fileID: 0} + rootObject: {fileID: 919132149155446097, guid: 577b3c79db118904c8eda5144dd41024, + type: 3} + skinDefParamsAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + skinDefParams: {fileID: 0} + optimizedSkinDefParamsAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + optimizedSkinDefParams: {fileID: 0} + rendererInfos: [] + gameObjectActivations: [] + meshReplacements: [] + projectileGhostReplacements: [] + minionSkinReplacements: [] diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset.meta b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset.meta new file mode 100644 index 000000000..668e94a8a --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a38e0ea4218dc9e4bb177461ead40ffc +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/meshBorgTele.mesh b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/meshBorgTele.mesh index b6baaccd0..9b99d41e2 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/meshBorgTele.mesh +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/meshBorgTele.mesh @@ -322,6 +322,7 @@ Mesh: m_MeshMetrics[1]: 1 m_MeshOptimizationFlags: -1 m_StreamData: + serializedVersion: 2 offset: 0 size: 0 path: From 84ce48d477eaa5a8cf4386bc0c4856330e328944 Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 13:09:23 -0700 Subject: [PATCH 33/68] wrong root object for skin I think --- .../AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset index 8e13ad4ec..e2c154882 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/SkinCyborgDefault.asset @@ -17,7 +17,7 @@ MonoBehaviour: nameToken: SS2_SKIN_CYBORG_DEFAULT unlockableName: unlockableDef: {fileID: 0} - rootObject: {fileID: 919132149155446097, guid: 577b3c79db118904c8eda5144dd41024, + rootObject: {fileID: 5008875975933509408, guid: 8a7e1fdc0e7e91d4ba7d7e0cf4707cec, type: 3} skinDefParamsAddress: m_AssetGUID: From 45f98db6325791d777ba0433c840205b2110304c Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 14:24:37 -0700 Subject: [PATCH 34/68] modelskincontroller in wrong place and skindef missing from asset collection --- .../Characters/Cyborg2/Cyborg2Body.prefab | 89 +- .../Characters/Cyborg2/Cyborg2Display.prefab | 89 +- .../InDev/Characters/Cyborg2/acCyborg2.asset | 1 + .../AddressablesPathDictionary.asset | 1430 +---------------- 4 files changed, 129 insertions(+), 1480 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab index c4e96fed2..592e0d96e 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab @@ -37,6 +37,8 @@ GameObject: - component: {fileID: 8467841194318990007} - component: {fileID: 4269496153077987429} - component: {fileID: 1004718732815417702} + - component: {fileID: 3736198632451785268} + - component: {fileID: 5464692534816640513} m_Layer: 0 m_Name: Cyborg2Body m_TagString: Player @@ -749,6 +751,67 @@ MonoBehaviour: canBeFrozen: 1 isFrozen: 1 canBeTaunted: 1 +--- !u!114 &3736198632451785268 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2260960647979714696} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1143142494, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: + m_EditorClassIdentifier: + body: {fileID: 0} + itemDisplayRuleSet: {fileID: 0} + autoPopulateLightInfos: 1 + gameObjectActivationTransforms: [] + customGameObjectActivationTransforms: [] + baseRendererInfos: [] + fullBodyPing: 0 + baseLightInfos: [] + constraintItemDisplaysScale: 0 + ignoreJitterBones: 0 + corpseFade: 1 + speedFade: 1 + CharacterOnScreen: 0 + visibilityChecker: {fileID: 0} + useHullForFadeCalc: 0 + activeOverlays: 0 + oldOverlays: 0 + hitFlashValue: 0 + healFlashValue: 0 + oldHit: 0 + oldHeal: 0 + oldFade: 0 + forceUpdate: 0 +--- !u!114 &5464692534816640513 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2260960647979714696} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: + m_EditorClassIdentifier: + DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 + _animatorControllerAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _animatorController: {fileID: 0} + _avatarAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _avatar: {fileID: 0} + skins: + - {fileID: 11400000, guid: a38e0ea4218dc9e4bb177461ead40ffc, type: 2} + prefabInstantiationDatas: [] --- !u!1 &4426841502502991441 GameObject: m_ObjectHideFlags: 0 @@ -1748,32 +1811,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: soundCenter: {fileID: 0} ---- !u!114 &7060471386824513616 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5008875975933509408} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} - m_Name: - m_EditorClassIdentifier: - DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 - _animatorControllerAddress: - m_AssetGUID: - m_SubObjectName: - m_SubObjectType: - _animatorController: {fileID: 0} - _avatarAddress: - m_AssetGUID: - m_SubObjectName: - m_SubObjectType: - _avatar: {fileID: 0} - skins: - - {fileID: 11400000, guid: a38e0ea4218dc9e4bb177461ead40ffc, type: 2} - prefabInstantiationDatas: [] --- !u!114 &7720387413032466013 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab index 8eb6a15ca..25136dd46 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab @@ -40,6 +40,8 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 2942509041794450991} + - component: {fileID: 6460089162439241661} + - component: {fileID: 3979966911097047151} m_Layer: 0 m_Name: Cyborg2Display m_TagString: Untagged @@ -63,6 +65,67 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6460089162439241661 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8308556267028715609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1143142494, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: + m_EditorClassIdentifier: + body: {fileID: 0} + itemDisplayRuleSet: {fileID: 0} + autoPopulateLightInfos: 1 + gameObjectActivationTransforms: [] + customGameObjectActivationTransforms: [] + baseRendererInfos: [] + fullBodyPing: 0 + baseLightInfos: [] + constraintItemDisplaysScale: 0 + ignoreJitterBones: 0 + corpseFade: 1 + speedFade: 1 + CharacterOnScreen: 0 + visibilityChecker: {fileID: 0} + useHullForFadeCalc: 0 + activeOverlays: 0 + oldOverlays: 0 + hitFlashValue: 0 + healFlashValue: 0 + oldHit: 0 + oldHeal: 0 + oldFade: 0 + forceUpdate: 0 +--- !u!114 &3979966911097047151 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8308556267028715609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: + m_EditorClassIdentifier: + DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 + _animatorControllerAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _animatorController: {fileID: 0} + _avatarAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _avatar: {fileID: 0} + skins: + - {fileID: 11400000, guid: a38e0ea4218dc9e4bb177461ead40ffc, type: 2} + prefabInstantiationDatas: [] --- !u!1001 &8329871487314338267 PrefabInstance: m_ObjectHideFlags: 0 @@ -812,32 +875,6 @@ MonoBehaviour: transform: {fileID: 7715746942834777419} - name: MuzzleLaser transform: {fileID: 7536965916930200193} ---- !u!114 &2340112178752379690 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9176308721897938058} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} - m_Name: - m_EditorClassIdentifier: - DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 - _animatorControllerAddress: - m_AssetGUID: - m_SubObjectName: - m_SubObjectType: - _animatorController: {fileID: 0} - _avatarAddress: - m_AssetGUID: - m_SubObjectName: - m_SubObjectType: - _avatar: {fileID: 0} - skins: - - {fileID: 11400000, guid: a38e0ea4218dc9e4bb177461ead40ffc, type: 2} - prefabInstantiationDatas: [] --- !u!114 &2666917881116076054 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/acCyborg2.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/acCyborg2.asset index e8f1d1d04..a416f6bee 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/acCyborg2.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/acCyborg2.asset @@ -58,6 +58,7 @@ MonoBehaviour: - {fileID: 11400000, guid: 851f4b4fde9c1354c917bec6c902c55a, type: 2} - {fileID: 11400000, guid: 4525a9086c2bce84fb7ff50069a181cf, type: 2} - {fileID: 11400000, guid: 65ff2e6eb0a0cf04f95ff02e0dc67ed8, type: 2} + - {fileID: 11400000, guid: a38e0ea4218dc9e4bb177461ead40ffc, type: 2} bodyPrefab: {fileID: 2260960647979714696, guid: 8a7e1fdc0e7e91d4ba7d7e0cf4707cec, type: 3} masterPrefab: {fileID: 0} diff --git a/SS2-Project/ProjectSettings/RoR2EditorKit/AddressablesPathDictionary.asset b/SS2-Project/ProjectSettings/RoR2EditorKit/AddressablesPathDictionary.asset index f8a3207ec..f04096078 100644 --- a/SS2-Project/ProjectSettings/RoR2EditorKit/AddressablesPathDictionary.asset +++ b/SS2-Project/ProjectSettings/RoR2EditorKit/AddressablesPathDictionary.asset @@ -12,1431 +12,5 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2c7dca0c3ef5c934fb4caac6d2d1a0da, type: 3} m_Name: m_EditorClassIdentifier: - _fileDateTimeTicks: 639023814771897348 - _serializedTypeResultCache: - - cacheKey: - requiredType: - assemblyQualifiedName: RoR2.ItemDisplay, RoR2, Version=0.0.0.0, Culture=neutral, - PublicKeyToken=null - entriesIncludeComponentFoundInChildren: 0 - cacheHit: - pathCache: - - RoR2/Base/AlienHead/DisplayAlienHead.prefab - - RoR2/Base/ArmorPlate/DisplayRepulsionArmorPlate.prefab - - RoR2/Base/ArmorReductionOnHit/DisplayWarhammer.prefab - - RoR2/Base/AttackSpeedOnCrit/DisplayWolfPelt.prefab - - RoR2/Base/AutoCastEquipment/DisplayFossil.prefab - - RoR2/Base/Bandolier/DisplayBandolier.prefab - - RoR2/Base/BarrierOnKill/DisplayBrooch.prefab - - RoR2/Base/BarrierOnOverHeal/DisplayAegis.prefab - - RoR2/Base/Bear/DisplayBear.prefab - - RoR2/Base/Bear/DisplayBearSit.prefab - - RoR2/Base/BeetleGland/DisplayBeetleGland.prefab - - RoR2/Base/Behemoth/DisplayBehemoth.prefab - - RoR2/Base/BFG/DisplayBFG.prefab - - RoR2/Base/Blackhole/DisplayGravCube.prefab - - RoR2/Base/BleedOnHit/DisplayTriTip.prefab - - RoR2/Base/BleedOnHitAndExplode/DisplayBleedOnHitAndExplode.prefab - - RoR2/Base/BonusGoldPackOnKill/DisplayTome.prefab - - RoR2/Base/BossDamageBonus/DisplayAPRound.prefab - - RoR2/Base/BounceNearby/DisplayHook.prefab - - RoR2/Base/Brother/ItemInfection, Blue.prefab - - RoR2/Base/Brother/ItemInfection, Boss.prefab - - RoR2/Base/Brother/ItemInfection, Food.prefab - - RoR2/Base/Brother/ItemInfection, Green.prefab - - RoR2/Base/Brother/ItemInfection, Red.prefab - - RoR2/Base/Brother/ItemInfection, Void.prefab - - RoR2/Base/Brother/ItemInfection, VoidWhite.prefab - - RoR2/Base/Brother/ItemInfection, White.prefab - - RoR2/Base/BurnNearby/DisplayPotion.prefab - - RoR2/Base/ChainLightning/DisplayUkulele.prefab - - RoR2/Base/Cleanse/DisplayWaterPack.prefab - - RoR2/Base/Clover/DisplayClover.prefab - - RoR2/Base/CommandMissile/DisplayMissileRack.prefab - - RoR2/Base/CrippleWard/DisplayEffigy.prefab - - RoR2/Base/CritGlasses/DisplayGlasses.prefab - - RoR2/Base/CritOnUse/DisplayNeuralImplant.prefab - - RoR2/Base/Crowbar/DisplayCrowbar.prefab - - RoR2/Base/Dagger/DisplayDagger.prefab - - RoR2/Base/DeathMark/DisplayDeathMark.prefab - - RoR2/Base/DeathProjectile/DisplayDeathProjectile.prefab - - RoR2/Base/DroneBackup/DisplayRadio.prefab - - RoR2/Base/ElementalRings/DisplayFireRing.prefab - - RoR2/Base/ElementalRings/DisplayIceRing.prefab - - RoR2/Base/EliteFire/DisplayEliteHorn.prefab - - RoR2/Base/EliteHaunted/DisplayEliteStealthCrown.prefab - - RoR2/Base/EliteIce/DisplayEliteIceCrown.prefab - - RoR2/Base/EliteLightning/DisplayEliteRhinoHorn.prefab - - RoR2/Base/EliteLunar/DisplayEliteLunar, Fire.prefab - - RoR2/Base/EliteLunar/DisplayEliteLunar,Eye.prefab - - RoR2/Base/ElitePoison/DisplayEliteUrchinCrown.prefab - - RoR2/Base/EnergizedOnEquipmentUse/DisplayWarHorn.prefab - - RoR2/Base/EnergizedOnEquipmentUse/PickupWarHorn.prefab - - RoR2/Base/EquipmentMagazine/DisplayBattery.prefab - - RoR2/Base/ExecuteLowHealthElite/DisplayGuillotine.prefab - - RoR2/Base/ExplodeOnDeath/DisplayWilloWisp.prefab - - RoR2/Base/ExtraLife/DisplayHippo.prefab - - RoR2/Base/FallBoots/DisplayGravBoots.prefab - - RoR2/Base/Feather/DisplayFeather.prefab - - RoR2/Base/FireBallDash/DisplayEgg.prefab - - RoR2/Base/FireballsOnHit/DisplayFireballsOnHit.prefab - - RoR2/Base/Firework/DisplayFirework.prefab - - RoR2/Base/FlatHealth/DisplaySteakCurved.prefab - - RoR2/Base/FlatHealth/DisplaySteakFlat.prefab - - RoR2/Base/FocusConvergence/DisplayFocusedConvergence.prefab - - RoR2/Base/Fruit/DisplayFruit.prefab - - RoR2/Base/GainArmor/DisplayElephantFigure.prefab - - RoR2/Base/Gateway/DisplayVase.prefab - - RoR2/Base/GhostOnKill/DisplayMask.prefab - - RoR2/Base/GoldGat/DisplayGoldGat.prefab - - RoR2/Base/GoldOnHit/DisplayBoneCrown.prefab - - RoR2/Base/HeadHunter/DisplaySkullcrown.prefab - - RoR2/Base/HealOnCrit/DisplayScythe.prefab - - RoR2/Base/HealWhileSafe/DisplaySnail.prefab - - RoR2/Base/Hoof/DisplayHoof.prefab - - RoR2/Base/Icicle/DisplayFrostRelic.prefab - - RoR2/Base/Icicle/DisplayIcicle.prefab - - RoR2/Base/IgniteOnKill/DisplayGasoline.prefab - - RoR2/Base/IncreaseHealing/DisplayAntler.prefab - - RoR2/Base/Infusion/DisplayInfusion.prefab - - RoR2/Base/Jetpack/DisplayBugWings.prefab - - RoR2/Base/JumpBoost/DisplayWaxBird.prefab - - RoR2/Base/JumpBoost/DisplayWaxBirdEasyPlacement.prefab - - RoR2/Base/KillEliteFrenzy/DisplayBrainstalk.prefab - - RoR2/Base/Knurl/DisplayKnurl.prefab - - RoR2/Base/LaserTurbine/DisplayLaserTurbine.prefab - - RoR2/Base/LifestealOnHit/DisplayLifestealOnHit.prefab - - RoR2/Base/Lightning/DisplayLightningArmLeft.prefab - - RoR2/Base/Lightning/DisplayLightningArmLeftVoidSurvivor.prefab - - RoR2/Base/Lightning/DisplayLightningArmRight,Bandit2.prefab - - RoR2/Base/Lightning/DisplayLightningArmRight,Chef.prefab - - RoR2/Base/Lightning/DisplayLightningArmRight,Croco.prefab - - RoR2/Base/Lightning/DisplayLightningArmRight.prefab - - RoR2/Base/LightningStrikeOnHit/DisplayChargedPerforator.prefab - - RoR2/Base/LunarDagger/DisplayLunarDagger.prefab - - RoR2/Base/LunarSkillReplacements/DisplayBirdClaw.prefab - - RoR2/Base/LunarSkillReplacements/DisplayBirdEye.prefab - - RoR2/Base/LunarSkillReplacements/DisplayBirdFoot.prefab - - RoR2/Base/LunarSkillReplacements/DisplayBirdHeart.prefab - - RoR2/Base/LunarTrinket/DisplayBeads.prefab - - RoR2/Base/Medkit/DisplayMedkit.prefab - - RoR2/Base/Meteor/DisplayMeteor.prefab - - RoR2/Base/Missile/DisplayMissileLauncher.prefab - - RoR2/Base/MonstersOnShrineUse/DisplayMonstersOnShrineUse.prefab - - RoR2/Base/Mushroom/DisplayMushroom.prefab - - RoR2/Base/NearbyDamageBonus/DisplayDiamond.prefab - - RoR2/Base/NovaOnHeal/DisplayDevilHorns.prefab - - RoR2/Base/NovaOnLowHealth/DisplayJellyGuts.prefab - - RoR2/Base/ParentEgg/DisplayParentEgg.prefab - - RoR2/Base/Pearl/DisplayPearl.prefab - - RoR2/Base/PersonalShield/DisplayShieldGenerator.prefab - - RoR2/Base/Phasing/DisplayStealthkit.prefab - - RoR2/Base/Plant/DisplayInterstellarDeskPlant.prefab - - RoR2/Base/QuestVolatileBattery/DisplayBatteryArray.prefab - - RoR2/Base/RandomDamageZone/DisplayRandomDamageZone.prefab - - RoR2/Base/Recycle/DisplayRecycler.prefab - - RoR2/Base/RepeatHeal/DisplayCorpseflower.prefab - - RoR2/Base/RoboBallBuddy/DisplayEmpathyChip.prefab - - RoR2/Base/Saw/DisplaySawmerang.prefab - - RoR2/Base/Saw/DisplaySawmerangFollower.prefab - - RoR2/Base/Scanner/DisplayScanner.prefab - - RoR2/Base/SecondarySkillMagazine/DisplayDoubleMag.prefab - - RoR2/Base/Seed/DisplaySeed.prefab - - RoR2/Base/ShieldOnly/DisplayShieldBug.prefab - - RoR2/Base/ShinyPearl/DisplayShinyPearl.prefab - - RoR2/Base/ShockNearby/DisplayTeslaCoil.prefab - - RoR2/Base/SiphonOnLowHealth/DisplaySiphonOnLowHealth.prefab - - RoR2/Base/SlowOnHit/DisplayBauble.prefab - - RoR2/Base/SlowOnHit/DisplayBaubleEasyPlacement.prefab - - RoR2/Base/SprintArmor/DisplayBuckler.prefab - - RoR2/Base/SprintBonus/DisplaySoda.prefab - - RoR2/Base/SprintOutOfCombat/DisplayWhip.prefab - - RoR2/Base/SprintWisp/DisplayBrokenMask.prefab - - RoR2/Base/Squid/DisplaySquidTurret.prefab - - RoR2/Base/StickyBomb/DisplayStickyBomb.prefab - - RoR2/Base/StunChanceOnHit/DisplayStunGrenade.prefab - - RoR2/Base/Syringe/DisplaySyringe.prefab - - RoR2/Base/Syringe/DisplaySyringeCluster.prefab - - RoR2/Base/Talisman/DisplayTalisman.prefab - - RoR2/Base/TeamWarCry/DisplayTeamWarCry.prefab - - RoR2/Base/Thorns/DisplayRazorwireCoiled.prefab - - RoR2/Base/Thorns/DisplayRazorwireLeft.prefab - - RoR2/Base/Thorns/DisplayRazorwireLeftVoidSurvivor.prefab - - RoR2/Base/Thorns/DisplayRazorwireRight.prefab - - RoR2/Base/TitanGoldDuringTP/DisplayGoldHeart.prefab - - RoR2/Base/Tonic/DisplayTonic.prefab - - RoR2/Base/Tooth/DisplayToothMeshLarge.prefab - - RoR2/Base/Tooth/DisplayToothMeshSmall1.prefab - - RoR2/Base/Tooth/DisplayToothMeshSmall2.prefab - - RoR2/Base/Tooth/DisplayToothNecklaceDecal.prefab - - RoR2/Base/TPHealingNova/DisplayGlowFlower.prefab - - RoR2/Base/TreasureCache/DisplayKey.prefab - - RoR2/Base/UtilitySkillMagazine/DisplayAfterburner.prefab - - RoR2/Base/UtilitySkillMagazine/DisplayAfterburnerShoulderRing.prefab - - RoR2/Base/WarCryOnMultiKill/DisplayPauldron.prefab - - RoR2/Base/WardOnLevel/DisplayWarbanner.prefab - - RoR2/CU8/Harness/DisplayLemurianHarness.prefab - - RoR2/DLC1/AttackSpeedAndMoveSpeed/DisplayCoffee.prefab - - RoR2/DLC1/AttackSpeedAndMoveSpeed/PickupCoffee.prefab - - RoR2/DLC1/BearVoid/DisplayBearVoid.prefab - - RoR2/DLC1/BearVoid/DisplayBearVoidSit.prefab - - RoR2/DLC1/BleedOnHitVoid/DisplayTriTipVoid.prefab - - RoR2/DLC1/BossHunter/DisplayBlunderbuss.prefab - - RoR2/DLC1/BossHunter/DisplayTricornGhost.prefab - - RoR2/DLC1/BossHunter/DisplayTricornUsed.prefab - - RoR2/DLC1/ChainLightningVoid/DisplayUkuleleVoid.prefab - - RoR2/DLC1/CloverVoid/DisplayCloverVoid.prefab - - RoR2/DLC1/CritDamage/DisplayLaserSight.prefab - - RoR2/DLC1/CritDamage/PickupLaserSight.prefab - - RoR2/DLC1/CritGlassesVoid/DisplayGlassesVoid.prefab - - RoR2/DLC1/DisplayEliteRabbitEars.prefab - - RoR2/DLC1/DisplayMegaCrabItem.prefab - - RoR2/DLC1/DroneWeapons/DisplayDroneWeaponLauncher.prefab - - RoR2/DLC1/DroneWeapons/DisplayDroneWeaponMinigun.prefab - - RoR2/DLC1/DroneWeapons/DisplayDroneWeaponRobotArm.prefab - - RoR2/DLC1/ElementalRingVoid/DisplayVoidRing.prefab - - RoR2/DLC1/EliteEarth/DisplayEliteMendingAntlers.prefab - - RoR2/DLC1/EliteVoid/DisplayAffixVoid.prefab - - RoR2/DLC1/EquipmentMagazineVoid/DisplayFuelCellVoid.prefab - - RoR2/DLC1/ExplodeOnDeathVoid/DisplayWillowWispVoid.prefab - - RoR2/DLC1/ExtraLifeVoid/DisplayHippoVoid.prefab - - RoR2/DLC1/FragileDamageBonus/DisplayDelicateWatch.prefab - - RoR2/DLC1/FreeChest/DisplayShippingRequestForm.prefab - - RoR2/DLC1/GoldOnHurt/DisplayRollOfPennies.prefab - - RoR2/DLC1/GummyClone/DisplayGummyClone.prefab - - RoR2/DLC1/HalfAttackSpeedHalfCooldowns/DisplayLunarShoulderNature.prefab - - RoR2/DLC1/HalfSpeedDoubleHealth/DisplayLunarShoulderStone.prefab - - RoR2/DLC1/HealingPotion/DisplayHealingPotion.prefab - - RoR2/DLC1/ImmuneToDebuff/DisplayRainCoatBelt.prefab - - RoR2/DLC1/IrradiatingLaser/DisplayIrradiatingLaser.prefab - - RoR2/DLC1/LunarPortalOnUse/DisplayLunarPortalOnUse.prefab - - RoR2/DLC1/LunarSun/DisplaySunHead.prefab - - RoR2/DLC1/LunarSun/DisplaySunHeadNeck.prefab - - RoR2/DLC1/LunarWings/DisplayLunarWings.prefab - - RoR2/DLC1/MinorConstructOnKill/DisplayDefenseNucleus.prefab - - RoR2/DLC1/MissileVoid/DisplayMissileLauncherVoid.prefab - - RoR2/DLC1/Molotov/DisplayMolotov.prefab - - RoR2/DLC1/MoreMissile/DisplayICBM.prefab - - RoR2/DLC1/MoveSpeedOnKill/DisplayGrappleHook.prefab - - RoR2/DLC1/MultiShopCard/DisplayExecutiveCard.prefab - - RoR2/DLC1/MushroomVoid/DisplayMushroomVoid.prefab - - RoR2/DLC1/OutOfCombatArmor/DisplayOddlyShapedOpal.prefab - - RoR2/DLC1/PermanentDebuffOnHit/DisplayScorpion.prefab - - RoR2/DLC1/PrimarySkillShuriken/DisplayShuriken.prefab - - RoR2/DLC1/RandomEquipmentTrigger/DisplayBottledChaos.prefab - - RoR2/DLC1/RandomlyLunar/DisplayDomino.prefab - - RoR2/DLC1/RandomlyLunar/DisplayDominoFollower.prefab - - RoR2/DLC1/RegeneratingScrap/DisplayRegeneratingScrap.prefab - - RoR2/DLC1/ScrapVoid/DisplayScrapVoid.prefab - - RoR2/DLC1/ScrapVoid/DisplayScrapVoidGreen.prefab - - RoR2/DLC1/ScrapVoid/DisplayScrapVoidRed.prefab - - RoR2/DLC1/ScrapVoid/DisplayScrapVoidWhite.prefab - - RoR2/DLC1/SlowOnHitVoid/DisplayBaubleVoid.prefab - - RoR2/DLC1/SlowOnHitVoid/DisplayBaubleVoidEasyPlacement.prefab - - RoR2/DLC1/StrengthenBurn/DisplayGasTank.prefab - - RoR2/DLC1/TreasureCacheVoid/DisplayKeyVoid.prefab - - RoR2/DLC1/VendingMachine/DisplayVendingMachine.prefab - - RoR2/DLC1/VendingMachine/DisplayVendingMachine2.prefab - - RoR2/DLC2/Elites/EliteAurelionite/DisplayEliteAurelioniteEquipment.prefab - - RoR2/DLC2/Elites/EliteBead/DisplayEliteBeadEquipment.prefab - - RoR2/DLC2/Elites/EliteBead/DisplayEliteBeadSpike.prefab - - RoR2/DLC2/HealAndRevive/DisplayHealAndRevive.prefab - - RoR2/DLC2/Items/AttackSpeedPerNearbyAllyOrEnemy/DisplayRageCrystal.prefab - - RoR2/DLC2/Items/BarrageOnBoss/DisplayTreasuryDividends.prefab - - RoR2/DLC2/Items/BoostAllStats/DisplayGrowthNectar.prefab - - RoR2/DLC2/Items/DelayedDamage/DisplayDelayedDamage.prefab - - RoR2/DLC2/Items/ExtraShrineItem/DisplayChanceDoll.prefab - - RoR2/DLC2/Items/ExtraStatsOnLevelUp/DisplayPrayerBeads.prefab - - RoR2/DLC2/Items/IncreaseDamageOnMultiKill/DisplayIncreaseDamageOnMultiKill.prefab - - RoR2/DLC2/Items/IncreasePrimaryDamage/DisplayIncreasePrimaryDamage.prefab - - RoR2/DLC2/Items/ItemDropChanceOnKill/DisplaySonorousEcho.prefab - - RoR2/DLC2/Items/KnockBackHitEnemies/DisplayKnockbackFin.prefab - - RoR2/DLC2/Items/LowerPricedChests/DisplayLowerPricedChests.prefab - - RoR2/DLC2/Items/MeteorAttackOnHighDamage/DisplayMeteorAttackOnHighDamage.prefab - - RoR2/DLC2/Items/OnLevelUpFreeUnlock/DisplayOnLevelUpFreeUnlock.prefab - - RoR2/DLC2/Items/OnLevelUpFreeUnlock/DisplayOnLevelUpFreeUnlockTablet.prefab - - RoR2/DLC2/Items/SpeedBoostPickup/DisplayElusiveAntlersLeft.prefab - - RoR2/DLC2/Items/SpeedBoostPickup/DisplayElusiveAntlersRight.prefab - - RoR2/DLC2/Items/StunAndPierce/DisplayElectricBoomerang.prefab - - RoR2/DLC2/Items/TeleportOnLowHealth/DisplayTeleportOnLowHealth.prefab - - RoR2/DLC2/Items/TriggerEnemyDebuffs/DisplayNoxiousThorn.prefab - - RoR2/DLC3/Collective/DisplayEliteCollectiveHorn.prefab - - RoR2/DLC3/Collective/DisplayEliteCollectiveRing.prefab - - RoR2/DLC3/Drifter/DrifterBarrelDisplay.prefab - - RoR2/DLC3/Drifter/DrifterBrokenDroneDisplay.prefab - - RoR2/DLC3/Drifter/DrifterBrokenHANDDisplay.prefab - - RoR2/DLC3/Drifter/DrifterBubbleShieldDisplay.prefab - - RoR2/DLC3/Drifter/DrifterEvilSkullDisplay.prefab - - RoR2/DLC3/Drifter/DrifterGeodeDisplay.prefab - - RoR2/DLC3/Drifter/DrifterGrenadeDisplay.prefab - - RoR2/DLC3/Drifter/DrifterHotSauceDisplay.prefab - - RoR2/DLC3/Drifter/DrifterJunkBallDisplay.prefab - - RoR2/DLC3/Drifter/DrifterKnifeDisplay.prefab - - RoR2/DLC3/Drifter/DrifterPentaKnifeDiisplay.prefab - - RoR2/DLC3/Drifter/DrifterThqwibBloomDisplay.prefab - - RoR2/DLC3/Drifter/DrifterThqwibDisplay.prefab - - RoR2/DLC3/Drifter/DrifterToolbotCrateDisplay.prefab - - RoR2/DLC3/FriendUnit/DisplayShinyPearlFriendUnit.prefab - - RoR2/DLC3/GroundEnemies/DisplayGroundEnemies.prefab - - RoR2/DLC3/GroundEnemies/PickupGroundEnemies.prefab - - RoR2/DLC3/Items/BarrierOnCooldown/DisplayBarrierOnCooldown.prefab - - RoR2/DLC3/Items/BonusHealthBoost/DisplayQuickFix.prefab - - RoR2/DLC3/Items/CookedSteak/DisplayCookedSteakCurved.prefab - - RoR2/DLC3/Items/CookedSteak/DisplayCookedSteakFlat.prefab - - RoR2/DLC3/Items/CritAtLowerElevation/CritAtLowerElevationDisplay.prefab - - RoR2/DLC3/Items/DronesDropDynamite/DronesDropDynamiteDisplay.prefab - - RoR2/DLC3/Items/Duplicator/DisplayDuplicator.prefab - - RoR2/DLC3/Items/ExtraEquipment/DisplayExtraEquipment.prefab - - RoR2/DLC3/Items/ExtraEquipment/DisplayExtraEquipmentSingle.prefab - - RoR2/DLC3/Items/JumpDamageStrike/DisplayJumpDamageStrike.prefab - - RoR2/DLC3/Items/MasterBattery/DisplayPowerOrbSphere.prefab - - RoR2/DLC3/Items/MasterCore/DisplayPowerOrbSphere.prefab - - RoR2/DLC3/Items/PhysicsProjectile/PhysicsProjectileDisplay.prefab - - RoR2/DLC3/Items/PowerCube/DisplayPowerCube.prefab - - RoR2/DLC3/Items/PowerPyramid/DisplayPowerPyramid.prefab - - RoR2/DLC3/Items/SharedSuffering/SharedSufferingDisplay.prefab - - RoR2/DLC3/Items/ShieldBooster/DisplayShieldBooster.prefab - - RoR2/DLC3/Items/ShockDamageAura/PickupShockDamageAura.prefab - - RoR2/DLC3/Items/ShockDamageAura/ShockDamageAuraDisplay.prefab - - RoR2/DLC3/Items/SpeedOnPickup/SpeedOnPickupDisplay.prefab - - RoR2/DLC3/Items/Stew/StewDisplay.prefab - - RoR2/DLC3/Items/UltimateMeal/UltimateMealDisplay.prefab - - RoR2/DLC3/Items/WyrmOnHit/DisplayWyrmOnHit.prefab - - RoR2/DLC3/Parry/ParryDisplay.prefab - - RoR2/Junk/CooldownOnCrit/DisplaySkull.prefab - - RoR2/Junk/Incubator/DisplayAncestralIncubator.prefab - guidsCache: - - da42c73aefb9b8c4696df6bed0f914ef - - 3f8c4b0912a23a848b1bb9d5725d9d87 - - c93109265e9ffd34fa0f19dc1328e861 - - 82a5d5a190deaa54899a7651e0a7da14 - - ebae0979124be0d4a96e9dd0f0030c90 - - 65b6fdf5e5a80214f8ac26bfcc6f881d - - d007adf407547ce47a93856793e8de5a - - 5cde779e1f3abb94692a3dde2b98c92b - - 6e0255092b67b1e4195c9979e6d8c6de - - 647d95f1141e03847a1a7059e17500f9 - - 1d41b230abefc7e4cb9701cfba876e29 - - 9b5b06503e9cfdf4b9e29649b8f3947b - - a0d9f02b1924592439ea1771d49dbcfb - - 0f285bf93596e3545bbf9a440e7905fd - - 3e91ad7833522204fbe88308326ddff6 - - fab76e6d0f3d59f419c2a646e11c7285 - - 5932001bb0440584ba2ea23402c6c69c - - a848fe91f7b09934cb886bb77bb06b2c - - f12ce51e3e117b94680cd0c3d3700501 - - de62e89840152434cb622e434bf9bb62 - - 64cc7537dfeb23d4a949c313de5ae697 - - c919d63addcdc72458922b582f9c31c7 - - 66d3fe6a84e3e144c952dd3fab421173 - - b06477748e168314abd4c861c4cbcd76 - - 62dfa363e5d9edf40adbc338c710e9c5 - - 870d94d83d84cea43b2ffaff0d36ee80 - - a8dc7aa7f61d18e4db92a79611b96f90 - - 3885735aef6586e40abf0d079a929aad - - d4dcd8b35592cdd4f955e222e4226ac5 - - 672164b0b110f744a85e10f649d4ade5 - - aa827b69d20238f42962d0d754fd23de - - 234a79a8d76a03a468eccfa30598ab56 - - c0a50e27e3c1278438e2aaa27b37ad8c - - 8d521eec533d0d247b4b91d3fb0e3899 - - 24f940bb147d16a4d9ec7cf6176add0e - - ea60d9d36f847c041b5f56e6b730c39e - - 845aa38562b22b8489056e900ab1fe52 - - 69d7a4489f448c948bc5f9d9f53688b5 - - 8bc8037c15994d1499b97647062ca277 - - c0567bfe1f6206448ac846ba55e8dc2c - - 06ffb70dd6fad304a99f628341e3f541 - - eab0ea32e9ee452449f90f25b841f671 - - 880352d2f519466409abd39061d75b79 - - f75c662c5bc0d744d8919219eeba482d - - 767a76f115c24384498eb6bed7decc4d - - 01c99be16781ea64cb7c24f1ff1354d4 - - 740fa828216ad424d88cf59f31fa5792 - - 652606fbf5021f645b450f51e774524e - - 5071e940404ac11438977d61b4f37e5c - - dbab30384f9ac344b8e10c02630ed061 - - 05a84dac17886284c88d4cf869428306 - - f41323d11d3c0254d898f62043444404 - - a4ef2b71233ef294791f14b711da955d - - 289b9929daf575a4e8c27522ee284e6d - - e24f4f7b75a9dbf41bcf5322fd832a74 - - 4a0229dfe23fb664ea4cfb51c4b53a72 - - 591e168319d4b604497f8ae43b14a30b - - a7299e74e723b8b4dac5ace4a864c209 - - e7a42090ea02cbf4bb41c3ed7b2abb7d - - fe7079b6a2c43984fb46afed6c85d504 - - e797f69db5604d54f945074504223268 - - 4acba6fbc6ed18d459b22fe99b7182b2 - - f3632eb339994934eb64f538be0b23d6 - - a7a4f401d9c19a14293fd38b87609d0c - - 700f03bf35436f04a894b78aa292077d - - 7a2364ab498b346439da793b8c0218a5 - - 763228a0c9a281f42b4c50627a401ef4 - - b472548647b7036419360cd22cfa6589 - - f3016cb4afbff2b4a8ee2abc2eeb299a - - 5f6fe1888e982094a840a4adf989bddc - - 5781d2d96aa96784496a5b7b8927a5a6 - - ded38748d157e51469c6cb11a4d89b90 - - a8defad751a9331469ef39d23fdea79c - - e74460549d0aff9498493d1e61cb56ab - - 9c0c9c539940ad748847876907cddf39 - - 0ebf0bd3be9faa24e87ba3b0fa07dc5a - - dd459d02161994f41a3554c118353698 - - 3dabcca9cfb17354285b28befa640323 - - 1ade1c2c57f122b4b864e19c1dddfa48 - - f595cc0084f3e054d93bc5f3e27baa0c - - 36fdf3e58084a2c4b9584f04e8739a79 - - 15a1f0a852dbcb146a3b6f0fbdf6595f - - 64cc72def2e97d24381c25f030290421 - - 89e19819632eb9e419cf060996d808a4 - - 073ce4eb41218724086938b1ff9daf10 - - cac00e9491379d348924b2f2dd852a63 - - 6366963bdc2e014459cbb09eb598c996 - - 7d0f493cd714abf4ca2e0fdaf3634787 - - 59a2c4937442ca649b59ec4398485a59 - - a6f2f1ad89733fd459dd32032c429aa1 - - 36267534a61415d43915a66824c4dae8 - - 056d5b55d3ef61441b1f904ab6546ac3 - - 61f3d19a1a584eb4d8a5ba2c09e33ab3 - - adf96234b18f09748a1c40b89cec2ba3 - - afa38ac2c65514d44b66c0be71d59789 - - 95a5b7e2acb60cb4693bda9cd35c84a4 - - 35abd3d05da206240b7c9ceab43d98d6 - - c94dcaf4e7a7ba440bc4cb86bcaa7894 - - 164e2b960cc7a5643baa9647a2600149 - - 6550cc38ebf814148bfc77931b8d7776 - - 1e9e56200148f084d8858f2f23363611 - - a32c3833d03e193409036e3b0bbbf939 - - 5194204bb0bbc00408b0d48b4cba6259 - - 4d71a46d42c6b7d47b857dead0e139a4 - - 68468ecac761c7e48ae5362365caba4d - - d54860816fde33a48abf44729cdafada - - d4f196235d7bbf4448da694f1f3bc791 - - 62f9a3cbdca88374885deb4d65b20eea - - b181cbfa7b431e64486815914e2ee31a - - e7990ab7a3ef3bd4189d49c519f3ce10 - - 94810aa625a84824ea2a95dd0b239012 - - 2ee35977cdb22924c8577045ee9078a3 - - 93345d678e97afa4b9f674abb68c5263 - - d0cdad95cf80357439bbb89ab2deaca7 - - 6e2ac6fdade7da3448d7ac1ca4b6ede4 - - d82067ca71526794185a0e7bf6bdc6b4 - - 7124cdd34f67979419fc4c5e08ae2873 - - fab23313d7a3d4e4585e5b67e5b71c0c - - 1a7a39f4d5ede874985544ed875b6d11 - - aacdc80b52226914caa00e52ce898b27 - - 34f1a0a6040cf3843ab88023b075fe40 - - 3570f2351927108468b2942d58506a31 - - 526d85a391b2ea64db5bc5d817143688 - - 055b138d693579e4bbcc1a292841ff61 - - 3ed0dbe2a98753c41af4a54ff978e8ea - - f3b149e8a2c2acf48b8c0bf570b260ee - - 24fffc10f9c63af4a8c08b678c9b786f - - 8681bef9163f2b043a26765c3bcd2ad4 - - 02ce7cd6a331b714ca670108ece98d0d - - cbe25fcbb6133ec42a729916d259ffd4 - - ed1b01e2b6f9091488dd4e0bb12fcf87 - - 5f999857e10694e4db25d4157871b308 - - 5a31437fbf638bb4888eef5d818cc3c7 - - 16370bc69195e0a4c87f7e65281ffc31 - - c397449a1204d094d867088402cf07af - - cc65900f21072534c94525f740c6f411 - - 3d067442f85ee5f449ca3ce36a21cbe1 - - a8283c26ad39f8f4ea14a5865d38eee3 - - 2894ba39b0037aa4f8881030832981a7 - - cf88ecf3150d473469b57aaba2619eea - - 168afcdc6b4fb7246b857862d26f0c07 - - d5753ff552fa8924096036d1c5d95a9e - - 1e05d3a87004ec24abedb067bacc223d - - fd4914b8f424a9c498be59f40a6fe799 - - 5da10a4c70400c542a0112989ced2598 - - 9095efb16b9fd36429bbfb0bc70a14aa - - 24a3396a864b87547b32d168acfb931a - - dbf1bc878de9ddb408e6f3cea31048af - - 70a22d4afb900f04db7e76bef820bede - - d419c1092f5466448a2672498571e808 - - 8000db5bcbc084040b3a8902db950361 - - 7efff20703b7db549a67464fbcf297d1 - - 0ae02adf924746942aecde545d51ab01 - - c5396e63cc606bd44ba0ac7cc229ac64 - - 797a11390dd23a04bbff75822b74830e - - 928ee95e341817044a4a8f040b57b565 - - b76e5d0748d0c9b4891eb1506ecbc654 - - fd8c698e85d2b95408e792ab4ac1638b - - 217a7b8e3c3e3bf4f96c7431771ef070 - - b4558bdb2c441e046a652a108ef3e522 - - 837b66d76b03b754dad93f852c8b71cf - - b55a341f1987fcb48a02d543e2d7a65d - - 7b6fb15c176c454429809d0933075ded - - 004605d7575090741b232c19542ec9d1 - - 4b01bfc247a812a499e5635ed753f952 - - 4b352d6348322de45bd979dddc9667b0 - - 86e58ace6d140cf4bb2ee5ddcd1827f8 - - 5a4196c3380b45e409ff79d4171bb6cc - - 9734ca1f4f21e8540a6493906870cb94 - - cacacb7f5dc28eb47a035996b5d4f0b7 - - e5676510d0016b24186780db4336fb75 - - 7083017a4d0e96a4dac36e9a88450989 - - 6a50b73e668dfe14e9330be5485494be - - 39d2b67f6797c6843b67f1b6f6268df8 - - f76a390c2ffbf9645862f81533eafc69 - - a5888055b2e8dfe479af511631631c0a - - 800da176d4ded1c418b143bbd6200494 - - 8b738ef988c15324198a40c3d50d3f61 - - 091136c81bff94e4698351c305544243 - - c34edfdc18586c6438357334e2b4eb4e - - 8abb17da3ebaf6840a96b78e09e11942 - - 7eccc7dd3defa3b45b7eaf612f04a1b0 - - 4e82bb3559177b843a002bab985c2113 - - 091ce8f3c64d54345bd9379737b544f7 - - f0460a8ebf419cd409cb4c1650754e0b - - af271a99bbca48f48adf8165031d156b - - 0fd92e594f831aa47951ec81da34d733 - - 8d077f140ab3137469e61c4db48deca7 - - 44106a80fa9ad234a89d4d1e209b438e - - 40a96b080a26b524cb56c25a42bca1d2 - - abd9f546003fedf42bb3000802cd2531 - - e0daebe74bbed494b81bfb839afba714 - - 5b364bcd6290ac54f97ce1c63eade793 - - 717a4064297928e48a53ccee6a2bd614 - - 20a2651082b2c0a43a779ce35b5c615f - - 1454820a6a62cb44dbd46783c21b5b19 - - a9bb02934ad94c240b2835c93876c14e - - 5b3e4a580853a5a4fba4279ba1876b24 - - 725a0638d1708fb43a3fb5594681009f - - 9e30691859854264d833bf8bb4ae1ab7 - - ad499a499b2cc1a4b89086793303b9ba - - 16795ae960f84144b98aa41eb312dc40 - - 080131630c8de3840ab5d6b42efea370 - - 7682e3dc58ec91c4494b467153fb78c6 - - ebb5044b8c585f74e9ab437b74e175b3 - - 28a13b7e633cc7e4ca55df3bb0a7e25c - - 135a24a7366714149a6f16e68f7b3394 - - a2ac24965e44e57409da0e285b030b7a - - d4e35d475125ff24e9615ec0cb879624 - - 7c1bf9f63436e4a4b950606b8d6ab27f - - 34bed69213d813f4db3c33b54c909c54 - - 7fc6860bb4792354f8277fdc1db1d7b3 - - 630acbb5597239042afd52867f2e883f - - e393b456f5f055f48bfd6bc5c0bd5afc - - ea51a7445d66c9f49aeaf7dae9363e29 - - 4b1c407a11dae5540a49ffabc5f9d1ae - - 38d7ef1adcce0dc44ab443812a8ee569 - - e9b757cbee6849c4e9fb36619fbb43ed - - 2b86af621f3e8724f9e51ab56aad6395 - - 389a68bec00cbea4aaf7719f7d73b410 - - 688f39f740c080248bd0a2c6a87b3c30 - - 873c8bdb9a9c85e42a949fbff3fa3db5 - - 2574dd9f6bfbbd9419b5db0e05e4d225 - - 0c6f675d2fd772a4188b3d502d6c2675 - - edc3e618d4968794ebf90abb57e4fc1b - - e77cef356a99066468cc767e423134a2 - - 17fb7466046f4074099626508c98fb6c - - 39ad1873476b7d84ba4283b45bed5c95 - - 1b9e648aac72e4645b741866918bcde7 - - a41049f346fb278488473107baa7aa20 - - 7fe404b05749b4e439ed3767199538a7 - - 081d607e66dab7d4c848aa83c10520e9 - - 72365bdf1f6dfd948b010517455c1360 - - 2ff84ac315b2fe0458cae69093e64303 - - 9a762b2ba78900447b17a39114a95187 - - 04398ba912ce7d344893893cc50e54d4 - - 5ad5de7564c0cef46868dee831f1ecd0 - - 98f9f5c5137a7c44ea8b57f1ccb99812 - - cb8ec7cebcff8814e8e319ba8aed05e5 - - b67c156e15e6f4245989c763f1a40b6f - - 75f0fc718cdbfeb4f8cf87a93d4d88aa - - 4818f0c19a9e54643a574610f7eec150 - - a4f759a6aa065364a865c15ad217363c - - 4825624564fb0b743bf4345d54aaa11a - - 86d740658e032814f9b9dae592ec6f84 - - 878cc8946bc85b64aae01c057e83df09 - - 99d923af727aedb4ca09a89047dbe8a1 - - aff6f5c2d3784c549a4e964620815ccf - - d7db2a4d100cfdf4195b7b6f220d0183 - - b6def30e8dab8cf4b95b5835bd096ccc - - c2eeab409328ff140adf986a3a2f4d4c - - 816f7f389a356d04c833d9b65d9d9aa1 - - 9a6561973eb80ad45972179803f1ee80 - - e1705cd9c5061414b8cf70307849d0dd - - 2abd2053341def34aba74273d5011d3f - - 8618f8af88c1f4d44b87e6b5ac027f76 - - 12311aa2c441ced4bb067143c1f196cc - - df2e1c05fffe60041bee5a8261b0db63 - - 977b6562671081d40bfa894e2e42931a - - b6c5441aa36df4c4994a698bf8d15359 - - f2564efbbba8c054d99a345691856238 - - 974b20c8b1804784e99d94adcf139387 - - 041850aa4097ef844886ed801a5e2cc6 - - 4df70a7b428d7254f8371feda485fa1d - - 5a8b1ff4474fac946a18e4c15745be18 - - 09e5b0bbec0231940b80fe7a51f4e2e2 - - 24b22c3350b506a4dbeed6efa17bbfe6 - - 3d9fb67952d984b4aaf533692f303ba0 - - b4abad61206e535439a93a8eda25f597 - - 53c241bd80250134d8baea744b392838 - - 4dbdf294620cac746a4d606e5d32d356 - - d43010a14ab8f8741b82c2a7df33e184 - - d36fe6b5884e6374184f1783e176073e - - e916eafb9e7d56442ae63db5b3dd59db - - bf2f8ba966b33584fac7043ff31a4ec0 - - a93b1fd107be7c8448ab72c25f101524 - - 4f751a0a4e980734eb13f4d6f5007b2a - - dae73cb0899592849adf33e24b0705bc - - ec1828f4a2c49a74c9152c7d321baa52 - - 848eccfe522ec0a4ea3c8ae5fb22b839 - - ba677b4d0e5603c4ea3d8cf62131fbec - - b576488b6c2ab144d89283d7e4cdef1d - - db34ddc408ae10d40a6f9b001837679a - - 849fec813d51d1a4ead2683be9b59033 - - cacheKey: - requiredType: - assemblyQualifiedName: RoR2.ItemDef, RoR2, Version=0.0.0.0, Culture=neutral, - PublicKeyToken=null - entriesIncludeComponentFoundInChildren: 0 - cacheHit: - pathCache: - - RoR2/AchievementRewardTest/AchievementRewardTest.asset - - RoR2/Base/AdaptiveArmor/AdaptiveArmor.asset - - RoR2/Base/AlienHead/AlienHead.asset - - RoR2/Base/ArmorPlate/ArmorPlate.asset - - RoR2/Base/ArmorReductionOnHit/ArmorReductionOnHit.asset - - RoR2/Base/ArtifactKey/ArtifactKey.asset - - RoR2/Base/AttackSpeedOnCrit/AttackSpeedOnCrit.asset - - RoR2/Base/AutoCastEquipment/AutoCastEquipment.asset - - RoR2/Base/Bandolier/Bandolier.asset - - RoR2/Base/BarrierOnKill/BarrierOnKill.asset - - RoR2/Base/BarrierOnOverHeal/BarrierOnOverHeal.asset - - RoR2/Base/Bear/Bear.asset - - RoR2/Base/BeetleGland/BeetleGland.asset - - RoR2/Base/Behemoth/Behemoth.asset - - RoR2/Base/BleedOnHit/BleedOnHit.asset - - RoR2/Base/BleedOnHitAndExplode/BleedOnHitAndExplode.asset - - RoR2/Base/BonusGoldPackOnKill/BonusGoldPackOnKill.asset - - RoR2/Base/BoostAttackSpeed/BoostAttackSpeed.asset - - RoR2/Base/BoostDamage/BoostDamage.asset - - RoR2/Base/BoostEquipmentRecharge/BoostEquipmentRecharge.asset - - RoR2/Base/BoostHp/BoostHp.asset - - RoR2/Base/BossDamageBonus/BossDamageBonus.asset - - RoR2/Base/BounceNearby/BounceNearby.asset - - RoR2/Base/CaptainDefenseMatrix/CaptainDefenseMatrix.asset - - RoR2/Base/ChainLightning/ChainLightning.asset - - RoR2/Base/Clover/Clover.asset - - RoR2/Base/CrippleWardOnLevel/CrippleWardOnLevel.asset - - RoR2/Base/CritGlasses/CritGlasses.asset - - RoR2/Base/Crowbar/Crowbar.asset - - RoR2/Base/CutHp/CutHp.asset - - RoR2/Base/Dagger/Dagger.asset - - RoR2/Base/DeathMark/DeathMark.asset - - RoR2/Base/DrizzlePlayerHelper/DrizzlePlayerHelper.asset - - RoR2/Base/ElementalRings/FireRing.asset - - RoR2/Base/ElementalRings/IceRing.asset - - RoR2/Base/EnergizedOnEquipmentUse/EnergizedOnEquipmentUse.asset - - RoR2/Base/EquipmentMagazine/EquipmentMagazine.asset - - RoR2/Base/ExecuteLowHealthElite/ExecuteLowHealthElite.asset - - RoR2/Base/ExplodeOnDeath/ExplodeOnDeath.asset - - RoR2/Base/ExtraLife/ExtraLife.asset - - RoR2/Base/ExtraLife/ExtraLifeConsumed.asset - - RoR2/Base/FallBoots/FallBoots.asset - - RoR2/Base/Feather/Feather.asset - - RoR2/Base/FireballsOnHit/FireballsOnHit.asset - - RoR2/Base/Firework/Firework.asset - - RoR2/Base/FlatHealth/FlatHealth.asset - - RoR2/Base/FocusConvergence/FocusConvergence.asset - - RoR2/Base/Ghost/Ghost.asset - - RoR2/Base/GhostOnKill/GhostOnKill.asset - - RoR2/Base/GoldOnHit/GoldOnHit.asset - - RoR2/Base/HeadHunter/HeadHunter.asset - - RoR2/Base/HealOnCrit/HealOnCrit.asset - - RoR2/Base/HealthDecay/HealthDecay.asset - - RoR2/Base/HealWhileSafe/HealWhileSafe.asset - - RoR2/Base/Hoof/Hoof.asset - - RoR2/Base/Icicle/Icicle.asset - - RoR2/Base/IgniteOnKill/IgniteOnKill.asset - - RoR2/Base/IncreaseHealing/IncreaseHealing.asset - - RoR2/Base/Infusion/Infusion.asset - - RoR2/Base/InvadingDoppelganger/InvadingDoppelganger.asset - - RoR2/Base/JumpBoost/JumpBoost.asset - - RoR2/Base/KillEliteFrenzy/KillEliteFrenzy.asset - - RoR2/Base/Knurl/Knurl.asset - - RoR2/Base/LaserTurbine/LaserTurbine.asset - - RoR2/Base/LevelBonus/LevelBonus.asset - - RoR2/Base/LightningStrikeOnHit/LightningStrikeOnHit.asset - - RoR2/Base/LunarBadLuck/LunarBadLuck.asset - - RoR2/Base/LunarDagger/LunarDagger.asset - - RoR2/Base/LunarSkillReplacements/LunarPrimaryReplacement.asset - - RoR2/Base/LunarSkillReplacements/LunarSecondaryReplacement.asset:ItemDef - - RoR2/Base/LunarSkillReplacements/LunarSpecialReplacement.asset - - RoR2/Base/LunarSkillReplacements/LunarUtilityReplacement.asset:ItemDef - - RoR2/Base/LunarTrinket/LunarTrinket.asset - - RoR2/Base/Medkit/Medkit.asset - - RoR2/Base/MinHealthPercentage/MinHealthPercentage.asset - - RoR2/Base/MinionLeash/MinionLeash.asset - - RoR2/Base/Missile/Missile.asset - - RoR2/Base/MonsoonPlayerHelper/MonsoonPlayerHelper.asset - - RoR2/Base/MonstersOnShrineUse/MonstersOnShrineUse.asset - - RoR2/Base/Mushroom/Mushroom.asset - - RoR2/Base/NearbyDamageBonus/NearbyDamageBonus.asset - - RoR2/Base/NovaOnHeal/NovaOnHeal.asset - - RoR2/Base/NovaOnLowHealth/NovaOnLowHealth.asset - - RoR2/Base/ParentEgg/ParentEgg.asset - - RoR2/Base/Pearl/Pearl.asset - - RoR2/Base/PersonalShield/PersonalShield.asset - - RoR2/Base/Phasing/Phasing.asset - - RoR2/Base/Plant/Plant.asset - - RoR2/Base/RandomDamageZone/RandomDamageZone.asset - - RoR2/Base/RepeatHeal/RepeatHeal.asset - - RoR2/Base/RoboBallBuddy/RoboBallBuddy.asset - - RoR2/Base/Scrap/ScrapGreen.asset - - RoR2/Base/Scrap/ScrapRed.asset - - RoR2/Base/Scrap/ScrapWhite.asset - - RoR2/Base/Scrap/ScrapYellow.asset - - RoR2/Base/SecondarySkillMagazine/SecondarySkillMagazine.asset - - RoR2/Base/Seed/Seed.asset - - RoR2/Base/ShieldOnly/ShieldOnly.asset - - RoR2/Base/ShinyPearl/ShinyPearl.asset - - RoR2/Base/ShockNearby/ShockNearby.asset - - RoR2/Base/SiphonOnLowHealth/SiphonOnLowHealth.asset - - RoR2/Base/SlowOnHit/SlowOnHit.asset - - RoR2/Base/SprintArmor/SprintArmor.asset - - RoR2/Base/SprintBonus/SprintBonus.asset - - RoR2/Base/SprintOutOfCombat/SprintOutOfCombat.asset - - RoR2/Base/SprintWisp/SprintWisp.asset - - RoR2/Base/Squid/Squid.asset - - RoR2/Base/StickyBomb/StickyBomb.asset - - RoR2/Base/StunChanceOnHit/StunChanceOnHit.asset - - RoR2/Base/Syringe/Syringe.asset - - RoR2/Base/Talisman/Talisman.asset - - RoR2/Base/TeamSizeDamageBonus/TeamSizeDamageBonus.asset - - RoR2/Base/TeleportWhenOob/TeleportWhenOob.asset - - RoR2/Base/Thorns/Thorns.asset - - RoR2/Base/TitanGoldDuringTP/TitanGoldDuringTP.asset - - RoR2/Base/TonicAffliction/TonicAffliction.asset - - RoR2/Base/Tooth/Tooth.asset - - RoR2/Base/TPHealingNova/TPHealingNova.asset - - RoR2/Base/TreasureCache/TreasureCache.asset - - RoR2/Base/UseAmbientLevel/UseAmbientLevel.asset - - RoR2/Base/UtilitySkillMagazine/UtilitySkillMagazine.asset - - RoR2/Base/WarCryOnMultiKill/WarCryOnMultiKill.asset - - RoR2/Base/WardOnLevel/WardOnLevel.asset - - RoR2/CU8/Harness/LemurianHarness.asset - - RoR2/DLC1/AttackSpeedAndMoveSpeed/AttackSpeedAndMoveSpeed.asset - - RoR2/DLC1/BearVoid/BearVoid.asset - - RoR2/DLC1/BleedOnHitVoid/BleedOnHitVoid.asset - - RoR2/DLC1/ChainLightningVoid/ChainLightningVoid.asset - - RoR2/DLC1/CloverVoid/CloverVoid.asset - - RoR2/DLC1/ConvertCritChanceToCritDamage/ConvertCritChanceToCritDamage.asset - - RoR2/DLC1/CritDamage/CritDamage.asset - - RoR2/DLC1/CritGlassesVoid/CritGlassesVoid.asset - - RoR2/DLC1/DroneWeapons/DroneWeapons.asset - - RoR2/DLC1/DroneWeapons/DroneWeaponsBoost.asset - - RoR2/DLC1/DroneWeapons/DroneWeaponsDisplay1.asset - - RoR2/DLC1/DroneWeapons/DroneWeaponsDisplay2.asset - - RoR2/DLC1/ElementalRingVoid/ElementalRingVoid.asset - - RoR2/DLC1/EmpowerAlways/EmpowerAlways.asset - - RoR2/DLC1/EquipmentMagazineVoid/EquipmentMagazineVoid.asset - - RoR2/DLC1/ExplodeOnDeathVoid/ExplodeOnDeathVoid.asset - - RoR2/DLC1/ExtraLifeVoid/ExtraLifeVoid.asset - - RoR2/DLC1/ExtraLifeVoid/ExtraLifeVoidConsumed.asset - - RoR2/DLC1/FragileDamageBonus/FragileDamageBonus.asset - - RoR2/DLC1/FragileDamageBonus/FragileDamageBonusConsumed.asset - - RoR2/DLC1/FreeChest/FreeChest.asset - - RoR2/DLC1/GoldOnHurt/GoldOnHurt.asset - - RoR2/DLC1/GummyClone/GummyCloneIdentifier.asset - - RoR2/DLC1/HalfAttackSpeedHalfCooldowns/HalfAttackSpeedHalfCooldowns.asset - - RoR2/DLC1/HalfSpeedDoubleHealth/HalfSpeedDoubleHealth.asset - - RoR2/DLC1/HealingPotion/HealingPotion.asset - - RoR2/DLC1/HealingPotion/HealingPotionConsumed.asset - - RoR2/DLC1/ImmuneToDebuff/ImmuneToDebuff.asset - - RoR2/DLC1/LunarSun/LunarSun.asset - - RoR2/DLC1/LunarWings/LunarWings.asset - - RoR2/DLC1/MinorConstructOnKill/MinorConstructOnKill.asset - - RoR2/DLC1/MissileVoid/MissileVoid.asset - - RoR2/DLC1/MoreMissile/MoreMissile.asset - - RoR2/DLC1/MoveSpeedOnKill/MoveSpeedOnKill.asset - - RoR2/DLC1/MushroomVoid/MushroomVoid.asset - - RoR2/DLC1/OutOfCombatArmor/OutOfCombatArmor.asset - - RoR2/DLC1/PermanentDebuffOnHit/PermanentDebuffOnHit.asset - - RoR2/DLC1/PrimarySkillShuriken/PrimarySkillShuriken.asset - - RoR2/DLC1/RandomEquipmentTrigger/RandomEquipmentTrigger.asset - - RoR2/DLC1/RandomlyLunar/RandomlyLunar.asset - - RoR2/DLC1/RegeneratingScrap/RegeneratingScrap.asset - - RoR2/DLC1/RegeneratingScrap/RegeneratingScrapConsumed.asset - - RoR2/DLC1/ScrapVoid/ScrapGreenSuppressed.asset - - RoR2/DLC1/ScrapVoid/ScrapRedSuppressed.asset - - RoR2/DLC1/ScrapVoid/ScrapWhiteSuppressed.asset - - RoR2/DLC1/SlowOnHitVoid/SlowOnHitVoid.asset - - RoR2/DLC1/StrengthenBurn/StrengthenBurn.asset - - RoR2/DLC1/TreasureCacheVoid/TreasureCacheVoid.asset - - RoR2/DLC1/VoidMegaCrabItem.asset - - RoR2/DLC1/VoidSurvivor/VoidmanPassiveItem.asset - - RoR2/DLC2/Items/AttackSpeedPerNearbyAllyOrEnemy/AttackSpeedPerNearbyAllyOrEnemy.asset - - RoR2/DLC2/Items/BarrageOnBoss/BarrageOnBoss.asset - - RoR2/DLC2/Items/BoostAllStats/BoostAllStats.asset - - RoR2/DLC2/Items/DelayedDamage/DelayedDamage.asset - - RoR2/DLC2/Items/ExtraShrineItem/ExtraShrineItem.asset - - RoR2/DLC2/Items/ExtraStatsOnLevelUp/ExtraStatsOnLevelUp.asset - - RoR2/DLC2/Items/IncreaseDamageOnMultiKill/IncreaseDamageOnMultiKill.asset - - RoR2/DLC2/Items/IncreasePrimaryDamage/IncreasePrimaryDamage.asset - - RoR2/DLC2/Items/ItemDropChanceOnKill/ItemDropChanceOnKill.asset - - RoR2/DLC2/Items/KnockBackHitEnemies/KnockBackHitEnemies.asset - - RoR2/DLC2/Items/LowerPricedChests/LowerPricedChests.asset - - RoR2/DLC2/Items/LowerPricedChests/LowerPricedChestsConsumed.asset - - RoR2/DLC2/Items/MeteorAttackOnHighDamage/MeteorAttackOnHighDamage.asset - - RoR2/DLC2/Items/OnLevelUpFreeUnlock/OnLevelUpFreeUnlock.asset - - RoR2/DLC2/Items/SpeedBoostPickup/SpeedBoostPickup.asset - - RoR2/DLC2/Items/StunAndPierce/StunAndPierce.asset - - RoR2/DLC2/Items/TeleportOnLowHealth/TeleportOnLowHealth.asset - - RoR2/DLC2/Items/TeleportOnLowHealth/TeleportOnLowHealthConsumed.asset - - RoR2/DLC2/Items/TriggerEnemyDebuffs/TriggerEnemyDebuffs.asset - - RoR2/DLC3/Items/BarrierOnCooldown/BarrierOnCooldown.asset - - RoR2/DLC3/Items/BonusHealthBoost/BonusHealthBoost.asset - - RoR2/DLC3/Items/CookedSteak/CookedSteak.asset - - RoR2/DLC3/Items/CritAtLowerElevation/CritAtLowerElevation.asset - - RoR2/DLC3/Items/DestructibleSpawnerItem/DestructibleSpawner.asset - - RoR2/DLC3/Items/DronesDropDynamite/DroneDynamiteDisplay.asset - - RoR2/DLC3/Items/DronesDropDynamite/DronesDropDynamite.asset - - RoR2/DLC3/Items/DroneUpgradeHidden/DroneUpgradeHidden.asset - - RoR2/DLC3/Items/Duplicator/Duplicator.asset - - RoR2/DLC3/Items/ExtraEquipment/ExtraEquipment.asset - - RoR2/DLC3/Items/JumpDamageStrike/JumpDamageStrike.asset - - RoR2/DLC3/Items/Junk.asset - - RoR2/DLC3/Items/MasterBattery/MasterBattery.asset - - RoR2/DLC3/Items/MasterCore/MasterCore.asset - - RoR2/DLC3/Items/MoneyLoan/MoneyLoan.asset - - RoR2/DLC3/Items/PhysicsProjectile/PhysicsProjectile.asset - - RoR2/DLC3/Items/PowerCube/PowerCube.asset - - RoR2/DLC3/Items/PowerOrbSphere/PowerOrbSphere.asset - - RoR2/DLC3/Items/PowerPyramid/PowerPyramid.asset - - RoR2/DLC3/Items/SharedSuffering/SharedSuffering.asset - - RoR2/DLC3/Items/ShieldBooster/ShieldBooster.asset - - RoR2/DLC3/Items/ShockDamageAura/ShockDamageAura.asset - - RoR2/DLC3/Items/SpeedOnPickup/SpeedOnPickup.asset - - RoR2/DLC3/Items/StatsFromScrap/StatsFromScrap.asset - - RoR2/DLC3/Items/Stew/Stew.asset - - RoR2/DLC3/Items/TransferDebuffOnHit/TransferDebuffOnHit.asset - - RoR2/DLC3/Items/UltimateMeal/UltimateMeal.asset - - RoR2/DLC3/Items/WyrmOnHit/WyrmOnHit.asset - - RoR2/InDev/SummonedEcho.asset - - RoR2/Junk/AACannon/AACannon.asset - - RoR2/Junk/BurnNearby/BurnNearby.asset - - RoR2/Junk/CooldownOnCrit/CooldownOnCrit.asset - - RoR2/Junk/CritHeal/CritHeal.asset - - RoR2/Junk/Incubator/Incubator.asset - - RoR2/Junk/MageAttunement/MageAttunement.asset - - RoR2/Junk/PlantOnHit/PlantOnHit.asset - - RoR2/Junk/PlasmaCore/PlasmaCore.asset - - RoR2/Junk/SkullCounter/SkullCounter.asset - - RoR2/Junk/TempestOnKill/TempestOnKill.asset - - RoR2/Junk/WarCryOnCombat/WarCryOnCombat.asset - - RoR2/Junk_DLC1/EmpowerItems/EmpowerBuff/EmpowerBuff.asset - - RoR2/Junk_DLC1/EmpowerItems/EmpowerMagazine/EmpowerMagazine.asset - - RoR2/Junk_DLC1/EmpowerItems/EmpowerOnKill/EmpowerOnKill.asset - - RoR2/Junk_DLC1/EmpowerItems/EmpowerRefresh/EmpowerRefresh.asset - guidsCache: - - fd1c3c761e372c547bb941f00050c44a - - 251e8fe9d0918cc418856125cedfd6ae - - ae661ac557803a449b66b06ffa3dc186 - - 8b4e9932d2603584ba68d78917eb7227 - - 0e95b5e1cbbe8be428f928037a85a004 - - 5e34ac1d33da9b34282ca5e086305fac - - 8f7d52132f0d4154f96802e17c3a120f - - 056f4d0eb635b444cbaa07bb2b59eb59 - - c2701e84e1d92a246a9adaffd41b56a5 - - 81b1fa219ea4564478f17dc582f31aae - - 79e5630993f4f894c8e7473f06ef2996 - - 099d4a6bd75b8134ab0b0c385486ab41 - - da51cc696f5ac5e4299a5e42d4d3aaff - - 02bf2f4fd76fe3e4d8651ee87fa60821 - - 342959f223db3684cabb56a879595d19 - - 8c604d685e847cd409d013246dff0d95 - - a66fab08f3d5ca14a9609b96120de01d - - 9eabaf84a332c684c98243241c62468a - - 6cf6a91143b4c9b49ab061de0a45361a - - 364152d7b6bd1944f9dbf9243349728f - - 41f305b2b67e5ad4abf406b4113e6202 - - 79a3f2168cb0c1240b7a82993050e8c1 - - 5bcd04753888e6649826210e13d48835 - - c947ac0131c6e99478ecb70adc36464f - - 34d0b81c92a66774aa5eaa71e6384312 - - 1fa67a3f6e6433f469b011c902b8f1a5 - - 36e4e50e47646ec4d9c04eb60e5c28f5 - - 1f9d9acba7e847245b572391591186c3 - - 4929a1eb49b1ada4897cf95713a2585f - - 251a5221c05e73a43bff24bb6d86786e - - 3cf4e6aa7aa0f9045a04de0ae1878c91 - - 7f85c87896f8efc42a61f63e10e396b5 - - b858c2a778f8506409d3d03c352da83e - - 280327b58ad79e44ca9c0dced7692f33 - - 6d3b91533da0afe46835989b320e75fd - - b691c1b8c61cd244aba3ea9a5f9e5d9e - - 34c1f71bd1a7b464daffc92cfa39fcc7 - - f0185035937152046b93247614319b8a - - 1a8bdcc016479ad498dd122e2f661549 - - b1a0e900b1c4e994ca3c5c8e4f22c427 - - cc81bd1a52b34c648b054d35eb6cbc79 - - 3b215288ca8708f4caa114a8aef7f9d8 - - 2ecf99e3b915beb4ca6817048d1eb5b5 - - 65b19103d8e4f9b4e8c4296dd2a0bc35 - - f2b2311b3e844904ba8e2339f1e81d68 - - 8834db4eda23c6c42bb4e2abcd94c966 - - 4c3c2f293267d484e8fc536970ecc041 - - 16ccf2adbf6613944b7a5ef2a2c9bf9b - - 732b3b5bb70153148a4f8060a8c3cfc9 - - d19cc58d2adc6ed4db6d20bfeec5b976 - - dd02f88e42311854aa50b62f139eabec - - 43c52c1ba9c55f14abab5fc44c7be474 - - 0dd4987a058b5ba4ba0c41a12d18fd6f - - 21edfeba80563a940872c4d290d9a058 - - 07051b56a0b24054690c84641592d2a1 - - 121256d1eabae4d4abca5d22383308fe - - a1ce23d71ee4e214e8dc6ff8fefa4280 - - c5bd9e5a32e762d4c838847b61274a58 - - 3d4d9c061a4d2b240bc519497506b247 - - e824ed7da695b7241a2cddcd0b54046b - - e3dbb3ffb5dbf0344878b8813b309060 - - afcb29dbca7175440bd361ce73915995 - - d3b607c1137643643b378eebc4dc9984 - - 822291e9cbf18ce40af90e72bc36f7de - - b48a9ed715ba3604c8ba42720215344b - - 478e9c241f40090438c6d3392dcfee38 - - f9a779bd46c2b86419c0688b79b75d22 - - 0e65daf5f10fed34db9fcca7a24b4c45 - - b89712f6c4646074c82c964fdd98d173 - - 69afca8a5244bde42a4d3ac60e1bbfba - - 9ed00795673c2c746a58037a36cb1b7c - - 679ffb09846868244845ad4366947c13 - - a41648f6f658bdd44be7506a4363fac3 - - 93c61cda02e1e4b47bdb9156a844be4b - - d331b371079920240924f18e7048ef13 - - 69906a6fe0634f14a9cee7376b2bbe93 - - 216b5d592d305924485b22ed4b7f2c7a - - 2788360264257894ea3f09645a7db580 - - 12d3ea05e37cfa044a4bd641bf8cdf4f - - ac71388c314282149b9a9d9e18ad5b81 - - d286cf211b845c44091be9d9b16f0920 - - 9863c79e679056b42a70c4b91ca3a0a1 - - 9a29b158a79ee7d46ba722818c3fb9e1 - - 2ed530121eace7240ad4716be1e4688c - - 40561fac9ae53a449b514f20fd16dad2 - - 62448942192bcd548952db453639c279 - - e93e276051f234a46a9f5469c67f3363 - - 6521a1b57edcb7f4cb94fa2c12d3362d - - ea2082e6fa848d648a757ad55c43590e - - c6662b4330942184ca8726cbfa38737e - - 6c8e3f0b8eb48f647a5d6ab43f55597a - - db036c106d4e16b429aea68d34e488d8 - - e50cbb6848cb8c049a97be06e3963a49 - - 05d151d51de1e4842b1da66e40e92b07 - - d394f692613dd114dac03f9d08aca058 - - ac42ee10a9d24ec4dbb010d41021dc7d - - 18b17c96c46e9e645bda1f755ae13878 - - b3dbafa74ed90604592400b550f475b6 - - 849ca908afbdd034586a04354fe038bb - - fec9933928f69604a82baa26db792fdf - - 60e1f812abb1ed24f85211090dce5d08 - - 45dd852c79f652649ae6ea8de70465fd - - f494f421aa0eeb941bee59c9970944f6 - - fca532be86ea3504baf712598d9b60f6 - - e61aa37feb02c7641a89fe9eee4cc2af - - b5a8625bc248435408d1d50a43082141 - - 1145d192fe452d94790e759018b80598 - - 45ce1fac349165b46871f31ab0d1260b - - db8a291d0d86d3e4387f64a283f5dc1b - - c465c2d1d405b0643bc205247fee3975 - - e7a108efe9d0a244886f84af1e4802db - - 5aedc5db9b6fa5a4090f8c5d53f74a79 - - 83e93acff628c8e46baee7b8a63f9ae8 - - b197d3b224ab32b4d8f2d1420d3ec817 - - 4cb1a785fb0b4c4459dabbf7ea7509af - - 178296c851f6e8b40b0b7a9474eb102c - - f9053624f1a193246bc2b4ae8afdd145 - - 28131bd2ae426c04790c275743801679 - - afd6938eb60552c46a0f6fec67b9da7b - - b52591905fc7201459529052750fba7b - - cfbe3e489a697744289a8c6ab47bdf4c - - 5e2efc94d36a72c4cbbd0c561d898208 - - 19a3323fd7b541e4c9e1a13e29e0260e - - 3eee97fe5e666a24fb31956f89614b40 - - 7a068f8a770c28b45b09ceb5e4264564 - - 923f63432a14a7a4c96d25da669c6784 - - 0fa96d46a2887a8458201ed710b5ec10 - - ea1f843489575614da206621448f9a1c - - 948b017306fa70547875d5510de45b71 - - 52ba4cda79d4559418f895baa707e0e5 - - cd580c7c53641b54e9a708ec6a4dcdf9 - - 803dd39ffd16c8e49b7bcc832e7e6244 - - aa1e76854ba836948818b4580ae31b5b - - 280de78e6d8946f45a3361ef2e925efc - - 648a1d9c63c34b044b60ce3b2e99a6b8 - - 1aaf36d4754a593458e921a3de3bd00b - - c5df348e07785df48952d6526a5a5ac0 - - bad20da5b90e80a42bbf497fb17e67d2 - - 518b48ae9abacf94a8738dcdcdaa255e - - e7bdf6730acde3648b085cf125ad4b72 - - 4653044680e57b84f94c20c0c1488532 - - a9eb661abde09fa4c9a6962527aa6553 - - 8fb91a5f897d0f746acbf437cafa45c1 - - eb32c65c8c856054d804df393053cb60 - - ca755dcf281bcbe4abfa0fba64cd8957 - - 8705ac0eaf466da498ad94f34ba66716 - - 58e591d685ba28543a20329c328170ff - - 71c506ef9c1da0d45b6dc2d8f16b10f6 - - 79e05469bb6438f45b99431c543f570d - - f911cd2d937a33a44840d112a2d76f28 - - 6b5e638fc27d3bc49be9d2d3dc79d257 - - af0dac6c1ca6c694090f6eaff8e7d072 - - 3af8077d896392b4e90e701d4d95837d - - 10caeacabb80c364085aec11c8c4b261 - - 420dd5d1248cb0341a000a4d61bf1aae - - f45047b525ac4994fa969ac090aeb616 - - fd68d0a208de5ca4cb28270560469984 - - d334f291781af434797a9761b6833298 - - cc95af07d5e337f418a6f3bbf06db791 - - 0f90789ecf32057438f8644bb731048f - - c54706c1f007b7840b2394716d6c00d6 - - 03a76221878c0ba4ea2d2a289ea03a93 - - b4d935cc376fab14a9e1b3e0aa772536 - - de14e8689d475944a817ebf5949e8b6a - - c49b450f5e520ee438b5f4c855159343 - - 4b9a9efb79a3d9f48b652d46aafdc1bf - - 457917b0da929e549a1ba415cfaa6ed1 - - 0e2c8b26da7e56542ac0aa049daef7bd - - 113003588a968114c84195ec742b270d - - 6bc01ae219687074d962f1f47c509d02 - - b7677bcd0bfe5cd41b956b002d039248 - - d687f389f660f344cb6c09d4b9c8b272 - - c14f3bed655c4ca459dc00b243898e70 - - 9d2b1e50eedf96049966f8d4beed702f - - 332ce1167f0db7543bb18426623b8f9c - - 179130c7c49cf764e81e3222fa307e92 - - 1d750b161945f82429a70e6c74ea580d - - 5c627a3bcd03c96408574a3d2dfc1e64 - - 974a072ce260dd147a6f27bc0217cd0f - - 26ee334d87754944d9e58904b3fab5b1 - - 175fc4bc24a8073439837bd95182fcdb - - 7386f95faa558804dbf26272d5320bf9 - - 4838bba8e7fc5d6439e4ca0ab60a18bc - - 653754e9971228644ae46b36916cbd70 - - b52be42ca8bcc75478258bf27cfa6355 - - ab8c49c1f8a04bf46bf9f61bd8fe1064 - - 2b5c498736986ff40957a8d15b538be4 - - 96992109a12a39c47b953446e50f6477 - - eb5f0448e1b6ee048ba33b62ff78526f - - c285f6f566cfe644e9d3e9b26080ef2d - - 354a6df4ce8249f4cbe9c0e207e2b674 - - 43db984a982afff4485cd0420d8c18df - - c89f8883dc904534fb8c852a349c7fe6 - - 3064f77b1c5060c4e9618581613fe2d2 - - ba236f6f2564fed4cb89f442d9b68d3a - - 86b81cc46c8a66049883176fa3b31145 - - b515af4b22b07f446a50981233e1c2fa - - f56041086f363ee4ba74fc5d0cbd416e - - ad887924c62aeb444aef1c3c2b181f48 - - 241ab8d4f21f7ac4ea24f1954f03b985 - - 38a9a8f87ea6228428692812ea8fbbd6 - - 48ff67976036c3b4a820c2a26b66d973 - - c47e6ee1fdd10de43b099309ecf8cd6d - - ac01e92192815514e81015a6ad74bc0d - - 3d5f77930bbfeaf42991cb069ba24b9b - - 967a5088701348f4bb6f01e14c29194a - - 41f629758020ccd4ba68a171967249b5 - - d11b94c4a14a18a42b239635025a1b7b - - 0cfef4e9834568e41aa914a30fec3550 - - 52ead57775e5a8a43ae2d25e05e27348 - - ff0b72d7951c48943a625dc490c0748b - - fb3678544f23f08428a4e786b1f81aff - - 5ab77cac1869b374c82adebad1f5662e - - 17963c8ae87ec5b4997e0faa1fddf104 - - e8fe6cd13b019ab448712d875e4c2484 - - abdba50c6305d664e93598e3420bf9a8 - - bac4d957d2007d5438edf0609d156086 - - e7ac031090a79fe44b6e6b8969c21b63 - - 26d91fc3ee7e23346acb2d0bc40619bc - - 538c6f5d4a9c3ad47bf156ea8a4225a4 - - 796713721277f0341ad37557eda986ec - - ca15c5518a933f54683ab2697c8d87b0 - - f9c949e440802be48abec4318e7f747c - - 1e6b07e3f674c4a459c813d343ce9cfc - - 9b773200f8e7b9546843e8f793528cd6 - - dbcb85ed784a4fd429d2865a9cefe593 - - 4781a676c10989146aafd141200a0a12 - - fc48348bf09b68c4bbd672c1bcd578e0 - - 0a8c10933e652784398a5143b1b1bbb4 - - 1b8203a3ec6f07242b7da5ef5c21c985 - - 37a20e6e374929148869c0769745beb0 - - dfca4796bd63ada4098a67dd2ecb2a07 - - 8669e6ae6ca46cb4cb139fd353aabd2b - - 3a7d443c489fed14fa33a6b6c04bbad3 - - 2a3f59d00e6f02846bdb5e13847fffa6 - - bfd3eafa3e577bb4bb3489482e741eb1 - - 4bff8591051ae364089ea59b6dbfb111 - - cacheKey: - requiredType: - assemblyQualifiedName: RoR2.EquipmentDef, RoR2, Version=0.0.0.0, Culture=neutral, - PublicKeyToken=null - entriesIncludeComponentFoundInChildren: 0 - cacheHit: - pathCache: - - RoR2/Base/BFG/BFG.asset - - RoR2/Base/Blackhole/Blackhole.asset - - RoR2/Base/BurnNearby/BurnNearby.asset - - RoR2/Base/Cleanse/Cleanse.asset - - RoR2/Base/CommandMissile/CommandMissile.asset - - RoR2/Base/CrippleWard/CrippleWard.asset - - RoR2/Base/CritOnUse/CritOnUse.asset - - RoR2/Base/DeathProjectile/DeathProjectile.asset - - RoR2/Base/DroneBackup/DroneBackup.asset - - RoR2/Base/EliteFire/EliteFireEquipment.asset - - RoR2/Base/EliteHaunted/EliteHauntedEquipment.asset - - RoR2/Base/EliteIce/EliteIceEquipment.asset - - RoR2/Base/EliteLightning/EliteLightningEquipment.asset - - RoR2/Base/EliteLunar/EliteLunarEquipment.asset - - RoR2/Base/ElitePoison/ElitePoisonEquipment.asset - - RoR2/Base/FireBallDash/FireBallDash.asset - - RoR2/Base/Fruit/Fruit.asset - - RoR2/Base/GainArmor/GainArmor.asset - - RoR2/Base/Gateway/Gateway.asset - - RoR2/Base/GoldGat/GoldGat.asset - - RoR2/Base/Jetpack/Jetpack.asset - - RoR2/Base/LifestealOnHit/LifestealOnHit.asset - - RoR2/Base/Lightning/Lightning.asset - - RoR2/Base/LunarPotion/LunarPotion.asset - - RoR2/Base/Meteor/Meteor.asset - - RoR2/Base/PassiveHealing/PassiveHealing.asset - - RoR2/Base/QuestVolatileBattery/QuestVolatileBattery.asset - - RoR2/Base/Recycle/Recycle.asset - - RoR2/Base/Saw/Saw.asset - - RoR2/Base/Scanner/Scanner.asset - - RoR2/Base/TeamWarCry/TeamWarCry.asset - - RoR2/Base/Tonic/Tonic.asset - - RoR2/DLC1/BossHunter/BossHunter.asset - - RoR2/DLC1/BossHunter/BossHunterConsumed.asset - - RoR2/DLC1/EliteEarth/EliteEarthEquipment.asset - - RoR2/DLC1/EliteSecretSpeedEquipment.asset - - RoR2/DLC1/EliteVoid/EliteVoidEquipment.asset - - RoR2/DLC1/GummyClone/GummyClone.asset - - RoR2/DLC1/IrradiatingLaser/IrradiatingLaser.asset - - RoR2/DLC1/LunarPortalOnUse/LunarPortalOnUse.asset - - RoR2/DLC1/Molotov/Molotov.asset - - RoR2/DLC1/MultiShopCard/MultiShopCard.asset - - RoR2/DLC1/OrbOnUse/OrbOnUse.asset - - RoR2/DLC1/VendingMachine/VendingMachine.asset - - RoR2/DLC2/Elites/EliteAurelionite/EliteAurelioniteEquipment.asset - - RoR2/DLC2/Elites/EliteBead/EliteBeadEquipment.asset - - RoR2/DLC2/HealAndRevive/HealAndRevive.asset - - RoR2/DLC2/HealAndRevive/HealAndReviveConsumed.asset - - RoR2/DLC3/Collective/EliteCollectiveEquipment.asset - - RoR2/DLC3/DroneShockDamage/DroneShockDamage.asset - - RoR2/DLC3/GroundEnemies/GroundEnemies.asset - - RoR2/DLC3/Parry/Parry.asset - - RoR2/InDev/EliteEchoEquipment.asset - - RoR2/Junk/EliteGold/EliteGoldEquipment.asset - - RoR2/Junk/EliteYellow/EliteYellowEquipment.asset - - RoR2/Junk/Enigma/Enigma.asset - - RoR2/Junk/GhostGun/GhostGun.asset - - RoR2/Junk/OrbitalLaser/OrbitalLaser.asset - - RoR2/Junk/SoulCorruptor/SoulCorruptor.asset - - RoR2/Junk/SoulJar/SoulJar.asset - guidsCache: - - f8b51477b5b507a4ba5d67cb26bda08a - - 50a4c6a7a5fdae24d92ee191ded0dcbe - - fc5a84e488b7f0f4aa2c1381cb2d2bd2 - - 1f41a06b0810ad5499c1a7ce63b2b2b0 - - 1d6dbff51f1a7564895375a59f07224e - - 8d939374387401e48a7ab7ec0f6545a3 - - b4638a5cc1d40c54c8e79b26638d6483 - - 88bacb502a3be6742b61436ba3b7f4f7 - - 3f3410d1beaa12f4490cb3be42cff88c - - ff9f264d18696494f920343be0bf938a - - e0cb1a7d6e97bb14d9256eabaf1c0b9b - - 4fc94356fd66a3142ae700bb460d1d8c - - fd4fd78564c97074b8911e66a23edbae - - 3ce4d6625eb1f2a4ba4e37b91c003334 - - 2b9b9a2bc8a39ad4d914da2d2ee4cdcb - - 22687fd69235033438e735b3ca3d2f12 - - c3098e2e4e6068b4faa78bcd952a1424 - - a16e87db1bc887a4583c4548dc59f51d - - 6bdcb0f4b6c80934aa8ff405f1f3db9b - - ecb0e48503192bb4abb09cde35b1bed6 - - 873d3b3321a739b4daf54350025090fe - - 976f5123f7fa62d4fbc54a04fc3fb660 - - 6a73d16b14a98b44da68a19f6d4df11b - - c642e898b75178a478611bc8ffc2ee45 - - 26121c1f1c4ae4140a1c0e2ae66a88cf - - 97d489e6e655df6418679b52cba497eb - - 4a2e54023e78911418767d5fcd8e38ca - - 78c9d7a4ba99a904d8f4e6bfb8bb13df - - 94d9022a7ab277549b85f1a633651555 - - 77c68034a2db51445b14276c921c6ac1 - - c512bd35181ff6849973d9c69ea8abcc - - 9e403ea1e8b5ec34b9add8f1c58f5a48 - - 92eb13f35db09b742a7c226bfc1c9cc2 - - 5e7807aa85141ed40a32326034306262 - - 463f8f6917dd8af40860b023a520f051 - - ffbd772b538e7de4480ca551087d388d - - 118960de11f213c45806f7f0d2aef4d6 - - a15a8baf2133ea1448208cfa9a4825bb - - a16aefbd033a5bf4ba64d4be767e6778 - - 93d1d517eef33e441bae6f3e05b1616c - - 2de9b0fe378f2a1418b919c0c3f3bf17 - - f2ddbb7586240e648945ad494ebe3984 - - f57c070e0f539fc43984e2b0cddf665e - - 4912cf00a681de44db00017fbec96474 - - d9114002dc5efcf4db59392053697322 - - 8e33f06887d0c2d4795d76929129dbc7 - - 618c852a7b17f584ea0983e1dbdcd077 - - b3a4a3d5f1902fd4b8375d4e57a77995 - - 20230db692192a54d8ca7612828bd789 - - 3f25633544085e2419dd3a257c94388b - - 27661d5a7ee254a41ab0f24e4460dd21 - - a2a2d15558093a44682cda4a5a493b3a - - f9ba4d44cd2902a448c7f083101efedc - - 414d73e12c16c324186d6ab3b147c8f9 - - b89c0e0a4067316419fdbc2ff45e3f56 - - 2bce2af7385d949428e2cc9c88f67f87 - - cd23c9149871bc74fbe5ebb045451580 - - ea7cf737eff20fa4fb53103c410d546a - - c99bb48c86caa65438998b971246786d - - 299c40d1d303944429c7c4a220f28b69 - - cacheKey: - requiredType: - assemblyQualifiedName: RoR2.ItemDisplayRuleSet, RoR2, Version=0.0.0.0, Culture=neutral, - PublicKeyToken=null - entriesIncludeComponentFoundInChildren: 0 - cacheHit: - pathCache: - - RoR2/Base/Bandit2/idrsBandit2.asset - - RoR2/Base/Beetle/idrsBeetle.asset - - RoR2/Base/BeetleGuard/idrsBeetleGuard.asset - - RoR2/Base/BeetleQueen/idrsBeetleQueen.asset - - RoR2/Base/Bell/idrsBell.asset - - RoR2/Base/Bison/idrsBison.asset - - RoR2/Base/Brother/idrsBrother.asset - - RoR2/Base/Captain/idrsCaptain.asset - - RoR2/Base/ClayBoss/idrsClayBoss.asset - - RoR2/Base/ClayBruiser/idrsClayBruiser.asset - - RoR2/Base/Commando/idrsCommando.asset - - RoR2/Base/Core/idrsNone.asset - - RoR2/Base/Croco/idrsCroco.asset - - RoR2/Base/DroneBackup/idrsStrikeDrone.asset - - RoR2/Base/Drones/idrsBackupDrone.asset - - RoR2/Base/Drones/idrsDrone1.asset - - RoR2/Base/Drones/idrsDrone2.asset - - RoR2/Base/Drones/idrsEmergencyDrone.asset - - RoR2/Base/Drones/idrsEquipmentDrone.asset - - RoR2/Base/Drones/idrsFlameDrone.asset - - RoR2/Base/Drones/idrsMegaDrone.asset - - RoR2/Base/Drones/idrsMissileDrone.asset - - RoR2/Base/Drones/idrsTurret1.asset - - RoR2/Base/ElitePoison/idrsUrchinTurret.asset - - RoR2/Base/Engi/idrsEngi.asset - - RoR2/Base/Engi/idrsEngiTurret.asset - - RoR2/Base/Engi/idrsEngiWalkerTurret.asset - - RoR2/Base/FusionCellDestructible/idrsFusionCellDestructible.asset - - RoR2/Base/Golem/idrsGolem.asset - - RoR2/Base/Grandparent/idrsGrandparent.asset - - RoR2/Base/Gravekeeper/idrsGravekeeper.asset - - RoR2/Base/GreaterWisp/idrsGreaterWisp.asset - - RoR2/Base/Heretic/idrsHeretic.asset - - RoR2/Base/HermitCrab/idrsHermitCrab.asset - - RoR2/Base/Huntress/idrsHuntress.asset - - RoR2/Base/Imp/idrsImp.asset - - RoR2/Base/ImpBoss/idrsImpBoss.asset - - RoR2/Base/Jellyfish/idrsJellyfish.asset - - RoR2/Base/Lemurian/idrsLemurian.asset - - RoR2/Base/LemurianBruiser/idrsLemurianBruiser.asset - - RoR2/Base/Loader/idrsLoader.asset - - RoR2/Base/LunarExploder/idrsLunarExploder.asset - - RoR2/Base/LunarGolem/idrsLunarGolem.asset - - RoR2/Base/LunarWisp/idrsLunarWisp.asset - - RoR2/Base/Mage/idrsMage.asset - - RoR2/Base/MagmaWorm/idrsMagmaWorm.asset - - RoR2/Base/Merc/idrsMerc.asset - - RoR2/Base/MiniMushroom/idrsMiniMushroom.asset - - RoR2/Base/Nullifier/idrsNullifier.asset - - RoR2/Base/Parent/idrsParent.asset - - RoR2/Base/RoboBallBoss/idrsRoboBallBoss.asset - - RoR2/Base/RoboBallBoss/idrsRoboBallMini.asset - - RoR2/Base/Scav/idrsScav.asset - - RoR2/Base/Shopkeeper/idrsNewt.asset - - RoR2/Base/Squid/idrsSquidTurret.asset - - RoR2/Base/Titan/idrsTitan.asset - - RoR2/Base/Toolbot/idrsToolbot.asset - - RoR2/Base/Treebot/idrsTreebot.asset - - RoR2/Base/Vagrant/idrsVagrant.asset - - RoR2/Base/Vulture/idrsVulture.asset - - RoR2/Base/Wisp/idrsWisp.asset - - RoR2/DLC1/AcidLarva/idrsAcidLarva.asset - - RoR2/DLC1/Assassin2/idrsAssassin2.asset - - RoR2/DLC1/ClayGrenadier/idrsClayGrenadier.asset - - RoR2/DLC1/DroneCommander/idrsDroneCommander.asset - - RoR2/DLC1/FlyingVermin/idrsFlyingVermin.asset - - RoR2/DLC1/Gup/idrsGeep.asset - - RoR2/DLC1/Gup/idrsGip.asset - - RoR2/DLC1/Gup/idrsGup.asset - - RoR2/DLC1/MajorAndMinorConstruct/idrsMajorConstruct.asset - - RoR2/DLC1/MajorAndMinorConstruct/idrsMegaConstruct.asset - - RoR2/DLC1/MajorAndMinorConstruct/idrsMinorConstruct.asset - - RoR2/DLC1/Railgunner/idrsRailGunner.asset - - RoR2/DLC1/Vermin/idrsVermin.asset - - RoR2/DLC1/VoidBarnacle/idrsVoidBarnacle.asset - - RoR2/DLC1/VoidJailer/idrsVoidJailer.asset - - RoR2/DLC1/VoidMegaCrab/idrsVoidMegaCrab.asset - - RoR2/DLC1/VoidSurvivor/idrsVoidSurvivor.asset - - RoR2/DLC2/Chef/idrsChef.asset - - RoR2/DLC2/Child/idrsChild.asset - - RoR2/DLC2/FalseSon/idrsFalseSon.asset - - RoR2/DLC2/Halcyonite/idrsHalcyonite.asset - - RoR2/DLC2/Scorchling/idrsScorchling.asset - - RoR2/DLC2/Seeker/idrsSeeker.asset - - RoR2/DLC3/DefectiveUnit/idrsDefectiveUnit.asset - - RoR2/DLC3/Drifter/idrsDrifter.asset - - RoR2/DLC3/Drone Tech/idrsDroneTech.asset - - RoR2/DLC3/Drones/idrsBombardmentDrone.asset - - RoR2/DLC3/Drones/idrsCleanupDrone.asset - - RoR2/DLC3/Drones/idrsCopycatDrone.asset - - RoR2/DLC3/Drones/idrsDroneBomber.asset - - RoR2/DLC3/Drones/idrsDTHaulerDrone.asset - - RoR2/DLC3/Drones/idrsHaulerDrone.asset - - RoR2/DLC3/Drones/idrsJailerDrone.asset - - RoR2/DLC3/Drones/idrsJunkDrone.asset - - RoR2/DLC3/Drones/idrsRechargeDrone.asset - - RoR2/DLC3/ExtractorUnit/idrsExtractorUnit.asset - - RoR2/DLC3/FriendUnit/idrsFriendUnit.asset - - RoR2/DLC3/IronHauler/idrsIronHauler.asset - - RoR2/DLC3/MinePod/idrsMinePod.asset - - RoR2/DLC3/SolusAmalgamator/idrsFlamethrowerCannon.asset - - RoR2/DLC3/SolusAmalgamator/idrsMissilePod.asset - - RoR2/DLC3/SolusAmalgamator/idrsSolusAmalgamatorBoss.asset - - RoR2/DLC3/SolusAmalgamator/idrsThruster.asset - - RoR2/DLC3/SolusMine/idrsThruster.asset - - RoR2/DLC3/SolusWing/idrsSolusWing.asset - - RoR2/DLC3/Tanker/idrsTanker.asset - - RoR2/DLC3/VultureHunter/idrsVultureHunter.asset - - RoR2/DLC3/WorkerUnit/idrsWorkerUnit.asset - - RoR2/Junk/AncientWisp/idrsAncientWisp.asset - - RoR2/Junk/ArchWisp/idrsArchWisp.asset - - RoR2/Junk/Assassin/idrsRoboAssassin.asset - - RoR2/Junk/Bandit/idrsBandit.asset - - RoR2/Junk/ClayMan/idrsClayman.asset - - RoR2/Junk/HAND/idrsHand.asset - - RoR2/Junk/PotMobile/idrsPotMobile.asset - guidsCache: - - ffea13199016c4e4092b864bc59963ad - - 322a5e452db7a0349bee49207cfb2123 - - fece71c1e492a0f438075fea8832fd6f - - cc54a280603ce03429294dcbe5fe2e2e - - 73d5735eceffe06489510a1f11a71f65 - - 63c4086f1b5f7c548a82d190d04fc143 - - 8464d010b0eb5874087422831a1044e2 - - 5fa2b0eaf6b131a44b5fbe48bac602fc - - af09429073bdad54e93a8cee326c98e1 - - 1b243683536da4b43b3a8ce850fbad8a - - 7d6fc2aa6fd5d5b47b3b39a7abf9c951 - - 1b03760dbbc74a34289e67486b831f62 - - 70356ba47794caf48a34625ce3b8442f - - 01862a8dd15bc6e4a9ef7d03a16e37ae - - fadd4085e6433274b8666a2d224f3905 - - b885310f48d366643a35aa3d29dddfda - - fbf59cc865daebc43bb6f64665de4051 - - e41df75420286364199c62cd5f17f946 - - 35afb92e00847de4a9f73f843ff33384 - - b9d4a47c45ce5154bb68a1eeea2d8010 - - 391ee0e41b6ed504aa3009df76d08a39 - - 954167ffa5109704db6a8d500c174224 - - 8e2ba4ec55103ff4585554d92e2611a8 - - 28b0b23e9c4a2e64894aac312942a615 - - 1b577943ff3308142a3def6a58446ecf - - 3aec5746b27f9b744bc2ac3efc5847d9 - - 7033b005e9ef98c4b96fadc5d816fa62 - - 9ece21dbf12fa414bba37aaa42c42d17 - - 8c26b97be9bef2f4690d98258ff8bcb5 - - cc0f862e9dd1c9b4d8df24c8a0d51577 - - c50164cd9a54ce84383d5892edabb382 - - dc0536c8029a5ae47abd7373e2296bb5 - - 0f4b53eafc0d1934eabccfa930e90816 - - 89e5e01e9a5447e4ba5701873efb6074 - - 073f1d77c0d808240b5404fc6d0a4c88 - - 542679c002051b844a83426dd874e4c9 - - 6d4b4a2d8a9b1554da3758590ac700b2 - - 3afa462e93b5f1443bd8cf84b3dad515 - - 4409628366589f04baa797fb48bf7386 - - 450392afe7be1cf46b450361cbcb876c - - 20a7e7f739f6ac84cb8b9d641a179713 - - c90b7466017dae2409bcf63d4d87a819 - - 2267a1c58f2a49a4e97c1bac7c07cb03 - - 56fb6d72c43a44d4fb988a29bb782174 - - 439b59d9c7033d444b14ca8400232532 - - 7ce0109c76dca434d90d3801cdf29e5c - - c3a3fa07aaccea24abc93cf90166fa0d - - f6e3e105c2d53344ea0f510d3b945abe - - 2a1e3aa61263d0e48860733269971e4e - - a4eec23ec0654b047bf06a9a93e5f30a - - 2d41357d5bec41147be42ecc8a8fc5b4 - - 26a865733b30c7741af13663e7927490 - - f5bda7d11b594d74e9e8cffcc5ee521b - - 317a62a8f32274947a964644efee737e - - a5ecc05ba28539b4eb5f9bec55c3c4fc - - 0314b4d7970e7684f816e75a2c83837f - - f9fa5389670c16b41a3f036f547c928d - - 38951619ee759b1489143b3fd4f0771f - - ed1727397a6b0e046870e593d7a95fab - - fb3eb1bc8b7160a45821f6116e2bf642 - - de4337c3785ce044a97fcc0f95115b6e - - f83fd7257a4f7404ba290e9f43717960 - - 18e2be81afd31b64491182c8deee2581 - - cb9b6a9066bda7d43a74e51e17d44c7c - - df1e1b17f3786c44587a9f50be2a81c6 - - d1f9100bb0816e943ab73777c4b1c9dc - - 87379478f528bb8469d8a59106a4bd90 - - aac27bb99e7f04143bd7a9b160adbb81 - - b273a7b162d1a344f9ede92f48721886 - - e7051f19ae8673b42945cdf3237b02c3 - - 8e27ad0f799b3cd4ca720be4427bea54 - - 6fc9b746607b41b40bed5215e6979bb3 - - 8fb06b526e229f34e802f5754f4f918f - - 5d5a451f70214e549961ef08134807bb - - 36904b34349627940999314e54120a1e - - c9550f1020b527d44b8d591474b24c0f - - 1011af1ee36365e47be5c6f44c08ad17 - - dc2058c94a60d83498d3f9c9d0770ed7 - - 8e269ac3abf76654d97d61fe200c43e9 - - f5272a344baa6f14088b4b0d32a1096a - - cb633d193b0070640b2e939e46f1846c - - 6d7d01bfe46b8d84c84a8add089ab632 - - e0c097555d69d2c4d9840e6795dbcb89 - - a2be2352e43d5c540882e13e1a7b263d - - d2cc87a09f1ee604e84682cd255ced64 - - d329cfbc3d24a3c469a935759ef5119b - - 9a46bd09657e6ac46a941d84b2b5bb78 - - c8a43864bbd10da4e86430027ea9d56f - - 68d90512f67f77e4080ca340eacaee37 - - 1873606d90e6157458f2d358597d2800 - - 60f1e12534e8d1b42b3d7fd6f9392fed - - ed0a6cbdc73fbc6459d813313a8fb7cd - - 9827a37fe6c97e1439d54033257c0734 - - 2c323f3c85abe4645ae46ddf49ef30b4 - - 0c4dfecb518445649be069702264920a - - cf39203fd779e0747a18010b97cb6029 - - 55d20ec350406904b92e6d39072653d6 - - eac430d002a9cd044ba9372df121b456 - - c3ea72d6114cb1d4c87706b0b1265d30 - - 5511d5a2ca40ae44abf5160ed5d8d5d5 - - 239fccb9243472d4e848fa702789be4a - - 63c3a8ed7822354418e8adc64dd4cc87 - - 617944f51561c2b4a903fde567792f4f - - 98a49c53154e5da4fbce4483945cb0e5 - - 264867b162c7ee74c934cea75e598434 - - 9a6c0bea72d9a7242bddfc9397eeede0 - - cf60f06a4cd015e448a3e851432da311 - - c1834f5bf30f6bf44a38ba51f9e55b5e - - 670d410854d51af41b41fc6d1834e3a7 - - 2c5041dbe428e6f43b5ac7f8b990c514 - - 1bd5a05e0d8dab543854f79e3bc08442 - - bc72507d5f0ceea4a80f262f87e10016 - - 4dc93ed565737484eaa589cddedb5944 - - 78c9eb3a198a3334088bab3d4a18a989 - - 79e031d2a3ced264f9eab594d590128d - - 6c5433b81cfe52e47956fee12f62ff80 + _fileDateTimeTicks: 639082697420000000 + _serializedTypeResultCache: [] From f09f646261f29646e595d253658180be0b7d1e51 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sun, 19 Apr 2026 14:27:02 -0700 Subject: [PATCH 35/68] wayfarer tempeffect nre spam fix --- .../Modules/Characters/Monsters/LampBoss.cs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs index ac8f06f2b..250886f7e 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs @@ -86,25 +86,35 @@ public sealed class LampBuffBehavior : BaseBuffBehaviour private static BuffDef GetBuffDef() => SS2Content.Buffs.bdLampBuff; private TemporaryVisualEffect instance; + + // TODO: Maybe useful in SS2Utils + // Ensure cb is null null/destroyed before passing effect string + private string GetSafeChildOverride() + { + return characterBody.modelLocator && characterBody.modelLocator.modelTransform + ? effectChildString + : ""; + } + private void FixedUpdate() { if (characterBody && lampBuffEffectPrefab) { - characterBody.UpdateSingleTemporaryVisualEffect(ref instance, lampBuffEffectPrefab, characterBody.radius, characterBody.HasBuff(SS2Content.Buffs.bdLampBuff), effectChildString); + characterBody.UpdateSingleTemporaryVisualEffect(ref instance, lampBuffEffectPrefab, characterBody.radius, characterBody.HasBuff(SS2Content.Buffs.bdLampBuff), GetSafeChildOverride()); } } private void OnEnable() { if (characterBody && lampBuffEffectPrefab) { - characterBody.UpdateSingleTemporaryVisualEffect(ref instance, lampBuffEffectPrefab, characterBody.radius, characterBody.HasBuff(SS2Content.Buffs.bdLampBuff), effectChildString); + characterBody.UpdateSingleTemporaryVisualEffect(ref instance, lampBuffEffectPrefab, characterBody.radius, characterBody.HasBuff(SS2Content.Buffs.bdLampBuff), GetSafeChildOverride()); } } private void OnDisable() { if (characterBody && lampBuffEffectPrefab) { - characterBody.UpdateSingleTemporaryVisualEffect(ref instance, lampBuffEffectPrefab, characterBody.radius, characterBody.HasBuff(SS2Content.Buffs.bdLampBuff), effectChildString); + characterBody.UpdateSingleTemporaryVisualEffect(ref instance, lampBuffEffectPrefab, characterBody.radius, false, GetSafeChildOverride()); } } From 5e1504e1a0e80f179b3b10b8d8730be1ae965004 Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 14:43:15 -0700 Subject: [PATCH 36/68] ok model skin controller back on mdl I was lied to by Swuff --- .../Characters/Cyborg2/Cyborg2Body.prefab | 53 +++++++++---------- .../Characters/Cyborg2/Cyborg2Display.prefab | 53 +++++++++---------- 2 files changed, 52 insertions(+), 54 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab index 592e0d96e..62a431526 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Body.prefab @@ -38,7 +38,6 @@ GameObject: - component: {fileID: 4269496153077987429} - component: {fileID: 1004718732815417702} - component: {fileID: 3736198632451785268} - - component: {fileID: 5464692534816640513} m_Layer: 0 m_Name: Cyborg2Body m_TagString: Player @@ -786,32 +785,6 @@ MonoBehaviour: oldHeal: 0 oldFade: 0 forceUpdate: 0 ---- !u!114 &5464692534816640513 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2260960647979714696} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} - m_Name: - m_EditorClassIdentifier: - DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 - _animatorControllerAddress: - m_AssetGUID: - m_SubObjectName: - m_SubObjectType: - _animatorController: {fileID: 0} - _avatarAddress: - m_AssetGUID: - m_SubObjectName: - m_SubObjectType: - _avatar: {fileID: 0} - skins: - - {fileID: 11400000, guid: a38e0ea4218dc9e4bb177461ead40ffc, type: 2} - prefabInstantiationDatas: [] --- !u!1 &4426841502502991441 GameObject: m_ObjectHideFlags: 0 @@ -1856,6 +1829,32 @@ MonoBehaviour: oldHeal: 0 oldFade: 0 forceUpdate: 0 +--- !u!114 &6079387867497595865 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5008875975933509408} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: + m_EditorClassIdentifier: + DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 + _animatorControllerAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _animatorController: {fileID: 0} + _avatarAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _avatar: {fileID: 0} + skins: + - {fileID: 11400000, guid: a38e0ea4218dc9e4bb177461ead40ffc, type: 2} + prefabInstantiationDatas: [] --- !u!4 &5677010006892963226 stripped Transform: m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 577b3c79db118904c8eda5144dd41024, diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab index 25136dd46..c558294a0 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Cyborg2/Cyborg2Display.prefab @@ -41,7 +41,6 @@ GameObject: m_Component: - component: {fileID: 2942509041794450991} - component: {fileID: 6460089162439241661} - - component: {fileID: 3979966911097047151} m_Layer: 0 m_Name: Cyborg2Display m_TagString: Untagged @@ -100,32 +99,6 @@ MonoBehaviour: oldHeal: 0 oldFade: 0 forceUpdate: 0 ---- !u!114 &3979966911097047151 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8308556267028715609} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} - m_Name: - m_EditorClassIdentifier: - DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 - _animatorControllerAddress: - m_AssetGUID: - m_SubObjectName: - m_SubObjectType: - _animatorController: {fileID: 0} - _avatarAddress: - m_AssetGUID: - m_SubObjectName: - m_SubObjectType: - _avatar: {fileID: 0} - skins: - - {fileID: 11400000, guid: a38e0ea4218dc9e4bb177461ead40ffc, type: 2} - prefabInstantiationDatas: [] --- !u!1001 &8329871487314338267 PrefabInstance: m_ObjectHideFlags: 0 @@ -996,3 +969,29 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: soundCenter: {fileID: 0} +--- !u!114 &402126579458382863 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9176308721897938058} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1533710874, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: + m_EditorClassIdentifier: + DelayLoadingAnimatorUntilMaterialsHaveCompleted: 0 + _animatorControllerAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _animatorController: {fileID: 0} + _avatarAddress: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: + _avatar: {fileID: 0} + skins: + - {fileID: 11400000, guid: a38e0ea4218dc9e4bb177461ead40ffc, type: 2} + prefabInstantiationDatas: [] From 176d8cf4c3ac89cbfc13d545e58a5ed1c92f1d45 Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 14:58:52 -0700 Subject: [PATCH 37/68] changelog scaffolding --- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index aace24e66..abec836bf 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -1,4 +1,10 @@ **Warning: content spoilers below!** +### 0.6.40 (this branch) all your bugs belong to us +TODO ADD THIS BRANCHES CHANGES HERE + +## 0.6.39 Nemmando Games +- Swuff's Nemmando animation PR ideally, and my Ambush config PR + ### 0.6.38 * Beta * Got rid of MULE's hold to jump higher mechanic to fix MULE not working in release builds. If this doesnt work I give up I need to go work on the MULE rework anyways From 97a2e8606dc39b1fbdd7c854e856bc50262b0e9e Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sun, 19 Apr 2026 15:28:44 -0700 Subject: [PATCH 38/68] attempt to fix bug where tactical roll doesnt reload railgunners gun while scoped --- .../EntityStates/Railgunner/RailgunnerRoll.cs | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs index b187f4368..03f75aa87 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs @@ -1,5 +1,6 @@ using EntityStates.Railgunner.Reload; using RoR2; +using RoR2.Skills; using UnityEngine; using UnityEngine.Networking; @@ -53,11 +54,27 @@ public override void OnEnter() if (isAuthority) { - EntityStateMachine entityStateMachine = EntityStateMachine.FindByCustomName(base.gameObject, "Reload"); + EntityStateMachine reloadMachine = EntityStateMachine.FindByCustomName(base.gameObject, "Reload"); - if (entityStateMachine && entityStateMachine.state is Reloading reloadState && !reloadState.hasAttempted) + if (reloadMachine) { - entityStateMachine.SetNextState(new BoostConfirm()); + bool shouldReload = false; + + if (reloadMachine.state is Reloading reloadState && !reloadState.hasAttempted) + { + shouldReload = true; + } + else if (reloadMachine.state is Waiting && AnyRailgunSkillNeedsRestock()) + { + // Scoped or waiting reload is queued but blocked by scope gate + RestockAllRailgunSkills(); + shouldReload = true; + } + + if (shouldReload) + { + reloadMachine.SetNextState(new BoostConfirm()); + } } } } @@ -101,6 +118,29 @@ public override void OnExit() base.OnExit(); } + private bool AnyRailgunSkillNeedsRestock() + { + if (!skillLocator) return false; + for (int i = 0; i < skillLocator.skillSlotCount; i++) + { + GenericSkill skill = skillLocator.GetSkillAtIndex(i); + if (skill && skill.skillDef is RailgunSkillDef rsd && rsd.restockOnReload && skill.stock == 0) + return true; + } + return false; + } + + private void RestockAllRailgunSkills() + { + if (!skillLocator) return; + for (int i = 0; i < skillLocator.skillSlotCount; i++) + { + GenericSkill skill = skillLocator.GetSkillAtIndex(i); + if (skill && skill.skillDef is RailgunSkillDef rsd && rsd.restockOnReload) + skill.stock = skill.maxStock; + } + } + public override void OnSerialize(NetworkWriter writer) { base.OnSerialize(writer); From 49289e254fc7220191466acb697e88fa8d382497 Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 15:32:32 -0700 Subject: [PATCH 39/68] testing out an arti wayfarer skill --- .../InDev/Characters/Variants/Artificer.meta | 8 ++++ .../Variants/Artificer/acArti.asset | 16 +++++++ .../Variants/Artificer/acArti.asset.meta | 8 ++++ .../Variants/Artificer/escLampBarrage.asset | 18 ++++++++ .../Artificer/escLampBarrage.asset.meta | 8 ++++ .../Variants/Artificer/sdLampBarrage.asset | 45 +++++++++++++++++++ .../Artificer/sdLampBarrage.asset.meta | 8 ++++ 7 files changed, 111 insertions(+) create mode 100644 SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer.meta create mode 100644 SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/acArti.asset create mode 100644 SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/acArti.asset.meta create mode 100644 SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/escLampBarrage.asset create mode 100644 SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/escLampBarrage.asset.meta create mode 100644 SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/sdLampBarrage.asset create mode 100644 SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/sdLampBarrage.asset.meta diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer.meta b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer.meta new file mode 100644 index 000000000..ad4db9580 --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 451c4abbb7c529b478db836442b5dcfa +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/acArti.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/acArti.asset new file mode 100644 index 000000000..a7b19e67e --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/acArti.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c726deca6f3a3bd4982e0fea154271eb, type: 3} + m_Name: acArti + m_EditorClassIdentifier: + assets: [] + survivorDefAddress: diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/acArti.asset.meta b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/acArti.asset.meta new file mode 100644 index 000000000..3618588b2 --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/acArti.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e85dff241d70b51499ed1d3d0241bd71 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/escLampBarrage.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/escLampBarrage.asset new file mode 100644 index 000000000..d7f5ac5ca --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/escLampBarrage.asset @@ -0,0 +1,18 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 89795172, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: escLampBarrage + m_EditorClassIdentifier: + targetType: + assemblyQualifiedName: + serializedFieldsCollection: + serializedFields: [] diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/escLampBarrage.asset.meta b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/escLampBarrage.asset.meta new file mode 100644 index 000000000..e140ef72e --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/escLampBarrage.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cf2d0b5323996c14bafc44368063c390 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/sdLampBarrage.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/sdLampBarrage.asset new file mode 100644 index 000000000..719b69562 --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/sdLampBarrage.asset @@ -0,0 +1,45 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1391837873, guid: 951ce57ad999ac1f040a4dceb5f8b763, type: 3} + m_Name: sdLampBarrage + m_EditorClassIdentifier: + skillName: + skillNameToken: + skillDescriptionToken: + keywordTokens: [] + icon: {fileID: 0} + activationStateMachineName: + activationState: + _typeName: + interruptPriority: 1 + baseRechargeInterval: 1 + baseMaxStock: 1 + rechargeStock: 1 + requiredStock: 1 + stockToConsume: 1 + attackSpeedBuffsRestockSpeed: 0 + attackSpeedBuffsRestockSpeed_Multiplier: 1 + resetCooldownTimerOnUse: 0 + fullRestockOnAssign: 1 + dontAllowPastMaxStocks: 0 + beginSkillCooldownOnSkillEnd: 0 + isCooldownBlockedUntilManuallyReset: 0 + cancelSprintingOnActivation: 1 + forceSprintDuringState: 0 + canceledFromSprinting: 0 + isCombatSkill: 1 + mustKeyPress: 0 + triggeredByPressRelease: 0 + autoHandleLuminousShot: 1 + suppressSkillActivation: 0 + hideStockCount: 0 + hideCooldown: 0 diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/sdLampBarrage.asset.meta b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/sdLampBarrage.asset.meta new file mode 100644 index 000000000..209abe782 --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/sdLampBarrage.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 781a696bd8695234da7767f32f845c0a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: From 36cb5ba93d940c006fda06f03cfeed191e725c99 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 17 Apr 2026 02:29:13 -0700 Subject: [PATCH 40/68] self repair skill will be real --- .../Toolbot/SelfRepairController.cs | 108 ++++++------------ .../Components/Toolbot/SelfRepairSkillDef.cs | 12 +- .../Modules/Characters/Variants/Toolbot.cs | 18 ++- .../EntityStates/Toolbot/SelfRepair.cs | 34 ++++-- 4 files changed, 71 insertions(+), 101 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Components/Toolbot/SelfRepairController.cs b/SS2-Project/Assets/Starstorm2/Components/Toolbot/SelfRepairController.cs index 477fdc3bf..4bc5279d6 100644 --- a/SS2-Project/Assets/Starstorm2/Components/Toolbot/SelfRepairController.cs +++ b/SS2-Project/Assets/Starstorm2/Components/Toolbot/SelfRepairController.cs @@ -2,7 +2,6 @@ using RoR2.HudOverlay; using RoR2.UI; using System.Collections.Generic; -using System.Runtime.InteropServices; using UnityEngine; using UnityEngine.Networking; @@ -10,17 +9,17 @@ namespace SS2.Components { public class SelfRepairController : NetworkBehaviour { - public CharacterBody characterBody; public float repairMax = 10f; public float repairGainPerUpdate = 0.10f; - public GameObject repairOverlayPrefab = SS2.Survivors.Toolbot.RepairOverlayPrefab; - + public GameObject repairOverlayPrefab; public string repairOverlayChildLocatorEntry = "CrosshairExtras"; + + private CharacterBody characterBody; private OverlayController repairOverlayController; private List fillUiList = new List(); - [SyncVar(hook = "OnRepairModified")] + [SyncVar(hook = nameof(OnRepairModified))] private float _repair; public float repair { @@ -38,38 +37,26 @@ public bool isMaxRepair } } - public float Network_charge + public void OnEnable() { - get + if (!TryGetComponent(out characterBody)) { - return _repair; + Debug.LogError("SelfRepairController: Missing CharacterBody on " + gameObject.name); } - [param: In] - set + + if (repairOverlayPrefab != null) { - if (NetworkServer.localClientActive && syncVarHookGuard) + OverlayCreationParams repairOverlayCreationParams = new OverlayCreationParams { - syncVarHookGuard = true; - OnRepairModified(value); - syncVarHookGuard = false; - } - SetSyncVar(value, ref _repair, 1U); + prefab = repairOverlayPrefab, + childLocatorEntry = repairOverlayChildLocatorEntry + }; + repairOverlayController = HudOverlayManager.AddOverlay(gameObject, repairOverlayCreationParams); + repairOverlayController.onInstanceAdded += OnRepairOverlayInstanceAdded; + repairOverlayController.onInstanceRemove += OnRepairOverlayInstanceRemoved; } } - public void OnEnable() - { - OverlayCreationParams repairOverlayCreationParams = new OverlayCreationParams - { - prefab = repairOverlayPrefab, - childLocatorEntry = repairOverlayChildLocatorEntry - }; - repairOverlayController = HudOverlayManager.AddOverlay(gameObject, repairOverlayCreationParams); - repairOverlayController.onInstanceAdded += OnRepairOverlayInstanceAdded; - repairOverlayController.onInstanceRemove += OnRepairOverlayInstanceRemoved; - characterBody = GetComponent(); - } - private void OnDisable() { if (repairOverlayController != null) @@ -85,13 +72,13 @@ private void FixedUpdate() { if (NetworkServer.active) { - UpdateUI(); - if (!isMaxRepair) { AddRepair(repairGainPerUpdate); } } + + UpdateUI(); } private void UpdateUI() @@ -104,70 +91,41 @@ private void UpdateUI() private void OnRepairOverlayInstanceAdded(OverlayController controller, GameObject instance) { - fillUiList.Add(instance.GetComponent()); + if (instance.TryGetComponent(out ImageFillController ifc)) + { + fillUiList.Add(ifc); + } + else + { + Debug.LogError("SelfRepairController: Overlay instance missing ImageFillController"); + } } private void OnRepairOverlayInstanceRemoved(OverlayController controller, GameObject instance) { - fillUiList.Remove(instance.transform.GetComponent()); + if (instance.TryGetComponent(out ImageFillController ifc)) + { + fillUiList.Remove(ifc); + } } public void AddRepair(float amount) { if (!NetworkServer.active) { - SS2Log.Error("self repair controller add repair on client"); + SS2Log.Error("SelfRepairController: AddRepair called on client"); return; } if (isMaxRepair && amount > 0) amount = 0f; - Network_charge = Mathf.Clamp(repair + amount, 0f, repairMax); + _repair = Mathf.Clamp(repair + amount, 0f, repairMax); } private void OnRepairModified(float newRepair) { - Network_charge = newRepair; - } - - //let him cook - public override bool OnSerialize(NetworkWriter writer, bool forceAll) - { - if (forceAll) - { - writer.Write(_repair); - return true; - } - bool flag = false; - if ((syncVarDirtyBits & 1U) != 0U) - { - if (!flag) - { - writer.WritePackedUInt32(syncVarDirtyBits); - flag = true; - } - writer.Write(_repair); - } - if (!flag) - { - writer.WritePackedUInt32(syncVarDirtyBits); - } - return flag; - } - - public override void OnDeserialize(NetworkReader reader, bool initialState) - { - if (initialState) - { - _repair = reader.ReadSingle(); - return; - } - int num = (int)reader.ReadPackedUInt32(); - if ((num & 1) != 0) - { - OnRepairModified(reader.ReadSingle()); - } + _repair = newRepair; } } } \ No newline at end of file diff --git a/SS2-Project/Assets/Starstorm2/Components/Toolbot/SelfRepairSkillDef.cs b/SS2-Project/Assets/Starstorm2/Components/Toolbot/SelfRepairSkillDef.cs index bba169f29..c3c2b58cb 100644 --- a/SS2-Project/Assets/Starstorm2/Components/Toolbot/SelfRepairSkillDef.cs +++ b/SS2-Project/Assets/Starstorm2/Components/Toolbot/SelfRepairSkillDef.cs @@ -13,14 +13,16 @@ public class SelfRepairSkillDef : SkillDef { public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot) { - skillSlot.characterBody.gameObject.AddComponent(); + SelfRepairController selfRepairController = skillSlot.characterBody.gameObject.EnsureComponent(); + + if (SS2.Survivors.Toolbot.RepairOverlayPrefab != null) + { + selfRepairController.repairOverlayPrefab = SS2.Survivors.Toolbot.RepairOverlayPrefab; + } - SelfRepairController selfRepairMeter = skillSlot.characterBody.gameObject.EnsureComponent(); - //selfRepairMeter.repairOverlayPrefab = SS2.Survivors.Toolbot.RepairOverlayPrefab; - return new SelfRepairSkillDef.InstanceData { - selfRepairMeter = selfRepairMeter + selfRepairMeter = selfRepairController }; } diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Variants/Toolbot.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Variants/Toolbot.cs index 7a17b1eb4..933db2216 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Variants/Toolbot.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Variants/Toolbot.cs @@ -17,20 +17,17 @@ public class Toolbot : SS2VanillaSurvivor public override void Initialize() { - //GameObject toolbotBodyPrefab = Addressables.LoadAssetAsync("RoR2/Base/Toolbot/ToolbotBody.prefab").WaitForCompletion(); + GameObject toolbotBodyPrefab = Addressables.LoadAssetAsync("RoR2/Base/Toolbot/ToolbotBody.prefab").WaitForCompletion(); - //SkillLocator skillLocator = toolbotBodyPrefab.GetComponent(); - //SkillFamily primarySkillFamily = skillLocator.primary.skillFamily; - //SkillFamily secondarySkillFamily = skillLocator.secondary.skillFamily; - //SkillFamily specialSkillFamily = skillLocator.special.skillFamily; + SkillLocator skillLocator = toolbotBodyPrefab.GetComponent(); + SkillFamily secondarySkillFamily = skillLocator.secondary.skillFamily; - //RepairOverlayPrefab = assetCollection.FindAsset("ToolbotRepairUI"); + RepairOverlayPrefab = assetCollection.FindAsset("ToolbotRepairUI"); - //SelfRepairSkillDef sdSelfRepair = assetCollection.FindAsset("sdSelfRepair"); - - //AddSkill(secondarySkillFamily, sdSelfRepair); - //AddEntityStateMachine(toolbotBodyPrefab, "Toolbox"); // Used by skills like self-repair that dont want to interrupt weapon + SelfRepairSkillDef sdSelfRepair = assetCollection.FindAsset("sdSelfRepair"); + AddSkill(secondarySkillFamily, sdSelfRepair); + AddEntityStateMachine(toolbotBodyPrefab, "Toolbox"); } public override void ModifyContentPack(ContentPack contentPack) @@ -44,4 +41,3 @@ public override bool IsAvailable(ContentPack contentPack) } } } - diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Toolbot/SelfRepair.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Toolbot/SelfRepair.cs index 9fce33925..7394afeeb 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Toolbot/SelfRepair.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Toolbot/SelfRepair.cs @@ -1,35 +1,49 @@ using SS2.Components; +using UnityEngine; +using UnityEngine.Networking; namespace EntityStates.Toolbot { public class SelfRepair : BaseSkillState { - public float baseDuration = 1f; - private float duration = 3f; - private float healthGainPerRepair = 0.05f; - private float repairLossPerTick = 1f; + public static float baseDuration = 3f; + public static float healthFractionPerTick = 0.05f; + public static float repairCostPerTick = 1f; + public static float tickInterval = 0.5f; + private float duration; + private float tickTimer; private SelfRepairController selfRepairController; public override void OnEnter() { base.OnEnter(); - selfRepairController = GetComponent(); + duration = baseDuration / attackSpeedStat; + + if (!gameObject.TryGetComponent(out selfRepairController)) + { + Debug.LogError("SelfRepair: Missing SelfRepairController on " + gameObject.name); + } } public override void FixedUpdate() { base.FixedUpdate(); - if (base.fixedAge >= duration && selfRepairController.repair <= repairLossPerTick) + if (NetworkServer.active && selfRepairController != null) { - outer.SetNextStateToMain(); + tickTimer -= Time.fixedDeltaTime; + if (tickTimer <= 0f && selfRepairController.repair >= repairCostPerTick) + { + tickTimer = tickInterval; + characterBody.healthComponent.HealFraction(healthFractionPerTick, default); + selfRepairController.AddRepair(-repairCostPerTick); + } } - if (selfRepairController && base.isAuthority && selfRepairController.repair >= repairLossPerTick) + if (isAuthority && (fixedAge >= duration || selfRepairController == null || selfRepairController.repair < repairCostPerTick)) { - this.characterBody.healthComponent.HealFraction(healthGainPerRepair, default); - selfRepairController.AddRepair(-repairLossPerTick); + outer.SetNextStateToMain(); } } From f01ead8b7e6649c3b2b0134b74f644459868c2ab Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sun, 19 Apr 2026 16:21:35 -0700 Subject: [PATCH 41/68] me when I overengineer a solution --- .../EntityStates/Railgunner/RailgunnerRoll.cs | 36 +------------------ 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs index 03f75aa87..20786d15c 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs @@ -1,4 +1,3 @@ -using EntityStates.Railgunner.Reload; using RoR2; using RoR2.Skills; using UnityEngine; @@ -54,28 +53,7 @@ public override void OnEnter() if (isAuthority) { - EntityStateMachine reloadMachine = EntityStateMachine.FindByCustomName(base.gameObject, "Reload"); - - if (reloadMachine) - { - bool shouldReload = false; - - if (reloadMachine.state is Reloading reloadState && !reloadState.hasAttempted) - { - shouldReload = true; - } - else if (reloadMachine.state is Waiting && AnyRailgunSkillNeedsRestock()) - { - // Scoped or waiting reload is queued but blocked by scope gate - RestockAllRailgunSkills(); - shouldReload = true; - } - - if (shouldReload) - { - reloadMachine.SetNextState(new BoostConfirm()); - } - } + RestockAllRailgunSkills(); } } @@ -118,18 +96,6 @@ public override void OnExit() base.OnExit(); } - private bool AnyRailgunSkillNeedsRestock() - { - if (!skillLocator) return false; - for (int i = 0; i < skillLocator.skillSlotCount; i++) - { - GenericSkill skill = skillLocator.GetSkillAtIndex(i); - if (skill && skill.skillDef is RailgunSkillDef rsd && rsd.restockOnReload && skill.stock == 0) - return true; - } - return false; - } - private void RestockAllRailgunSkills() { if (!skillLocator) return; From 7ff2bcc715fa947d8c746fd99c98da5caf556d37 Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 16:30:02 -0700 Subject: [PATCH 42/68] changelog scaffolding --- .../Variants/Artificer/acArti.asset | 6 +- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 57 ++++++++++++++++++- .../Modules/Characters/Survivors/DUT.cs | 2 +- .../Modules/Characters/Survivors/MULE.cs | 2 +- 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/acArti.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/acArti.asset index a7b19e67e..102385691 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/acArti.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/InDev/Characters/Variants/Artificer/acArti.asset @@ -12,5 +12,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c726deca6f3a3bd4982e0fea154271eb, type: 3} m_Name: acArti m_EditorClassIdentifier: - assets: [] - survivorDefAddress: + assets: + - {fileID: 11400000, guid: cf2d0b5323996c14bafc44368063c390, type: 2} + - {fileID: 11400000, guid: 781a696bd8695234da7767f32f845c0a, type: 2} + survivorDefAddress: RoR2/Base/Merc/Mage.asset diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index abec836bf..4a6f57286 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -1,6 +1,61 @@ **Warning: content spoilers below!** ### 0.6.40 (this branch) all your bugs belong to us -TODO ADD THIS BRANCHES CHANGES HERE +This is a huge bugfix release, we want to start ironing out bugs as the team prepares for 0.7 sometime later this year. This version also includes some much requested community qol fixes like Drone/Ethereal interactions, Nerfs to Stormborn Clay Templars, Cyborg MP fixes, and lots of Knight fixes to bring Knight closer to complete. + +We are going to beginning priortising multiplayer stability in Beta moving forward, so more cautious fans can try SS2 Beta with friends. For that reason MULE/DU-T are going to be disabled. They both might return after DU-T gets additional polish and MULE gets his kit rework. Not that MULE was ever playable anyways.... + +* General + * Fixed Typhoon language tokens not appearing correctly if you adjusted Typhoon config + * Added back `unlock_all` config option. Only works on Survivors and Items for now + * Added config support to disable Curios (Beta items) and Elite Equipment +* Survivors + * Executioner + * Rare Executioner orb NRE fix (I cant seem to reproduce this one, but a null check was added where it happened) +* Storms + * Misc NRE fixes +* Drones + * Fixed Shock Drone VFX NRE + * Drones spawned by Drone Head now have a 4 second invincibility window to escape on death Elite attacks +* Elites + * Stormborn + * Clay Templars now recieve half of the attack speed buff when Stormborn + * Empyrean + * Empyreans are now invincible during their spawn animation + * Fixed Empyrean simulacrum interaction +* Enemies + * Mimic + * Fixed Mimic and Chirr death friend interaction + * Fixed Mimic's dead body being targetted by ATG and other items + * Wayfarer + * Fixed Wayfarer LampBuff TemporaryVisualEffect NRE spam + * Nemesis + * Fixed NRE when Nemesis spawns and players spawn in late + +* Beta + * Ethereal + * Fixed Ethereal teleporter icon placement (kind of, its still slightly too high, but its in the right spot now!) + * Ethereal pillars no longer destroy drones + * Fixed harmless NRE on Ethereal when closing the game + * Knight + * Knight now has a proper drop pod + +* Unconfirmed + * Knight + * Fixed Knight's parry not working correctly for clients + * Increased Knight's parry window to address latency issues + * Railgunner + * Tactical roll alt skill now properly reloads while scoped + * Cyborg + * Fixed bug where Cyborg could not charge the teleporter to 100% + * Fixed Cyborg's teleporter projectile spawning a duplicate as client + * Fixed Cyborg's shock mines not visually appearing as client + * Fixed Shard Poison / Shard Void Zanzan trader interaction + * Xi Construct no longer runs away when Fear'd by Executioner + * Fixed OpenSlow Curse interaction with Scavenger bags + * Self-Repair skill fixes + * New Arti alt special + * Follower no longer instakills or slams down clients when it grabs them with its beam in MP + ## 0.6.39 Nemmando Games - Swuff's Nemmando animation PR ideally, and my Ambush config PR diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/DUT.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/DUT.cs index efb762cf7..22be4c362 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/DUT.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/DUT.cs @@ -34,7 +34,7 @@ public override void Initialize() public override bool IsAvailable(ContentPack contentPack) { - return SS2Config.enableBeta && base.IsAvailable(contentPack); + return false; } private void DUTDrift(On.RoR2.CharacterBody.orig_RecalculateStats orig, CharacterBody self) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/MULE.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/MULE.cs index b02603259..5b5dcadf4 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/MULE.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/MULE.cs @@ -30,7 +30,7 @@ public override void Initialize() public override bool IsAvailable(ContentPack contentPack) { - return SS2Config.enableBeta && base.IsAvailable(contentPack); + return false; } public void ModifyPrefab() From 6b913a9645f61ed2db63f819b9be0b7ff96de3cf Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sun, 19 Apr 2026 18:18:57 -0700 Subject: [PATCH 43/68] even simpler now --- .../EntityStates/Railgunner/RailgunnerRoll.cs | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs index 20786d15c..dc6d2a930 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs @@ -1,5 +1,4 @@ using RoR2; -using RoR2.Skills; using UnityEngine; using UnityEngine.Networking; @@ -51,9 +50,12 @@ public override void OnEnter() //PlayAnimation("FullBody, Override", "Roll", "Roll.playbackRate", duration); Util.PlaySound(dodgeSoundString, gameObject); - if (isAuthority) + if (isAuthority && skillLocator) { - RestockAllRailgunSkills(); + if (skillLocator.primary) + skillLocator.primary.stock = skillLocator.primary.maxStock; + if (skillLocator.secondary) + skillLocator.secondary.stock = skillLocator.secondary.maxStock; } } @@ -96,17 +98,6 @@ public override void OnExit() base.OnExit(); } - private void RestockAllRailgunSkills() - { - if (!skillLocator) return; - for (int i = 0; i < skillLocator.skillSlotCount; i++) - { - GenericSkill skill = skillLocator.GetSkillAtIndex(i); - if (skill && skill.skillDef is RailgunSkillDef rsd && rsd.restockOnReload) - skill.stock = skill.maxStock; - } - } - public override void OnSerialize(NetworkWriter writer) { base.OnSerialize(writer); From 313fe8e8550c73d03ad94d1d9a67f52acf1c98db Mon Sep 17 00:00:00 2001 From: warmbuns Date: Sun, 19 Apr 2026 18:22:28 -0700 Subject: [PATCH 44/68] follow chirr systeminitializer pattern --- .../Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs | 9 +++------ .../Starstorm2/Modules/Pickups/Items/Affix/AffixStorm.cs | 7 ++++++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs index 3636533a1..d6734ab56 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs @@ -20,13 +20,10 @@ public class Fear : BaseAIState private static BodyIndex xiConstructBodyIndex = BodyIndex.None; - [SystemInitializer] - private static void Init() + [SystemInitializer(typeof(BodyCatalog))] + private static void InitCache() { - RoR2Application.onLoad += () => - { - xiConstructBodyIndex = BodyCatalog.FindBodyIndex("MajorConstructBody"); - }; + xiConstructBodyIndex = BodyCatalog.FindBodyIndex("MajorConstructBody"); } public override void OnEnter() diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Affix/AffixStorm.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Affix/AffixStorm.cs index 2b1db0d29..fc29afb83 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Affix/AffixStorm.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Affix/AffixStorm.cs @@ -17,10 +17,15 @@ public sealed class AffixStorm : SS2Item private static int boostAttackSpeedStacks = 10; private static int clayTemplarBoostAttackSpeedStacks = boostAttackSpeedStacks / 2; + [SystemInitializer(typeof(BodyCatalog))] + private static void InitCache() + { + clayTemplarBodyIndex = BodyCatalog.FindBodyIndex("ClayBruiserBody"); + } + public override void Initialize() { BuffOverlays.AddBuffOverlay(AssetCollection.FindAsset("BuffAffixStorm"), SS2Assets.LoadAsset("matAffixLightning", SS2Bundle.Equipments)); - RoR2Application.onLoad += () => clayTemplarBodyIndex = BodyCatalog.FindBodyIndex("ClayBruiserBody"); } public override bool IsAvailable(ContentPack contentPack) { From dda426b70807081bf58fc6d55eeb1d5852c41aad Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 19:38:17 -0700 Subject: [PATCH 45/68] I just cant seem to fix railgunner scope reload during roll --- .../EntityStates/Railgunner/RailgunnerRoll.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs index dc6d2a930..d54d0412b 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Railgunner/RailgunnerRoll.cs @@ -1,3 +1,4 @@ +using EntityStates.Railgunner.Reload; using RoR2; using UnityEngine; using UnityEngine.Networking; @@ -50,12 +51,14 @@ public override void OnEnter() //PlayAnimation("FullBody, Override", "Roll", "Roll.playbackRate", duration); Util.PlaySound(dodgeSoundString, gameObject); - if (isAuthority && skillLocator) + if (isAuthority) { - if (skillLocator.primary) - skillLocator.primary.stock = skillLocator.primary.maxStock; - if (skillLocator.secondary) - skillLocator.secondary.stock = skillLocator.secondary.maxStock; + EntityStateMachine entityStateMachine = EntityStateMachine.FindByCustomName(base.gameObject, "Reload"); + + if (entityStateMachine && entityStateMachine.state is Reloading reloadState && !reloadState.hasAttempted) + { + entityStateMachine.SetNextState(new BoostConfirm()); + } } } @@ -110,4 +113,4 @@ public override void OnDeserialize(NetworkReader reader) forwardDirection = reader.ReadVector3(); } } -} +} \ No newline at end of file From 8f5f67e533eb77951fd20c741ba3ed34013e4f8d Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 19:38:32 -0700 Subject: [PATCH 46/68] caching in wrong spot fml --- .../Modules/Characters/Survivors/Executioner2.cs | 11 +++++++++++ .../Starstorm2/Modules/EntityStates/AI/Fear.cs | 13 ++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Executioner2.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Executioner2.cs index dbc0e4e33..25bbc2f82 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Executioner2.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Executioner2.cs @@ -50,6 +50,8 @@ public sealed class Executioner2 : SS2Survivor private static float fearExecuteThresholdAdditive = (1f / 0.85f) - 1f; //0.15f with ExecuteAPI + public static BodyIndex xiConstructBodyIndex = BodyIndex.None; + public static void AddBodyToSuperChargeCollection(string body) { bodiesThatGiveSuperCharge.Add(body); @@ -81,6 +83,15 @@ public override void Initialize() ScepterCompat(); } } + + [SystemInitializer(typeof(BodyCatalog))] + private static void InitCache() + { + SS2Log.Info("We be looking for Xi"); + xiConstructBodyIndex = BodyCatalog.FindBodyIndex("MajorConstructBody"); + SS2Log.Info("We found him: " + xiConstructBodyIndex); + } + [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public void ScepterCompat() { diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs index d6734ab56..6916160a1 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/AI/Fear.cs @@ -3,6 +3,8 @@ using RoR2.Navigation; using UnityEngine; using SS2; +using SS2.Survivors; + namespace EntityStates.AI.Walker { public class Fear : BaseAIState @@ -18,22 +20,15 @@ public class Fear : BaseAIState private float fallbackNodeStartAge; private readonly float fallbackNodeDuration = 4f; - private static BodyIndex xiConstructBodyIndex = BodyIndex.None; - - [SystemInitializer(typeof(BodyCatalog))] - private static void InitCache() - { - xiConstructBodyIndex = BodyCatalog.FindBodyIndex("MajorConstructBody"); - } - public override void OnEnter() { base.OnEnter(); // Xi Construct flies to unreachable heights when feared // Instead we jump straight into LookBusy. O(1) check, Nebby will be proud - if (base.body && base.body.bodyIndex == xiConstructBodyIndex) + if (base.body && base.body.bodyIndex == SS2.Survivors.Executioner2.xiConstructBodyIndex) { + SS2Log.Info("Xi CCP"); this.outer.SetNextState(new LookBusy()); return; } From 8ed8f140e5208f450e51020162f85d05eee33e7d Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 19:39:45 -0700 Subject: [PATCH 47/68] Wrong body name lmao --- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 9 +++++---- .../Modules/Characters/Survivors/Executioner2.cs | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index 4a6f57286..9d5d189bc 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -1,5 +1,5 @@ **Warning: content spoilers below!** -### 0.6.40 (this branch) all your bugs belong to us +### 0.6.40 all your bugs belong to us This is a huge bugfix release, we want to start ironing out bugs as the team prepares for 0.7 sometime later this year. This version also includes some much requested community qol fixes like Drone/Ethereal interactions, Nerfs to Stormborn Clay Templars, Cyborg MP fixes, and lots of Knight fixes to bring Knight closer to complete. We are going to beginning priortising multiplayer stability in Beta moving forward, so more cautious fans can try SS2 Beta with friends. For that reason MULE/DU-T are going to be disabled. They both might return after DU-T gets additional polish and MULE gets his kit rework. Not that MULE was ever playable anyways.... @@ -30,8 +30,8 @@ We are going to beginning priortising multiplayer stability in Beta moving forwa * Fixed Wayfarer LampBuff TemporaryVisualEffect NRE spam * Nemesis * Fixed NRE when Nemesis spawns and players spawn in late - * Beta + * MULE and DU-T have been re-disabled. They might return in a future version after additional polish and fixing! * Ethereal * Fixed Ethereal teleporter icon placement (kind of, its still slightly too high, but its in the right spot now!) * Ethereal pillars no longer destroy drones @@ -39,6 +39,7 @@ We are going to beginning priortising multiplayer stability in Beta moving forwa * Knight * Knight now has a proper drop pod +TODO: Confirm the below are fixed before mergining * Unconfirmed * Knight * Fixed Knight's parry not working correctly for clients @@ -50,10 +51,10 @@ We are going to beginning priortising multiplayer stability in Beta moving forwa * Fixed Cyborg's teleporter projectile spawning a duplicate as client * Fixed Cyborg's shock mines not visually appearing as client * Fixed Shard Poison / Shard Void Zanzan trader interaction - * Xi Construct no longer runs away when Fear'd by Executioner + * Xi Construct no longer runs away when Fear'd by Executioner. This caused a softlock making Xi impossible to reach/kill as Xi flees to the edge of the skybox. * Fixed OpenSlow Curse interaction with Scavenger bags * Self-Repair skill fixes - * New Arti alt special + * New Arti alt special inspired by Wayfarer's projectile attack. LampGirly at home! * Follower no longer instakills or slams down clients when it grabs them with its beam in MP diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Executioner2.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Executioner2.cs index 25bbc2f82..71b065bc4 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Executioner2.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Executioner2.cs @@ -88,7 +88,7 @@ public override void Initialize() private static void InitCache() { SS2Log.Info("We be looking for Xi"); - xiConstructBodyIndex = BodyCatalog.FindBodyIndex("MajorConstructBody"); + xiConstructBodyIndex = BodyCatalog.FindBodyIndex("MegaConstructBody"); SS2Log.Info("We found him: " + xiConstructBodyIndex); } From 6f2c0b784f6df6a18d7cb595d9aa601039df19ef Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 22:05:36 -0700 Subject: [PATCH 48/68] make bread happy + changelog update --- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 6 ++- .../Modules/Characters/Monsters/Lamp.cs | 38 ------------------- .../Modules/Characters/Monsters/LampBoss.cs | 38 ------------------- 3 files changed, 4 insertions(+), 78 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index 9d5d189bc..f261e90d5 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -11,6 +11,7 @@ We are going to beginning priortising multiplayer stability in Beta moving forwa * Survivors * Executioner * Rare Executioner orb NRE fix (I cant seem to reproduce this one, but a null check was added where it happened) + * Xi Construct no longer runs away when Fear'd by Executioner. This caused a softlock making Xi impossible to reach/kill as Xi flees to the edge of the skybox. * Storms * Misc NRE fixes * Drones @@ -33,7 +34,7 @@ We are going to beginning priortising multiplayer stability in Beta moving forwa * Beta * MULE and DU-T have been re-disabled. They might return in a future version after additional polish and fixing! * Ethereal - * Fixed Ethereal teleporter icon placement (kind of, its still slightly too high, but its in the right spot now!) + * Ethereal pillars no longer destroy drones * Fixed harmless NRE on Ethereal when closing the game * Knight @@ -41,6 +42,8 @@ We are going to beginning priortising multiplayer stability in Beta moving forwa TODO: Confirm the below are fixed before mergining * Unconfirmed + * Ethereal + * Fixed Ethereal teleporter icon placement (kind of, its still slightly too high, but its in the right spot now!) * Knight * Fixed Knight's parry not working correctly for clients * Increased Knight's parry window to address latency issues @@ -51,7 +54,6 @@ TODO: Confirm the below are fixed before mergining * Fixed Cyborg's teleporter projectile spawning a duplicate as client * Fixed Cyborg's shock mines not visually appearing as client * Fixed Shard Poison / Shard Void Zanzan trader interaction - * Xi Construct no longer runs away when Fear'd by Executioner. This caused a softlock making Xi impossible to reach/kill as Xi flees to the edge of the skybox. * Fixed OpenSlow Curse interaction with Scavenger bags * Self-Repair skill fixes * New Arti alt special inspired by Wayfarer's projectile attack. LampGirly at home! diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs index b9de1bc2d..b05db15bc 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/Lamp.cs @@ -19,43 +19,5 @@ public override void Initialize() _masterPrefab = AssetCollection.FindAsset("LampMaster"); RoR2Application.onLoad += () => BodyIndex = BodyCatalog.FindBodyIndex("LampBody"); } - - // Shorthand dev command for testing since I am lazy - #if DEBUG - [ConCommand(commandName = "spawn_lamp", flags = ConVarFlags.Cheat | ConVarFlags.ExecuteOnServer, helpText = "Spawns Lamp (Follower) enemies at the sender's position. Usage: spawn_lamp [count=3]")] - public static void CCSpawnLamp(ConCommandArgs args) - { - if (!NetworkServer.active) return; - - int count = args.TryGetArgInt(0) ?? 3; - - CharacterMaster master = args.GetSenderMaster(); - if (!master || !master.GetBody()) - { - SS2Log.Error("spawn_lamp: No valid body found."); - return; - } - - if (!_masterPrefab) - { - SS2Log.Error("spawn_lamp: LampMaster prefab not loaded."); - return; - } - - Vector3 position = master.GetBody().footPosition; - for (int i = 0; i < count; i++) - { - MasterSummon summon = new MasterSummon - { - masterPrefab = _masterPrefab, - position = position + Vector3.up * 2f + Random.insideUnitSphere * 3f, - rotation = Quaternion.identity, - teamIndexOverride = TeamIndex.Monster - }; - summon.Perform(); - } - SS2Log.Info($"spawn_lamp: Spawned {count} Lamp(s)."); - } - #endif } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs index 250886f7e..b1a3f2139 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/LampBoss.cs @@ -131,43 +131,5 @@ public class PhaseData { public string phase; } - - // Shorthand dev command for testing since I am lazy - #if DEBUG - [ConCommand(commandName = "spawn_lampboss", flags = ConVarFlags.Cheat | ConVarFlags.ExecuteOnServer, helpText = "Spawns LampBoss enemies at the sender's position. Usage: spawn_lampboss [count=1]")] - public static void CCSpawnLampBoss(ConCommandArgs args) - { - if (!NetworkServer.active) return; - - int count = args.TryGetArgInt(0) ?? 1; - - CharacterMaster master = args.GetSenderMaster(); - if (!master || !master.GetBody()) - { - SS2Log.Error("spawn_lampboss: No valid body found."); - return; - } - - if (!_masterPrefab) - { - SS2Log.Error("spawn_lampboss: LampBossMaster prefab not loaded."); - return; - } - - Vector3 position = master.GetBody().footPosition; - for (int i = 0; i < count; i++) - { - MasterSummon summon = new MasterSummon - { - masterPrefab = _masterPrefab, - position = position + Vector3.up * 3f + UnityEngine.Random.insideUnitSphere * 5f, - rotation = Quaternion.identity, - teamIndexOverride = TeamIndex.Monster - }; - summon.Perform(); - } - SS2Log.Info($"spawn_lampboss: Spawned {count} LampBoss(es)."); - } - #endif } } From 4df657b3b851788c96dc62e25c8c7b83ec48e04b Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 22:42:57 -0700 Subject: [PATCH 49/68] cyborg gets a drop pod too --- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 4 +++- .../Starstorm2/Components/TeleporterUpgradeController.cs | 1 + .../Starstorm2/Modules/Characters/Survivors/Cyborg2.cs | 1 + .../Starstorm2/Modules/Characters/Survivors/Knight.cs | 7 ++----- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index f261e90d5..3ed8498cf 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -34,11 +34,13 @@ We are going to beginning priortising multiplayer stability in Beta moving forwa * Beta * MULE and DU-T have been re-disabled. They might return in a future version after additional polish and fixing! * Ethereal - * Ethereal pillars no longer destroy drones * Fixed harmless NRE on Ethereal when closing the game + * Cyborg + * Cyborg now has a proper drop pod * Knight * Knight now has a proper drop pod + * Fixed Knight's parry not working correctly for clients TODO: Confirm the below are fixed before mergining * Unconfirmed diff --git a/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs b/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs index 430edc0e9..bd9ebd07f 100644 --- a/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs +++ b/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs @@ -97,6 +97,7 @@ private void OnTeleporterBeginChargingGlobal(TeleporterInteraction tele) { if (isEthereal) { + // TODO: Why do we have this twice here? if (tele.bossDirector) { tele.bossDirector.monsterCredit += (float)(int)(100f * Mathf.Pow(Run.instance.compensatedDifficultyCoefficient, 0.5f)); diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Cyborg2.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Cyborg2.cs index 4d2ce48ae..81ad21562 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Cyborg2.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Cyborg2.cs @@ -145,6 +145,7 @@ public void ModifyPrefab() var cb = CharacterPrefab.GetComponent(); cb._defaultCrosshairPrefab = Addressables.LoadAssetAsync("RoR2/Base/UI/StandardCrosshair.prefab").WaitForCompletion(); cb.GetComponent().modelTransform.GetComponent().footstepDustPrefab = Addressables.LoadAssetAsync("RoR2/Base/Common/VFX/GenericFootstepDust.prefab").WaitForCompletion(); + cb.preferredPodPrefab = Addressables.LoadAssetAsync("RoR2/Base/SurvivorPod/SurvivorPod.prefab").WaitForCompletion(); } // temporaryvisualeffects are hard coded :( diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs index c9aa68229..ad900a14a 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/Knight.cs @@ -26,7 +26,6 @@ public sealed class Knight : SS2Survivor public static GameObject KnightImpactEffect; public static GameObject KnightCrosshair; - public static GameObject KnightDroppod; public static GameObject KnightPassiveWard; public static GameObject KnightHitEffect; public static GameObject KnightSpinEffect; @@ -76,8 +75,6 @@ public override void Initialize() //AssetCollection.FindAsset("sdKnightBuffedSpecialLunar").upgradedFrom = Addressables.LoadAssetAsync("RoR2/Base/LunarSkillReplacements/LunarDetonatorSpecialReplacement.asset").WaitForCompletion(); KnightImpactEffect = Addressables.LoadAssetAsync("RoR2/Base/Bandit2/Bandit2SmokeBomb.prefab").WaitForCompletion(); - KnightCrosshair = Addressables.LoadAssetAsync("RoR2/Base/UI/SimpleDotCrosshair.prefab").WaitForCompletion(); - KnightDroppod = Addressables.LoadAssetAsync("RoR2/Base/SurvivorPod/SurvivorPod.prefab").WaitForCompletion(); ExtendedStunDamageType = R2API.DamageAPI.ReserveDamageType(); Smite = R2API.ProcTypeAPI.ReserveProcType(); @@ -114,8 +111,8 @@ private void OnServerDamageDealt(DamageReport damageReport) public void ModifyPrefab() { var cb = CharacterPrefab.GetComponent(); - cb._defaultCrosshairPrefab = KnightCrosshair; - cb.preferredPodPrefab = KnightDroppod; + cb._defaultCrosshairPrefab = Addressables.LoadAssetAsync("RoR2/Base/UI/SimpleDotCrosshair.prefab").WaitForCompletion(); + cb.preferredPodPrefab = Addressables.LoadAssetAsync("RoR2/Base/SurvivorPod/SurvivorPod.prefab").WaitForCompletion(); EntityStateMachine bodyState = EntityStateMachine.FindByCustomName(cb.gameObject, "Body"); bodyState.mainStateType = new EntityStates.SerializableEntityStateType(typeof(EntityStates.Knight.MainState)); From 25689083b438e0eb7554fa13fc5b963b79c46283 Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 22:48:28 -0700 Subject: [PATCH 50/68] changelog nit --- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 4 ++-- .../Starstorm2/Modules/EntityStates/Cyborg2/Teleport.cs | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index 3ed8498cf..9628a129e 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -38,6 +38,7 @@ We are going to beginning priortising multiplayer stability in Beta moving forwa * Fixed harmless NRE on Ethereal when closing the game * Cyborg * Cyborg now has a proper drop pod + * Fixed Cyborg's shock mines not visually appearing as client * Knight * Knight now has a proper drop pod * Fixed Knight's parry not working correctly for clients @@ -47,14 +48,13 @@ TODO: Confirm the below are fixed before mergining * Ethereal * Fixed Ethereal teleporter icon placement (kind of, its still slightly too high, but its in the right spot now!) * Knight - * Fixed Knight's parry not working correctly for clients * Increased Knight's parry window to address latency issues * Railgunner * Tactical roll alt skill now properly reloads while scoped * Cyborg * Fixed bug where Cyborg could not charge the teleporter to 100% * Fixed Cyborg's teleporter projectile spawning a duplicate as client - * Fixed Cyborg's shock mines not visually appearing as client + * Fixed Shard Poison / Shard Void Zanzan trader interaction * Fixed OpenSlow Curse interaction with Scavenger bags * Self-Repair skill fixes diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/Teleport.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/Teleport.cs index ad55419b6..0d685d736 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/Teleport.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/Teleport.cs @@ -44,7 +44,6 @@ public override void OnEnter() if (NetworkServer.active) { - base.characterBody.AddBuff(RoR2Content.Buffs.HiddenInvincibility); } } From 78da6efe7d66f86fe9cfd1ab6707ccd1522ac3bf Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 23:08:35 -0700 Subject: [PATCH 51/68] code nits --- .../Modules/EntityStates/Cyborg2/FireBuffTeleporter.cs | 7 ++++++- .../Modules/EntityStates/Knight/BannerSpecial.cs | 4 ---- .../Modules/Pickups/Items/Curio/ItemOnEliteKill.cs | 1 + .../Starstorm2/Modules/RunBehaviors/StarstormBehavior.cs | 1 + 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/FireBuffTeleporter.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/FireBuffTeleporter.cs index 6450c52db..c029ff2b2 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/FireBuffTeleporter.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/FireBuffTeleporter.cs @@ -48,7 +48,12 @@ private void Fire() { this.hasFired = true; Util.PlaySound(soundString, base.gameObject); - EffectManager.SimpleMuzzleFlash(muzzleEffectPrefab, base.gameObject, "CannonR", true); + + if (muzzleEffectPrefab) + { + EffectManager.SimpleMuzzleFlash(muzzleEffectPrefab, base.gameObject, "CannonR", true); + } + AddRecoil(-1f * recoilAmplitude, -1.5f * recoilAmplitude, -0.25f * recoilAmplitude, 0.25f * recoilAmplitude); base.characterBody.AddSpreadBloom(bloom); Ray aimRay = GetAimRay(); diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/BannerSpecial.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/BannerSpecial.cs index bbfda3019..6692d8b51 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/BannerSpecial.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/BannerSpecial.cs @@ -218,10 +218,6 @@ protected virtual void FireImpact() bannerObject.GetComponent().teamIndex = characterBody.teamComponent.teamIndex; NetworkServer.Spawn(bannerObject); - - //slowBuffWardInstance = UnityEngine.Object.Instantiate(slowBuffWard, position, Quaternion.identity); - //slowBuffWardInstance.GetComponent().teamIndex = characterBody.teamComponent.teamIndex; - //slowBuffWardInstance.GetComponent().AttachToGameObjectAndSpawn(bannerObject); } } diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnEliteKill.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnEliteKill.cs index 2e3377fef..d6885a5d3 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnEliteKill.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnEliteKill.cs @@ -17,6 +17,7 @@ public override void Initialize() { dropTable = SS2Assets.LoadAsset("dtItemOnEliteKill", SS2Bundle.Items); GlobalEventManager.onCharacterDeathGlobal += OnCharacterDeathGlobal; + // TODO: Another NRE here? Null check I guess Run.onRunStartGlobal += (run) => { dropRng = new Xoroshiro128Plus(run.treasureRng.nextUlong); diff --git a/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/StarstormBehavior.cs b/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/StarstormBehavior.cs index 4aaeb8ebc..400944f1c 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/StarstormBehavior.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/StarstormBehavior.cs @@ -59,6 +59,7 @@ private void Start() instance = this; On.RoR2.SceneDirector.Start += SceneDirector_Start; /////// fuck OFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF base.transform.SetParent(Run.instance.transform); + // TODO: NREs on Run??? Null check I guess voidshopRng = new Xoroshiro128Plus(Run.instance.runRNG.nextUlong); } From 581eafff57f076a8cedc297671d98349a4a2c8fc Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 19 Apr 2026 23:46:20 -0700 Subject: [PATCH 52/68] We love null checking --- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 2 ++ .../Modules/Pickups/Items/Curio/ItemOnEliteKill.cs | 8 ++++++-- .../Starstorm2/Modules/RunBehaviors/StarstormBehavior.cs | 8 ++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index 31df42f53..0b5435c3d 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -32,6 +32,8 @@ We are going to beginning priortising multiplayer stability in Beta moving forwa * Nemesis * Fixed NRE when Nemesis spawns and players spawn in late * Beta + * Fixed a harmless NRE for Void Shop RNG on clients + * Fixed a harmless NRE for ItemOnEliteKill on clients * MULE and DU-T have been re-disabled. They might return in a future version after additional polish and fixing! * Ethereal * Ethereal pillars no longer destroy drones diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnEliteKill.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnEliteKill.cs index d6885a5d3..c9a1c6fa7 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnEliteKill.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Curio/ItemOnEliteKill.cs @@ -17,10 +17,14 @@ public override void Initialize() { dropTable = SS2Assets.LoadAsset("dtItemOnEliteKill", SS2Bundle.Items); GlobalEventManager.onCharacterDeathGlobal += OnCharacterDeathGlobal; - // TODO: Another NRE here? Null check I guess + Run.onRunStartGlobal += (run) => { - dropRng = new Xoroshiro128Plus(run.treasureRng.nextUlong); + // This is a harmless NRE on clients, but causes log noise that can confuse players thinking SS2 is root of X issue + if (run && run.treasureRng != null) + { + dropRng = new Xoroshiro128Plus(run.treasureRng.nextUlong); + } }; } private void OnCharacterDeathGlobal(DamageReport damageReport) diff --git a/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/StarstormBehavior.cs b/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/StarstormBehavior.cs index 400944f1c..14a92ecb3 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/StarstormBehavior.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/RunBehaviors/StarstormBehavior.cs @@ -59,8 +59,12 @@ private void Start() instance = this; On.RoR2.SceneDirector.Start += SceneDirector_Start; /////// fuck OFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF base.transform.SetParent(Run.instance.transform); - // TODO: NREs on Run??? Null check I guess - voidshopRng = new Xoroshiro128Plus(Run.instance.runRNG.nextUlong); + + // This is a harmless NRE on clients, but causes log noise that can confuse players thinking SS2 is root of X issue + if (Run.instance && Run.instance.runRNG != null) + { + voidshopRng = new Xoroshiro128Plus(Run.instance.runRNG.nextUlong); + } } private void OnDestroy() From 1ce4640536d454d17b27002f2cec88681a009802 Mon Sep 17 00:00:00 2001 From: hevia Date: Mon, 20 Apr 2026 20:09:29 -0700 Subject: [PATCH 53/68] banner nit --- .../Starstorm2/Modules/EntityStates/Knight/BannerSpecial.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/BannerSpecial.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/BannerSpecial.cs index 6692d8b51..4ee2f1aec 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/BannerSpecial.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/BannerSpecial.cs @@ -184,7 +184,8 @@ protected virtual void FireImpact() { PlayAnimation("FullBody, Override", "SpecialLeapEnd", "Special.playbackRate", detonateNextFrame ? 1f : 0.2f); - Util.PlaySound("Play_huntress_R_snipe_shoot", gameObject); + // TODO: Bro needs sound + //Util.PlaySound("Play_huntress_R_snipe_shoot", gameObject); if (base.isAuthority) { From ddca84a8f785950a0bde1bc475648c9731da76ec Mon Sep 17 00:00:00 2001 From: warmbuns Date: Mon, 20 Apr 2026 21:11:16 -0700 Subject: [PATCH 54/68] idk how physflag works but ill try!!! --- .../EntityStates/Knight/SpinUtility.cs | 65 ++----------------- .../Modules/EntityStates/Lamp/HealBeam.cs | 52 ++------------- 2 files changed, 11 insertions(+), 106 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/SpinUtility.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/SpinUtility.cs index 047797912..071e5cf0d 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/SpinUtility.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Knight/SpinUtility.cs @@ -3,8 +3,6 @@ using RoR2; using RoR2.Skills; using SS2; -using System; -using System.Collections.Generic; using UnityEngine; namespace EntityStates.Knight @@ -23,7 +21,6 @@ public class SpinUtility : BaseKnightDashMelee public float fireFrequency; public float fireAge; public float fireInterval; - public Transform modelTransform; #region test [RiskOfOptionsConfigureField(SS2Config.ID_SURVIVOR), Tooltip("overridden by configs")] public static float testbaseDuration = 0.69f; @@ -62,11 +59,11 @@ public override void OnEnter() base.OnEnter(); this.attack.damageType.damageSource = DamageSource.Utility; + this.attack.pushAwayForce = 0f; + this.attack.physForceFlags = PhysForceFlags.doNotExceed | PhysForceFlags.massIsOne; fireFrequency = baseFireFrequency * attackSpeedStat; fireInterval = 1 / fireFrequency; - modelTransform = GetModelTransform(); - swordPivot = FindModelChild("HitboxAnchor"); swordPivot.rotation = Util.QuaternionSafeLookRotation(GetAimRay().direction); } @@ -84,74 +81,20 @@ protected override void FireAttack() fireAge += Time.fixedDeltaTime; } - List hurtBoxes = new List(); - - while ((fireAge >= fireInterval)) { fireAge -= fireInterval; attack.ResetIgnoredHealthComponents(); - hurtBoxes.Clear(); + attack.forceVector = forwardDirection * rollSpeed * fireInterval * 6f; PlaySwingEffect(); - if (isAuthority && attack.Fire(hurtBoxes)) + if (isAuthority && attack.Fire()) { - for (int i = 0; i < hurtBoxes.Count; i++) - { - PushVictim(hurtBoxes[i]); - } OnHitEnemyAuthority(); } } } - //public for hot compile - public void PushVictim(HurtBox hurtBox) - { - if (hurtBox.healthComponent.body == null) - return; - - float sizeMultiplier = 1; - switch (hurtBox.healthComponent.body.hullClassification) - { - default: - case HullClassification.Human: - break; - case HullClassification.Golem: - sizeMultiplier = 0.5f; - break; - case HullClassification.BeetleQueen: - sizeMultiplier = 0.2f; - break; - } - - Vector3 hurtboxPos = hurtBox.healthComponent.transform.position; - float z = modelTransform.InverseTransformPoint(hurtboxPos).z; - - //0 to 1 based on how far the enemy is in front of or behind, with 0 being furthest in front - float positionMultiplier = Mathf.InverseLerp(8, -8, z); - PhysForceInfo physInfo = new PhysForceInfo() - { - massIsOne = true, - disableAirControlUntilCollision = true, - ignoreGroundStick = true, //presto! - force = forwardDirection * ((rollSpeed * fireInterval * 6f) + (positionMultiplier * 3)) * sizeMultiplier, - }; - - if (hurtBox.healthComponent.body.characterMotor) - { - hurtBox.healthComponent.body.characterMotor.velocity = Vector3.zero; - hurtBox.healthComponent.body.characterMotor.ApplyForceImpulse(physInfo); - //should probably just set velocity instead of setting to zero and applying impulse, but the disableaircontrol and ignoregroundstick are useful - } - if(hurtBox.healthComponent.TryGetComponent(out RigidbodyMotor motor)) - { - physInfo.disableAirControlUntilCollision = false; - motor.rigid.velocity = Vector3.zero; - motor.ApplyForceImpulse(physInfo); - } - } - public override void PlayAttackAnimation() { PlayCrossfade("FullBody, Override", "Utility", "Utility.playbackRate", duration * swingTimeCoefficient, duration * 0.15f); diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Lamp/HealBeam.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Lamp/HealBeam.cs index 868c6b289..7ebe45e41 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Lamp/HealBeam.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Lamp/HealBeam.cs @@ -22,10 +22,8 @@ public class HealBeam : BaseSkillState private static float searchRadius = 27f; private static float beamBreakDistance = 36f; private static int maxBeams = 1; - private static bool ignoreMass = true; private static float forceMagnitude = -1.25f; - private static float forceDamping = 0.4f; private static float maxHeightDiff = 15f; private static float forceCoefficientAtMaxHeightDiff = 2f; @@ -246,7 +244,6 @@ public override void FixedUpdate() } // TODO: Add forces if multiple beams are targetting one body, instead of separate damage - // ALSO todo::::::::::::::::: fizz force flags protected void Lifto(HurtBox hurtBox) { @@ -263,54 +260,19 @@ protected void Lifto(HurtBox hurtBox) if (healthComponent && healthComponent.body && hurtBox.transform) { - CharacterMotor characterMotor = healthComponent.body.characterMotor; - bool hasAuthority = healthComponent.body.hasEffectiveAuthority; - Vector3 between = hurtBox.transform.position - transform.position; float heightDiff = Mathf.Abs(between.y); - Vector3 forceDirection = new Vector3(0, between.y, 0); - forceDirection = forceDirection.normalized; + Vector3 forceDirection = new Vector3(0, between.y, 0).normalized; float forceCoefficient = Mathf.Clamp(heightDiff / maxHeightDiff, 1f, forceCoefficientAtMaxHeightDiff); Vector3 forceVector = forceDirection * forceMagnitude * forceCoefficient; - float mass = 0f; - Vector3 dampingForce = Vector3.zero; - - if (characterMotor) - { - mass = characterMotor.mass; - // only apply velocity damping for server-authoritative bodies; - // for client bodies the server has stale velocity data which causes - // force oscillation and violent slamming - if (hasAuthority) - { - Vector3 currentVerticalVelocity = Vector3.up * characterMotor.velocity.y; - if (characterMotor.useGravity) - currentVerticalVelocity.y += Physics.gravity.y * Time.fixedDeltaTime; - dampingForce = currentVerticalVelocity * forceDamping * mass * forceCoefficient; - } - } - else - { - Rigidbody rigidbody = healthComponent.body.rigidbody; - if (rigidbody) - { - mass = rigidbody.mass; - if (hasAuthority) - { - Vector3 currentVerticalVelocity = Vector3.up * rigidbody.velocity.y; - if (rigidbody.useGravity) - currentVerticalVelocity.y += Physics.gravity.y * Time.fixedDeltaTime; - dampingForce = currentVerticalVelocity * forceDamping * mass * forceCoefficient; - } - } - } - if (ignoreMass) - { - forceVector *= mass; - } - healthComponent.TakeDamageForce(forceVector - dampingForce, true, false); + PhysForceInfo forceInfo = PhysForceInfo.Create(); + forceInfo.force = forceVector; + forceInfo.massIsOne = true; + forceInfo.ignoreGroundStick = true; + forceInfo.doNotExceed = true; + healthComponent.TakeDamageForce(forceInfo); } } From 717ec04f5d0e6068df92ca1f0bc5755634240dec Mon Sep 17 00:00:00 2001 From: hevia Date: Tue, 21 Apr 2026 01:27:24 -0700 Subject: [PATCH 55/68] put gamemode here --- .../Assets/Starstorm2/Modules/GameModes.meta | 8 ++++ .../Modules/GameModes/BlitzRunBehavior.cs | 48 +++++++++++++++++++ .../GameModes/BlitzRunBehavior.cs.meta | 11 +++++ .../Modules/GameModes/GameModeModule.cs | 35 ++++++++++++++ .../Modules/GameModes/GameModeModule.cs.meta | 11 +++++ SS2-Project/Assets/Starstorm2/SS2Content.cs | 1 + SS2-Project/Assets/Starstorm2/SS2Main.cs | 1 + 7 files changed, 115 insertions(+) create mode 100644 SS2-Project/Assets/Starstorm2/Modules/GameModes.meta create mode 100644 SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs create mode 100644 SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs.meta create mode 100644 SS2-Project/Assets/Starstorm2/Modules/GameModes/GameModeModule.cs create mode 100644 SS2-Project/Assets/Starstorm2/Modules/GameModes/GameModeModule.cs.meta diff --git a/SS2-Project/Assets/Starstorm2/Modules/GameModes.meta b/SS2-Project/Assets/Starstorm2/Modules/GameModes.meta new file mode 100644 index 000000000..8bab17153 --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/Modules/GameModes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 876ee546f5dbba34f8929054e3eaf1b2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs b/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs new file mode 100644 index 000000000..b2d82eda7 --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs @@ -0,0 +1,48 @@ +using RoR2; +using UnityEngine; +using UnityEngine.Networking; + +namespace SS2 +{ + public class BlitzRunBehavior : MonoBehaviour + { + private void OnEnable() + { + // On.RoR2.Run.HandlePlayerFirstEntryAnimation += OnHandlePlayerFirstEntryAnimation; + Run.onRunStartGlobal += OnRunStart; + } + + private void OnDisable() + { + // On.RoR2.Run.HandlePlayerFirstEntryAnimation -= OnHandlePlayerFirstEntryAnimation; + Run.onRunStartGlobal -= OnRunStart; + } + + // private void OnHandlePlayerFirstEntryAnimation( + // On.RoR2.Run.orig_HandlePlayerFirstEntryAnimation orig, + // Run self, CharacterBody body, Vector3 spawnPosition, Quaternion spawnRotation) + // { + // if (self.gameObject == gameObject) + // { + // // No survivor pod — players teleport in directly + // body.SetBodyStateToPreferredInitialState(); + // return; + // } + // orig(self, body, spawnPosition, spawnRotation); + // } + + private void OnRunStart(Run run) + { + if (run.gameObject != gameObject) + return; + + if (NetworkServer.active) + { + Chat.SendBroadcastChat(new Chat.SimpleChatMessage + { + baseToken = "SS2_GAMEMODE_BLITZ_START" + }); + } + } + } +} \ No newline at end of file diff --git a/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs.meta new file mode 100644 index 000000000..244737f56 --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4a60176a4d2a4e14ab1613f7cef73e85 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/SS2-Project/Assets/Starstorm2/Modules/GameModes/GameModeModule.cs b/SS2-Project/Assets/Starstorm2/Modules/GameModes/GameModeModule.cs new file mode 100644 index 000000000..7aa25a5a4 --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/Modules/GameModes/GameModeModule.cs @@ -0,0 +1,35 @@ +using R2API; +using RoR2; +using System.Collections; +using UnityEngine; +using UnityEngine.AddressableAssets; + +namespace SS2 +{ + public static class GameModeModule + { + internal static IEnumerator Init() + { + var classicRunPrefab = Addressables.LoadAssetAsync( + "RoR2/Base/ClassicRun/ClassicRun.prefab").WaitForCompletion(); + var blitzRunPrefab = classicRunPrefab.InstantiateClone("BlitzRun"); + + if (!blitzRunPrefab.TryGetComponent(out var run)) + { + SS2Log.Error("GameModeModule: Cloned ClassicRun has no Run component."); + yield break; + } + + run.nameToken = "SS2_GAMEMODE_BLITZ_NAME"; + run.userPickable = true; + + blitzRunPrefab.AddComponent(); + blitzRunPrefab.AddComponent().buttonHoverDescription = "SS2_GAMEMODE_BLITZ_DESC"; + + SS2Content.SS2ContentPack.gameModePrefabs.Add(new[] { blitzRunPrefab }); + + SS2Log.Info("Blitz gamemode registered."); + yield break; + } + } +} \ No newline at end of file diff --git a/SS2-Project/Assets/Starstorm2/Modules/GameModes/GameModeModule.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/GameModes/GameModeModule.cs.meta new file mode 100644 index 000000000..a525b3628 --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/Modules/GameModes/GameModeModule.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb2480017d64ac04c97310d7522e4a3c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/SS2-Project/Assets/Starstorm2/SS2Content.cs b/SS2-Project/Assets/Starstorm2/SS2Content.cs index e33331998..2e2e09129 100644 --- a/SS2-Project/Assets/Starstorm2/SS2Content.cs +++ b/SS2-Project/Assets/Starstorm2/SS2Content.cs @@ -134,6 +134,7 @@ static SS2Content() SS2Main main = SS2Main.Instance; _loadDispatchers = new Func[] { + GameModeModule.Init, DifficultyModule.Init, Events.Init, //Bulwark.Init, diff --git a/SS2-Project/Assets/Starstorm2/SS2Main.cs b/SS2-Project/Assets/Starstorm2/SS2Main.cs index 760716f73..206cc8161 100644 --- a/SS2-Project/Assets/Starstorm2/SS2Main.cs +++ b/SS2-Project/Assets/Starstorm2/SS2Main.cs @@ -19,6 +19,7 @@ namespace SS2 [BepInDependency("com.bepis.r2api.prefab")] [BepInDependency("com.bepis.r2api.difficulty")] [BepInDependency("com.bepis.r2api.tempvisualeffect")] + [BepInDependency("com.bepis.r2api.content_management")] #endregion [BepInDependency(MSU.MSUMain.GUID, BepInDependency.DependencyFlags.HardDependency)] [BepInDependency("com.DestroyedClone.AncientScepter", BepInDependency.DependencyFlags.SoftDependency)] From fdbdd67ec40c905a2712dedd0af3852625ed9fa2 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Tue, 21 Apr 2026 12:46:24 -0700 Subject: [PATCH 56/68] lock the tele --- .../Modules/GameModes/BlitzRunBehavior.cs | 95 +++++++++++++++---- 1 file changed, 79 insertions(+), 16 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs b/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs index b2d82eda7..4e589d1d4 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs @@ -1,4 +1,6 @@ using RoR2; +using RoR2.UI; +using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; @@ -6,31 +8,26 @@ namespace SS2 { public class BlitzRunBehavior : MonoBehaviour { + private static BlitzRunBehavior instance; + private void OnEnable() { - // On.RoR2.Run.HandlePlayerFirstEntryAnimation += OnHandlePlayerFirstEntryAnimation; + instance = this; Run.onRunStartGlobal += OnRunStart; + On.RoR2.TeleporterInteraction.IdleState.OnInteractionBegin += OnTeleporterInteractionBegin; + On.RoR2.SceneDirector.PopulateScene += OnPopulateScene; + ObjectivePanelController.collectObjectiveSources += OnCollectObjectiveSources; } private void OnDisable() { - // On.RoR2.Run.HandlePlayerFirstEntryAnimation -= OnHandlePlayerFirstEntryAnimation; Run.onRunStartGlobal -= OnRunStart; + On.RoR2.TeleporterInteraction.IdleState.OnInteractionBegin -= OnTeleporterInteractionBegin; + On.RoR2.SceneDirector.PopulateScene -= OnPopulateScene; + ObjectivePanelController.collectObjectiveSources -= OnCollectObjectiveSources; + instance = null; } - // private void OnHandlePlayerFirstEntryAnimation( - // On.RoR2.Run.orig_HandlePlayerFirstEntryAnimation orig, - // Run self, CharacterBody body, Vector3 spawnPosition, Quaternion spawnRotation) - // { - // if (self.gameObject == gameObject) - // { - // // No survivor pod — players teleport in directly - // body.SetBodyStateToPreferredInitialState(); - // return; - // } - // orig(self, body, spawnPosition, spawnRotation); - // } - private void OnRunStart(Run run) { if (run.gameObject != gameObject) @@ -44,5 +41,71 @@ private void OnRunStart(Run run) }); } } + + private void OnTeleporterInteractionBegin( + On.RoR2.TeleporterInteraction.IdleState.orig_OnInteractionBegin orig, + EntityStates.BaseState self, Interactor activator) + { + if (instance) + return; + + orig(self, activator); + } + + private void OnPopulateScene(On.RoR2.SceneDirector.orig_PopulateScene orig, SceneDirector self) + { + orig(self); + + if (!instance || !self.teleporterInstance) + return; + + if (!self.teleporterInstance.TryGetComponent(out var filter)) + filter = self.teleporterInstance.AddComponent(); + + filter.shouldAllowOnInteractionBeginProc = false; + } + + private static void OnCollectObjectiveSources( + CharacterMaster master, + List objectiveSourcesList) + { + if (!instance) + return; + + objectiveSourcesList.Add(new ObjectivePanelController.ObjectiveSourceDescriptor + { + master = master, + objectiveType = typeof(BlitzSurviveObjectiveTracker), + source = instance + }); + } + + public class BlitzSurviveObjectiveTracker : ObjectivePanelController.ObjectiveTracker + { + protected override string GenerateString() + { + return Language.GetString("SS2_GAMEMODE_BLITZ_OBJECTIVE"); + } + + protected override bool IsDirty() + { + return false; + } + } + + // TODO: Dont delete + // On.RoR2.Run.HandlePlayerFirstEntryAnimation += OnHandlePlayerFirstEntryAnimation; + // private void OnHandlePlayerFirstEntryAnimation( + // On.RoR2.Run.orig_HandlePlayerFirstEntryAnimation orig, + // Run self, CharacterBody body, Vector3 spawnPosition, Quaternion spawnRotation) + // { + // if (self.gameObject == gameObject) + // { + // // No survivor pod — players teleport in directly + // body.SetBodyStateToPreferredInitialState(); + // return; + // } + // orig(self, body, spawnPosition, spawnRotation); + // } } -} \ No newline at end of file +} From e849bdd2f32ce5a704fdf03551947e6576363bde Mon Sep 17 00:00:00 2001 From: warmbuns Date: Tue, 21 Apr 2026 15:25:41 -0700 Subject: [PATCH 57/68] well test timers too --- .../Modules/GameModes/BlitzRunBehavior.cs | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs b/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs index 4e589d1d4..c773eeeca 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs @@ -10,6 +10,13 @@ public class BlitzRunBehavior : MonoBehaviour { private static BlitzRunBehavior instance; + private float intervalStopwatch; + private float gameOverStopwatch; + private bool isGameOver; + + private const float eventInterval = 120f; // 2 minutes + private const float blitzDuration = 600f; // 10 minutes + private void OnEnable() { instance = this; @@ -28,6 +35,34 @@ private void OnDisable() instance = null; } + private void FixedUpdate() + { + if (!NetworkServer.active || isGameOver) + return; + + float dt = Time.fixedDeltaTime; + + intervalStopwatch += dt; + if (intervalStopwatch >= eventInterval) + { + intervalStopwatch -= eventInterval; + Chat.SendBroadcastChat(new Chat.SimpleChatMessage + { + baseToken = "SS2_GAMEMODE_BLITZ_INTERVAL" + }); + } + + gameOverStopwatch += dt; + if (gameOverStopwatch >= blitzDuration) + { + isGameOver = true; + Chat.SendBroadcastChat(new Chat.SimpleChatMessage + { + baseToken = "SS2_GAMEMODE_BLITZ_OVER" + }); + } + } + private void OnRunStart(Run run) { if (run.gameObject != gameObject) From 54d584558a9ff1eea563f9cab0398f8590889e0d Mon Sep 17 00:00:00 2001 From: hevia Date: Wed, 22 Apr 2026 01:05:12 -0700 Subject: [PATCH 58/68] a few of our items were missing temp tags it seems --- .../Base/Items/DetritiveTrematode/DetritiveTrematode.asset | 6 +++++- .../AssetStorm/Base/Items/DroidHead/DroidHead.asset | 7 ++++++- .../Base/Items/FieldAccelerator/FieldAccelerator.asset | 2 +- .../Starstorm2/AssetStorm/Base/Items/IceTool/IceTool.asset | 6 +++++- .../Starstorm2/Modules/GameModes/BlitzRunBehavior.cs | 4 ++-- .../Assets/ThunderKitSettings/ThunderKitSettings.asset | 2 +- 6 files changed, 20 insertions(+), 7 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/DetritiveTrematode/DetritiveTrematode.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/DetritiveTrematode/DetritiveTrematode.asset index 3962387f5..60c5b3dee 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/DetritiveTrematode/DetritiveTrematode.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/DetritiveTrematode/DetritiveTrematode.asset @@ -21,9 +21,13 @@ MonoBehaviour: unlockableDef: {fileID: 0} pickupModelPrefab: {fileID: 2985427644933769749, guid: 9e58955305d9ed141a8776e8d55d5b95, type: 3} + pickupModelReference: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: pickupIconSprite: {fileID: 21300000, guid: ffcb8a0a627c402409062f02b6754958, type: 3} isConsumed: 0 hidden: 0 canRemove: 1 - tags: 0100000004000000 + tags: 01000000040000001f000000 requiredExpansion: {fileID: 11400000, guid: 59a1ba2efde60ad44a82ed4c314d08ba, type: 2} diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/DroidHead/DroidHead.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/DroidHead/DroidHead.asset index 909dcdd7b..26b22b7d5 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/DroidHead/DroidHead.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/DroidHead/DroidHead.asset @@ -21,8 +21,13 @@ MonoBehaviour: unlockableDef: {fileID: 0} pickupModelPrefab: {fileID: 108947993678365757, guid: 6f46904d838a8484794a7314889699c0, type: 3} + pickupModelReference: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: pickupIconSprite: {fileID: 21300000, guid: 28bc5f11a188a324ea09449dfdc8101a, type: 3} + isConsumed: 0 hidden: 0 canRemove: 1 - tags: 0100000006000000 + tags: 01000000060000001f000000 requiredExpansion: {fileID: 11400000, guid: 59a1ba2efde60ad44a82ed4c314d08ba, type: 2} diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/FieldAccelerator/FieldAccelerator.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/FieldAccelerator/FieldAccelerator.asset index 25646f11d..454f768c1 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/FieldAccelerator/FieldAccelerator.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/FieldAccelerator/FieldAccelerator.asset @@ -29,5 +29,5 @@ MonoBehaviour: isConsumed: 0 hidden: 0 canRemove: 1 - tags: 030000000600000004000000110000000d000000 + tags: 030000000600000004000000110000000d000000040000001f000000 requiredExpansion: {fileID: 11400000, guid: 59a1ba2efde60ad44a82ed4c314d08ba, type: 2} diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/IceTool/IceTool.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/IceTool/IceTool.asset index fb1b2cab7..6ca7941de 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/IceTool/IceTool.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/IceTool/IceTool.asset @@ -21,9 +21,13 @@ MonoBehaviour: unlockableDef: {fileID: 0} pickupModelPrefab: {fileID: 716009786362165840, guid: 92f290edc468cd64890e665fd9d3de60, type: 3} + pickupModelReference: + m_AssetGUID: + m_SubObjectName: + m_SubObjectType: pickupIconSprite: {fileID: 21300000, guid: 620075793ada90c4fb523112e75be3b8, type: 3} isConsumed: 0 hidden: 0 canRemove: 1 - tags: 0300000004000000 + tags: 03000000040000001f000000 requiredExpansion: {fileID: 11400000, guid: 59a1ba2efde60ad44a82ed4c314d08ba, type: 2} diff --git a/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs b/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs index c773eeeca..df4eb1cdf 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs @@ -117,12 +117,12 @@ private static void OnCollectObjectiveSources( public class BlitzSurviveObjectiveTracker : ObjectivePanelController.ObjectiveTracker { - protected override string GenerateString() + public override string GenerateString() { return Language.GetString("SS2_GAMEMODE_BLITZ_OBJECTIVE"); } - protected override bool IsDirty() + public override bool IsDirty() { return false; } diff --git a/SS2-Project/Assets/ThunderKitSettings/ThunderKitSettings.asset b/SS2-Project/Assets/ThunderKitSettings/ThunderKitSettings.asset index 09659ba2e..96f677294 100644 --- a/SS2-Project/Assets/ThunderKitSettings/ThunderKitSettings.asset +++ b/SS2-Project/Assets/ThunderKitSettings/ThunderKitSettings.asset @@ -12,7 +12,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f9057f7f601990a4883b2cb295c4f43e, type: 3} m_Name: ThunderKitSettings m_EditorClassIdentifier: - FirstLoad: 0 + FirstLoad: 1 ShowOnStartup: 1 GameExecutable: GamePath: From f08da221123c5ecb068477183e7ded37bafc81c7 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Wed, 22 Apr 2026 19:25:49 -0700 Subject: [PATCH 59/68] caca --- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 3 +++ .../Modules/Pickups/Items/Tier2/FieldAccelerator.cs | 10 ++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index 0b5435c3d..24246dc6a 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -23,6 +23,9 @@ We are going to beginning priortising multiplayer stability in Beta moving forwa * Empyrean * Empyreans are now invincible during their spawn animation * Fixed Empyrean simulacrum interaction +* Items + * Gave FieldAccelerator the AI Blacklist tag + * Field Accelerator, Droid Head, and Trematode were missing the "Can Be Temporary" tags, they can now spawn as temporary items! * Enemies * Mimic * Fixed Mimic and Chirr death friend interaction diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/FieldAccelerator.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/FieldAccelerator.cs index bf1394ed2..78fd36d72 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/FieldAccelerator.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/FieldAccelerator.cs @@ -130,6 +130,7 @@ private void OnDestroy() public class FieldAcceleratorTeleporterBehavior : MonoBehaviour { private HoldoutZoneController hzc; + private float originalBaseRadius; private Transform pos; public static GameObject displayPrefab; private ChildLocator displayChildLocator; @@ -157,6 +158,8 @@ public class FieldAcceleratorTeleporterBehavior : MonoBehaviour private void Awake() { hzc = GetComponent(); + if (hzc != null) + originalBaseRadius = hzc.baseRadius; TeleporterInteraction.onTeleporterBeginChargingGlobal += TeleporterInteraction_onTeleporterBeginChargingGlobal; TeleporterInteraction.onTeleporterChargedGlobal += TeleporterInteraction_onTeleporterChargedGlobal; RecalcRadius(); @@ -330,9 +333,12 @@ public void RecalcRadius() } - if (hzc != null && acceleratorCount > 0 && monstersCleared) + if (hzc != null) { - hzc.baseRadius *= 1 + (radiusPerStack * acceleratorCount); // *= is bad. this is run multiple times + if (acceleratorCount > 0 && monstersCleared) + hzc.baseRadius = originalBaseRadius * (1 + (radiusPerStack * acceleratorCount)); + else + hzc.baseRadius = originalBaseRadius; } } } From c6e1eb2ef5d7bdc4264eb15de264aba590a4c091 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 24 Apr 2026 13:54:57 -0700 Subject: [PATCH 60/68] nits --- .../EntityStates/Events/Nemesis/GenericNemesisBossState.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Events/Nemesis/GenericNemesisBossState.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Events/Nemesis/GenericNemesisBossState.cs index d7e4cfc95..4cfc2a0d4 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Events/Nemesis/GenericNemesisBossState.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Events/Nemesis/GenericNemesisBossState.cs @@ -179,13 +179,13 @@ private void OnBossSpawned(SpawnCard.SpawnResult spawnResult) GameObject target = null; foreach (PlayerCharacterMasterController pcmc in PlayerCharacterMasterController.instances) { - if (pcmc && pcmc.master && pcmc.master.inventory.GetItemCount(SS2Content.Items.VoidRock) > 0) + if (pcmc && pcmc.master && pcmc.master.inventory && pcmc.master.inventory.GetItemCount(SS2Content.Items.VoidRock) > 0) { if (pcmc.master.hasBody) { target = pcmc.master.GetBodyObject(); + break; } - break; } } From dce5d1ceb61f2ff71a16cd3e3a61e1ae6b8eff2d Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 24 Apr 2026 14:16:29 -0700 Subject: [PATCH 61/68] undo cyborg changes --- .../EntityStates/Cyborg2/ShockMine/Burrow.cs | 6 ++---- .../EntityStates/Cyborg2/ShockMine/ShockNearby.cs | 9 ++++----- .../EntityStates/Cyborg2/ShockMine/Unburrow.cs | 13 +++---------- .../EntityStates/Cyborg2/ShockMine/WaitForStick.cs | 6 ++---- .../EntityStates/Cyborg2/ShockMine/WaitForTarget.cs | 9 +++------ 5 files changed, 14 insertions(+), 29 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Burrow.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Burrow.cs index 7d23ed831..82549cbec 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Burrow.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Burrow.cs @@ -1,6 +1,4 @@ -using UnityEngine.Networking; - -namespace EntityStates.Cyborg2.ShockMine +namespace EntityStates.Cyborg2.ShockMine { public class Burrow : BaseShockMineState { @@ -13,7 +11,7 @@ public override void OnEnter() public override void FixedUpdate() { base.FixedUpdate(); - if (NetworkServer.active) + if (base.isAuthority) { EntityState entityState = null; if (!base.projectileStickOnImpact.stuck) diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs index 0e71c7813..e1372870a 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/ShockNearby.cs @@ -24,8 +24,7 @@ public override void OnEnter() { base.OnEnter(); - if (!base.TryGetComponent(out this.projectileDamage)) - SS2Log.Warning("ShockNearby missing ProjectileDamage"); + this.projectileDamage = base.GetComponent(); this.shockInterval = numShocks / baseDuration; } @@ -34,9 +33,6 @@ public override void FixedUpdate() { base.FixedUpdate(); - if (!NetworkServer.active) - return; - base.rigidbody.velocity = Vector3.zero; this.shockTimer -= Time.fixedDeltaTime; @@ -56,6 +52,9 @@ public override void FixedUpdate() private void Shock() { + if (!NetworkServer.active) + return; + if (shockEffectPrefab) { EffectManager.SpawnEffect(shockEffectPrefab, new EffectData diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs index 457aef6db..7092e05da 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/Unburrow.cs @@ -1,6 +1,4 @@ using UnityEngine; -using UnityEngine.Networking; - namespace EntityStates.Cyborg2.ShockMine { public class Unburrow : BaseShockMineState @@ -10,19 +8,14 @@ public override void OnEnter() base.OnEnter(); this.duration = Unburrow.baseDuration; - // Only set velocity on server - // clients receive position via ProjectileNetworkTransform - if (NetworkServer.active) - { - Vector3 upVelocity = Vector3.up * hopVelocity; - base.rigidbody.velocity = upVelocity; - } + Vector3 upVelocity = Vector3.up * hopVelocity; + base.rigidbody.velocity = upVelocity;// base.transform.rotation * upVelocity; } public override void FixedUpdate() { base.FixedUpdate(); - if (NetworkServer.active) + if (base.isAuthority) { if(base.fixedAge >= this.duration) { diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForStick.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForStick.cs index ad084cc58..d0aa97397 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForStick.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForStick.cs @@ -1,6 +1,4 @@ -using UnityEngine.Networking; - -namespace EntityStates.Cyborg2.ShockMine +namespace EntityStates.Cyborg2.ShockMine { public class WaitForStick : BaseShockMineState { @@ -11,7 +9,7 @@ public override void OnEnter() public override void FixedUpdate() { base.FixedUpdate(); - if (NetworkServer.active && base.projectileStickOnImpact.stuck) + if (base.isAuthority && base.projectileStickOnImpact.stuck) { this.outer.SetNextState(new Burrow()); } diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForTarget.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForTarget.cs index 82ba9ab5b..68cf11928 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForTarget.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Cyborg2/ShockMine/WaitForTarget.cs @@ -1,6 +1,5 @@ using RoR2.Projectile; using UnityEngine.Networking; -using SS2; namespace EntityStates.Cyborg2.ShockMine { @@ -13,17 +12,15 @@ public override void OnEnter() base.OnEnter(); if (NetworkServer.active) { - if (base.TryGetComponent(out this.targetFinder)) - this.targetFinder.enabled = true; - else - SS2Log.Warning("WaitForTarget missing ProjectileSphereTargetFinder"); + this.targetFinder = base.GetComponent(); + this.targetFinder.enabled = true; } } public override void FixedUpdate() { base.FixedUpdate(); - if (NetworkServer.active) + if (base.isAuthority) { EntityState entityState = null; if (!base.projectileStickOnImpact.stuck) From 349e40298bf0677d0bae2207254e5b098e375791 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 24 Apr 2026 16:40:26 -0700 Subject: [PATCH 62/68] norway seed vault --- .../Modules/GameModes/BlitzRunBehavior.cs | 132 +++++++++++++++++- 1 file changed, 127 insertions(+), 5 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs b/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs index df4eb1cdf..b932557bf 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/GameModes/BlitzRunBehavior.cs @@ -1,6 +1,8 @@ using RoR2; using RoR2.UI; +using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using UnityEngine; using UnityEngine.Networking; @@ -17,10 +19,15 @@ public class BlitzRunBehavior : MonoBehaviour private const float eventInterval = 120f; // 2 minutes private const float blitzDuration = 600f; // 10 minutes + private Xoroshiro128Plus rng; + + private static readonly DateTime seedEpoch = new DateTime(2018, 8, 27, 0, 0, 0, DateTimeKind.Utc); + private void OnEnable() { instance = this; Run.onRunStartGlobal += OnRunStart; + On.RoR2.Run.GenerateSeedForNewRun += OnGenerateSeedForNewRun; On.RoR2.TeleporterInteraction.IdleState.OnInteractionBegin += OnTeleporterInteractionBegin; On.RoR2.SceneDirector.PopulateScene += OnPopulateScene; ObjectivePanelController.collectObjectiveSources += OnCollectObjectiveSources; @@ -29,6 +36,7 @@ private void OnEnable() private void OnDisable() { Run.onRunStartGlobal -= OnRunStart; + On.RoR2.Run.GenerateSeedForNewRun -= OnGenerateSeedForNewRun; On.RoR2.TeleporterInteraction.IdleState.OnInteractionBegin -= OnTeleporterInteractionBegin; On.RoR2.SceneDirector.PopulateScene -= OnPopulateScene; ObjectivePanelController.collectObjectiveSources -= OnCollectObjectiveSources; @@ -37,7 +45,7 @@ private void OnDisable() private void FixedUpdate() { - if (!NetworkServer.active || isGameOver) + if (!NetworkServer.active || isGameOver || rng == null) return; float dt = Time.fixedDeltaTime; @@ -46,10 +54,7 @@ private void FixedUpdate() if (intervalStopwatch >= eventInterval) { intervalStopwatch -= eventInterval; - Chat.SendBroadcastChat(new Chat.SimpleChatMessage - { - baseToken = "SS2_GAMEMODE_BLITZ_INTERVAL" - }); + SpawnIntervalBoss(); } gameOverStopwatch += dt; @@ -60,9 +65,29 @@ private void FixedUpdate() { baseToken = "SS2_GAMEMODE_BLITZ_OVER" }); + + SceneDef moonScene = SceneCatalog.FindSceneDef("moon2"); + if (moonScene != null && Stage.instance) + { + Stage.instance.BeginAdvanceStage(moonScene); + } + else + { + SS2Log.Warning("BlitzRunBehavior: Could not find moon2 scene or Stage.instance is null."); + } } } + private ulong OnGenerateSeedForNewRun(On.RoR2.Run.orig_GenerateSeedForNewRun orig, Run self) + { + if (self.TryGetComponent(out _)) + { + uint dayCycle = (uint)((DateTime.UtcNow - seedEpoch).Days); + return (ulong)dayCycle << 32; + } + return orig(self); + } + private void OnRunStart(Run run) { if (run.gameObject != gameObject) @@ -70,6 +95,8 @@ private void OnRunStart(Run run) if (NetworkServer.active) { + rng = new Xoroshiro128Plus(run.seed); + Chat.SendBroadcastChat(new Chat.SimpleChatMessage { baseToken = "SS2_GAMEMODE_BLITZ_START" @@ -77,6 +104,101 @@ private void OnRunStart(Run run) } } + private void SpawnIntervalBoss() + { + if (!ClassicStageInfo.instance) + { + SS2Log.Warning("BlitzRunBehavior: No ClassicStageInfo, cannot spawn boss."); + return; + } + + Chat.SendBroadcastChat(new Chat.SimpleChatMessage + { + baseToken = "SS2_GAMEMODE_BLITZ_INTERVAL" + }); + + WeightedSelection monsterSelection = ClassicStageInfo.instance.monsterSelection; + if (monsterSelection == null || monsterSelection.Count == 0) + return; + + // Filter to boss-tier (champion) enemies, same logic as CombatDirector.SetNextSpawnAsBoss + WeightedSelection bossSelection = new WeightedSelection(); + for (int i = 0; i < monsterSelection.Count; i++) + { + var choice = monsterSelection.GetChoice(i); + SpawnCard spawnCard = choice.value.GetSpawnCard(); + if (!spawnCard || !spawnCard.prefab) + continue; + + if (!spawnCard.prefab.TryGetComponent(out var master) || !master.bodyPrefab) + continue; + + if (!master.bodyPrefab.TryGetComponent(out var body)) + continue; + + bool isChampion = body.isChampion; + bool forbiddenAsBoss = (spawnCard as CharacterSpawnCard)?.forbiddenAsBoss ?? false; + + if (isChampion && !forbiddenAsBoss && choice.value.IsAvailable()) + bossSelection.AddChoice(choice); + } + + if (bossSelection.Count == 0) + { + SS2Log.Warning("BlitzRunBehavior: No valid boss cards available for this stage."); + return; + } + + DirectorCard bossCard = bossSelection.Evaluate(rng.nextNormalizedFloat); + + // Pick a random alive player as spawn target + GameObject spawnTarget = GetRandomAlivePlayerBody(); + if (!spawnTarget) + return; + + DirectorPlacementRule placementRule = new DirectorPlacementRule + { + placementMode = DirectorPlacementRule.PlacementMode.Approximate, + minDistance = 10f, + maxDistance = 40f, + spawnOnTarget = spawnTarget.transform + }; + + DirectorSpawnRequest spawnRequest = new DirectorSpawnRequest(bossCard.GetSpawnCard(), placementRule, rng); + spawnRequest.teamIndexOverride = TeamIndex.Monster; + + GameObject spawnedMaster = DirectorCore.instance?.TrySpawnObject(spawnRequest); + if (!spawnedMaster) + { + SS2Log.Warning("BlitzRunBehavior: Boss spawn placement failed."); + return; + } + + if (spawnedMaster.TryGetComponent(out var bossmaster)) + { + // Give the boss extra health scaling based on difficulty + float boostHp = 1f + (Run.instance.compensatedDifficultyCoefficient * 0.3f); + bossmaster.inventory?.GiveItem(RoR2Content.Items.BoostHp, Mathf.RoundToInt(boostHp)); + } + } + + private GameObject GetRandomAlivePlayerBody() + { + ReadOnlyCollection players = PlayerCharacterMasterController.instances; + List aliveBodies = new List(); + + foreach (var pcmc in players) + { + if (pcmc.master && pcmc.master.hasBody) + aliveBodies.Add(pcmc.master.GetBodyObject()); + } + + if (aliveBodies.Count == 0) + return null; + + return rng.NextElementUniform(aliveBodies); + } + private void OnTeleporterInteractionBegin( On.RoR2.TeleporterInteraction.IdleState.orig_OnInteractionBegin orig, EntityStates.BaseState self, Interactor activator) From 08ddc9e894801bf8c8a8a7baf196dd535d44d3a0 Mon Sep 17 00:00:00 2001 From: hevia Date: Fri, 26 Jun 2026 01:21:52 -0700 Subject: [PATCH 63/68] small changes --- .../AssetStorm/Base/Items/RainbowRoot/RainbowRoot.asset | 2 +- .../AssetStorm/Base/Items/StrangeCan/BuffIntoxicated.asset | 6 +++++- .../AssetStorm/Base/Stages/SlateMines/mat/SMWater.mat | 2 +- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/RainbowRoot/RainbowRoot.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/RainbowRoot/RainbowRoot.asset index 9def922f4..cca2e7ce9 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/RainbowRoot/RainbowRoot.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/RainbowRoot/RainbowRoot.asset @@ -29,5 +29,5 @@ MonoBehaviour: isConsumed: 0 hidden: 0 canRemove: 1 - tags: 030000001f000000 + tags: 030000001f00000004000000 requiredExpansion: {fileID: 11400000, guid: 59a1ba2efde60ad44a82ed4c314d08ba, type: 2} diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/StrangeCan/BuffIntoxicated.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/StrangeCan/BuffIntoxicated.asset index f91ba33f6..ad8697c1e 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/StrangeCan/BuffIntoxicated.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/StrangeCan/BuffIntoxicated.asset @@ -17,7 +17,11 @@ MonoBehaviour: buffColor: {r: 0.5575382, g: 0.6320754, b: 0.5575382, a: 1} canStack: 1 eliteDef: {fileID: 0} - isDebuff: 0 + isDebuff: 1 + isDOT: 0 + ignoreGrowthNectar: 0 isCooldown: 0 isHidden: 0 + flags: 0 + stackingDisplayMethod: 0 startSfx: {fileID: 0} diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Stages/SlateMines/mat/SMWater.mat b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Stages/SlateMines/mat/SMWater.mat index e821f07ca..f2563245e 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Stages/SlateMines/mat/SMWater.mat +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Stages/SlateMines/mat/SMWater.mat @@ -8,7 +8,7 @@ Material: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: SMWater - m_Shader: {fileID: 0} + m_Shader: {fileID: 4800000, guid: 414f975faade42d408c7ba2f5766f402, type: 3} m_ValidKeywords: [] m_InvalidKeywords: - _DISPLACEMENTMODE_OFF diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index 24246dc6a..ee6139db4 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -24,8 +24,9 @@ We are going to beginning priortising multiplayer stability in Beta moving forwa * Empyreans are now invincible during their spawn animation * Fixed Empyrean simulacrum interaction * Items - * Gave FieldAccelerator the AI Blacklist tag + * Gave Rainbow Root and Field Accelerator the AI Blacklist tag * Field Accelerator, Droid Head, and Trematode were missing the "Can Be Temporary" tags, they can now spawn as temporary items! + * Strange Can debuff is now properly marked as debuff * Enemies * Mimic * Fixed Mimic and Chirr death friend interaction From 6c574c02377ea9b6b57e6e6f22afebe8711aed05 Mon Sep 17 00:00:00 2001 From: warmbuns Date: Fri, 26 Jun 2026 15:16:41 -0700 Subject: [PATCH 64/68] epic guid moment --- .../EntityStates.NemCommando.NemCommandoAppearState.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Characters/NemCommando/Skills/EntityStates.NemCommando.NemCommandoAppearState.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Characters/NemCommando/Skills/EntityStates.NemCommando.NemCommandoAppearState.asset index 4f6106b11..5e03cda71 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Characters/NemCommando/Skills/EntityStates.NemCommando.NemCommandoAppearState.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Characters/NemCommando/Skills/EntityStates.NemCommando.NemCommandoAppearState.asset @@ -20,7 +20,7 @@ MonoBehaviour: - fieldName: gunSecondary fieldValue: stringValue: - objectValue: {fileID: 11400000, guid: c98ae462d6f22e345a5f13d195c40bc5, type: 2} + objectValue: {fileID: 11400000, guid: 35a59a4d02f795c4891a21ac70a179c4, type: 2} - fieldName: gunSpecial fieldValue: stringValue: From cdba623c7a36ec021080545444d86f31150d9a16 Mon Sep 17 00:00:00 2001 From: hevia Date: Sat, 27 Jun 2026 16:34:24 -0700 Subject: [PATCH 65/68] this is now the 0.6.40 branch time to start cleaning it up --- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 3 ++- SS2-Project/Assets/Starstorm2/SS2-Manifest.asset | 2 +- SS2-Project/Assets/Starstorm2/manifest.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index 22a7bf514..74d93e88a 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -71,6 +71,7 @@ TODO: Confirm the below are fixed before mergining * General * NOTE: The mod will still say 0.6.38 when loading because I built the mod before updating this in Unity. Its a small technical detail that doesnt matter to most people except those filing bug reports * White Flag will now display a random Pride flag every run during the month of June. We got to this late! There is a config to enable this year round. (Thanks bread) + * Fixes to Empyrean VFX overlay, HP bar being tiny, and having wrong shield amount (Thanks Lordryn) * Nemesis Commando * Re-implemented unique set of animations for when gun isn't in use (Thanks Domi!) * Updated animations for Decisive Strike, Submission @@ -81,7 +82,7 @@ TODO: Confirm the below are fixed before mergining * Ethereal difficulties now properly show on run end/run history screens * Fixed Drizzle being selected by default with Beta content enabled * Slate mines interactables fixed (Thanks Lordryn) - * Fixes to Empyrean VFX overlay, HP bar being tiny, and having wrong shield amount (Thanks Lordryn) + * If Buns (me) didnt forget to set the correct Slate Mines water material that should be fixed too ### 0.6.38 diff --git a/SS2-Project/Assets/Starstorm2/SS2-Manifest.asset b/SS2-Project/Assets/Starstorm2/SS2-Manifest.asset index 2053a6114..7b55a5a7d 100644 --- a/SS2-Project/Assets/Starstorm2/SS2-Manifest.asset +++ b/SS2-Project/Assets/Starstorm2/SS2-Manifest.asset @@ -100,7 +100,7 @@ MonoBehaviour: Name: Starstorm2 Description: A sequel to Starstorm 1. Adds new survivors, mechanics, items, skills, enemies, and more! - Version: 0.6.38 + Version: 0.6.40 Dependencies: - {fileID: 11400000, guid: 5ceb1d8ed3af40d4d806e9756b403649, type: 2} - {fileID: 11400000, guid: 890a1759ee352a00d2367557b4d6225f, type: 2} diff --git a/SS2-Project/Assets/Starstorm2/manifest.json b/SS2-Project/Assets/Starstorm2/manifest.json index 8ac78833a..2f4664f4f 100644 --- a/SS2-Project/Assets/Starstorm2/manifest.json +++ b/SS2-Project/Assets/Starstorm2/manifest.json @@ -1,7 +1,7 @@ { "name": "Starstorm2", "author": "TeamMoonstorm", - "version_number": "0.6.39", + "version_number": "0.6.40", "website_url": "https://starstorm2.wiki.gg/", "description": "A sequel to Starstorm 1. Adds new survivors, mechanics, items, skills, enemies, and more!", "dependencies": [ From d78fa98f55524ccec3e9eb22b99684a7dd1daa79 Mon Sep 17 00:00:00 2001 From: hevia Date: Sat, 27 Jun 2026 16:35:35 -0700 Subject: [PATCH 66/68] changelog nits --- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index 74d93e88a..9c8f652dc 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -1,9 +1,5 @@ **Warning: content spoilers below!** -### 0.6.40 all your bugs belong to us -This is a huge bugfix release, we want to start ironing out bugs as the team prepares for 0.7 sometime later this year. This version also includes some much requested community qol fixes like Drone/Ethereal interactions, Nerfs to Stormborn Clay Templars, Cyborg MP fixes, and lots of Knight fixes to bring Knight closer to complete. - -We are going to beginning priortising multiplayer stability in Beta moving forward, so more cautious fans can try SS2 Beta with friends. For that reason MULE/DU-T are going to be disabled. They both might return after DU-T gets additional polish and MULE gets his kit rework. Not that MULE was ever playable anyways.... - +### 0.6.40 * General * Fixed Typhoon language tokens not appearing correctly if you adjusted Typhoon config * Added back `unlock_all` config option. Only works on Survivors and Items for now From c9c25d903069ca605bbc3f4f533d146ac7822d28 Mon Sep 17 00:00:00 2001 From: hevia Date: Sat, 27 Jun 2026 16:38:28 -0700 Subject: [PATCH 67/68] changelog nits part 2 --- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 9 +++------ .../Starstorm2/Modules/Characters/Survivors/DUT.cs | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index 9c8f652dc..9607dde84 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -34,7 +34,7 @@ * Beta * Fixed a harmless NRE for Void Shop RNG on clients * Fixed a harmless NRE for ItemOnEliteKill on clients - * MULE and DU-T have been re-disabled. They might return in a future version after additional polish and fixing! + * MULE sent to permanent disable jail until future rework * Ethereal * Ethereal pillars no longer destroy drones * Fixed harmless NRE on Ethereal when closing the game @@ -44,19 +44,16 @@ * Knight * Knight now has a proper drop pod * Fixed Knight's parry not working correctly for clients + * Increased Knight's parry window to address latency issues TODO: Confirm the below are fixed before mergining * Unconfirmed * Ethereal * Fixed Ethereal teleporter icon placement (kind of, its still slightly too high, but its in the right spot now!) - * Knight - * Increased Knight's parry window to address latency issues * Railgunner * Tactical roll alt skill now properly reloads while scoped * Cyborg - * Fixed bug where Cyborg could not charge the teleporter to 100% - * Fixed Cyborg's teleporter projectile spawning a duplicate as client - + * Fixed bug where Cyborg could not charge the teleporter 100% * Fixed Shard Poison / Shard Void Zanzan trader interaction * Fixed OpenSlow Curse interaction with Scavenger bags * Self-Repair skill fixes diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/DUT.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/DUT.cs index 22be4c362..efb762cf7 100644 --- a/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/DUT.cs +++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Survivors/DUT.cs @@ -34,7 +34,7 @@ public override void Initialize() public override bool IsAvailable(ContentPack contentPack) { - return false; + return SS2Config.enableBeta && base.IsAvailable(contentPack); } private void DUTDrift(On.RoR2.CharacterBody.orig_RecalculateStats orig, CharacterBody self) From 229fa939fb0ec0eb7118b324fe742c60bb72203c Mon Sep 17 00:00:00 2001 From: hevia Date: Sun, 28 Jun 2026 23:43:24 -0700 Subject: [PATCH 68/68] some scope changes --- .../Characters/NemCommando/BuffGouge.asset | 4 +++ .../Characters/NemCommando/dbdGouge.asset | 33 +++++++++++++++++++ .../Items/StrangeCan/BuffIntoxicated.asset | 2 +- SS2-Project/Assets/Starstorm2/CHANGELOG.md | 12 +++---- .../LiberationSans SDF - Fallback.asset | 4 +-- .../LiberationSans SDF.asset | 4 +-- .../ThunderKitSettings.asset | 4 +-- .../ProjectSettings/GraphicsSettings.asset | 2 +- 8 files changed, 51 insertions(+), 14 deletions(-) create mode 100644 SS2-Project/Assets/Starstorm2/AssetStorm/Base/Characters/NemCommando/dbdGouge.asset diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Characters/NemCommando/BuffGouge.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Characters/NemCommando/BuffGouge.asset index d59e83e6a..958faa8d2 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Characters/NemCommando/BuffGouge.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Characters/NemCommando/BuffGouge.asset @@ -18,6 +18,10 @@ MonoBehaviour: canStack: 1 eliteDef: {fileID: 0} isDebuff: 0 + isDOT: 0 + ignoreGrowthNectar: 0 isCooldown: 0 isHidden: 0 + flags: 0 + stackingDisplayMethod: 0 startSfx: {fileID: 0} diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Characters/NemCommando/dbdGouge.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Characters/NemCommando/dbdGouge.asset new file mode 100644 index 000000000..06ebc0dea --- /dev/null +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Characters/NemCommando/dbdGouge.asset @@ -0,0 +1,33 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: adf8a95badcc74d40a27d8bc46f38205, type: 3} + m_Name: dbdGouge + m_EditorClassIdentifier: + iconPath: + iconSprite: {fileID: 21300000, guid: 1d337e60299983247bab956d53a13210, type: 3} + buffColor: {r: 1, g: 1, b: 1, a: 1} + canStack: 1 + eliteDef: {fileID: 0} + isDebuff: 0 + isDOT: 0 + ignoreGrowthNectar: 0 + isCooldown: 0 + isHidden: 0 + flags: 0 + stackingDisplayMethod: 0 + startSfx: {fileID: 0} + interval: 0 + damageCoefficient: 0 + damageColor: {fileID: 0} + terminalTimedBuff: {fileID: 0} + terminalTimedBuffDuration: 0 + resetTimerOnAdd: 0 diff --git a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/StrangeCan/BuffIntoxicated.asset b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/StrangeCan/BuffIntoxicated.asset index ad8697c1e..265571103 100644 --- a/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/StrangeCan/BuffIntoxicated.asset +++ b/SS2-Project/Assets/Starstorm2/AssetStorm/Base/Items/StrangeCan/BuffIntoxicated.asset @@ -17,7 +17,7 @@ MonoBehaviour: buffColor: {r: 0.5575382, g: 0.6320754, b: 0.5575382, a: 1} canStack: 1 eliteDef: {fileID: 0} - isDebuff: 1 + isDebuff: 0 isDOT: 0 ignoreGrowthNectar: 0 isCooldown: 0 diff --git a/SS2-Project/Assets/Starstorm2/CHANGELOG.md b/SS2-Project/Assets/Starstorm2/CHANGELOG.md index 9607dde84..0486faa32 100644 --- a/SS2-Project/Assets/Starstorm2/CHANGELOG.md +++ b/SS2-Project/Assets/Starstorm2/CHANGELOG.md @@ -22,7 +22,6 @@ * Items * Gave Rainbow Root and Field Accelerator the AI Blacklist tag * Field Accelerator, Droid Head, and Trematode were missing the "Can Be Temporary" tags, they can now spawn as temporary items! - * Strange Can debuff is now properly marked as debuff * Enemies * Mimic * Fixed Mimic and Chirr death friend interaction @@ -48,18 +47,19 @@ TODO: Confirm the below are fixed before mergining * Unconfirmed - * Ethereal - * Fixed Ethereal teleporter icon placement (kind of, its still slightly too high, but its in the right spot now!) - * Railgunner - * Tactical roll alt skill now properly reloads while scoped * Cyborg * Fixed bug where Cyborg could not charge the teleporter 100% * Fixed Shard Poison / Shard Void Zanzan trader interaction * Fixed OpenSlow Curse interaction with Scavenger bags * Self-Repair skill fixes - * New Arti alt special inspired by Wayfarer's projectile attack. LampGirly at home! * Follower no longer instakills or slams down clients when it grabs them with its beam in MP +TODO BEFORE RELEASING 0.6.40: +* Ethereal + * Fixed Ethereal teleporter icon placement +* Railgunner + * Tactical roll alt skill now properly reloads while scoped + ### 0.6.39 Happy Pride! * General * NOTE: The mod will still say 0.6.38 when loading because I built the mod before updating this in Unity. Its a small technical detail that doesnt matter to most people except those filing bug reports diff --git a/SS2-Project/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset b/SS2-Project/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset index bd4c6f62b..a72d9c89b 100644 --- a/SS2-Project/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset +++ b/SS2-Project/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset @@ -8,13 +8,13 @@ Material: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: LiberationSans SDF Material - m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3} + m_Shader: {fileID: 4800000, guid: ff9ed3095222b644488b4078766902a7, type: 3} m_ValidKeywords: [] m_InvalidKeywords: [] m_LightmapFlags: 1 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 + m_CustomRenderQueue: 3000 stringTagMap: {} disabledShaderPasses: [] m_SavedProperties: diff --git a/SS2-Project/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset b/SS2-Project/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset index e789da698..aea8b6dcd 100644 --- a/SS2-Project/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset +++ b/SS2-Project/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset @@ -8,13 +8,13 @@ Material: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: LiberationSans SDF Material - m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3} + m_Shader: {fileID: 4800000, guid: ff9ed3095222b644488b4078766902a7, type: 3} m_ValidKeywords: [] m_InvalidKeywords: [] m_LightmapFlags: 1 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 + m_CustomRenderQueue: 3000 stringTagMap: {} disabledShaderPasses: [] m_SavedProperties: diff --git a/SS2-Project/Assets/ThunderKitSettings/ThunderKitSettings.asset b/SS2-Project/Assets/ThunderKitSettings/ThunderKitSettings.asset index 96f677294..17d5e2a9d 100644 --- a/SS2-Project/Assets/ThunderKitSettings/ThunderKitSettings.asset +++ b/SS2-Project/Assets/ThunderKitSettings/ThunderKitSettings.asset @@ -12,7 +12,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f9057f7f601990a4883b2cb295c4f43e, type: 3} m_Name: ThunderKitSettings m_EditorClassIdentifier: - FirstLoad: 1 + FirstLoad: 0 ShowOnStartup: 1 GameExecutable: GamePath: @@ -33,9 +33,9 @@ MonoBehaviour: - {fileID: 11400000, guid: 4ca85e634dc2335479b864b471c5184c, type: 2} - {fileID: 11400000, guid: 82be5eb040e6b904da2e986f2951a106, type: 2} - {fileID: 11400000, guid: 00bbc80fe004c7b4ca79ec7027dd4858, type: 2} + - {fileID: 11400000, guid: 026ffab2599a1bd40a16e330a22ae578, type: 2} - {fileID: 11400000, guid: e30deea31be13f04bb22833911e8bac0, type: 2} - {fileID: 11400000, guid: 24daa7d8c1bf87a40b123c4c775aff1d, type: 2} - - {fileID: 11400000, guid: 026ffab2599a1bd40a16e330a22ae578, type: 2} - {fileID: 11400000, guid: 65945c76639f62d4aaabd410aea6e547, type: 2} - {fileID: 11400000, guid: c517bb88d98991849b16129e77d5d02b, type: 2} - {fileID: 11400000, guid: d424f9d32be64004b8e7493770703b56, type: 2} diff --git a/SS2-Project/ProjectSettings/GraphicsSettings.asset b/SS2-Project/ProjectSettings/GraphicsSettings.asset index 9bc18f6a0..e5f6ec6fc 100644 --- a/SS2-Project/ProjectSettings/GraphicsSettings.asset +++ b/SS2-Project/ProjectSettings/GraphicsSettings.asset @@ -11,7 +11,7 @@ GraphicsSettings: m_Mode: 1 m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} m_ScreenSpaceShadows: - m_Mode: 1 + m_Mode: 2 m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} m_LegacyDeferred: m_Mode: 0