diff --git a/.gitignore b/.gitignore
index 6b4ba4942..bb0c5fdfb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,6 +34,9 @@ skills-lock.json
# Visual Studio cache directory
.vs/
+# rider ide cache ,.,.
+SS2-Project/.idea/
+
# Gradle cache directory
.gradle/
@@ -110,4 +113,4 @@ SS2-Project/Assets/Wwise/Deployment/Plugins/Mac/*
#Integration zips
SS2-Project/WwiseUnityIntegration_Windows_Src.zip
-SS2-Project/WwiseUnityIntegration_Mac_Src.zip
\ No newline at end of file
+SS2-Project/WwiseUnityIntegration_Mac_Src.zip
diff --git a/README.md b/README.md
index cc4e596db..9095ac7db 100644
--- a/README.md
+++ b/README.md
@@ -23,14 +23,14 @@ That said, if you are looking to contribute to the project, set-up instructions
* You'll need:
* Unity Hub
- * Unity version 2019.4.37f1 (Available from: https://unity.com/releases/editor/archive)
+ * Unity version 2021.3.33f1 (Available from: https://unity.com/releases/editor/archive)
* A Git client (IE: GithubDesktop, Gitkraken, etc)
* Begin by cloning the repository to your hard drive.

-* Once the project downloads, open the `SS2-Project` folder with Unity 2019.4.37f1. Keep in mind that opening the project for the first time will take time, so patience is key.
+* Once the project downloads, open the `SS2-Project` folder with Unity 2021.3.33f1. Keep in mind that opening the project for the first time will take time, so patience is key.

@@ -156,4 +156,4 @@ Q: I fetched origin on my fork, and now i have general instability and/or weird
* Select everything on the folder EXCECPT ``manifest.json`` and ``packages-lock.json``
* Delete the selected contents
* Open your unity project
- * Reimport your game, remember that the correct import configuration can be found [here](#developingcontributions)
\ No newline at end of file
+ * Reimport your game, remember that the correct import configuration can be found [here](#developingcontributions)
diff --git a/SS2-Project/Assets/Languages/en/SS2Lang_Interactables_en.json b/SS2-Project/Assets/Languages/en/SS2Lang_Interactables_en.json
index e459bdb09..c11a2bdab 100644
--- a/SS2-Project/Assets/Languages/en/SS2Lang_Interactables_en.json
+++ b/SS2-Project/Assets/Languages/en/SS2Lang_Interactables_en.json
@@ -49,7 +49,9 @@
"SS2_BIRTHRIGHT_UNCLAIMED_REMOVED": "",
"SS2_BIRTHRIGHT_UNCLAIMED_RARE": "",
- "SS2_BIRTHRIGHT_OBJECTIVE": "{0} unclaimed",
+ "SS2_BIRTHRIGHT_OBJECTIVE": "{0} unclaimed. {1}s left!",
+ "SS2_BIRTHRIGHT_OBJECTIVEFAILED": "{0} unclaimed. ",
+ "SS2_BIRTHRIGHT_OBJECTIVEFAILEDCLAIMEDALL": " ",
"SS2_PEDESTAL_NAME": "Pedestal",
"SS2_PEDESTAL_CONTEXT": "Use Pedestal",
diff --git a/SS2-Project/Assets/Languages/en/SS2Lang_ItemsLunar_en.json b/SS2-Project/Assets/Languages/en/SS2Lang_ItemsLunar_en.json
index 1e194c7e3..c8435422b 100644
--- a/SS2-Project/Assets/Languages/en/SS2Lang_ItemsLunar_en.json
+++ b/SS2-Project/Assets/Languages/en/SS2Lang_ItemsLunar_en.json
@@ -32,8 +32,8 @@
"SS2_ITEM_RELICOFECHELON_LORE": "No no Youngling, you are here too soon! I haven't the time to prepare. Please...Come back later.",
"SS2_ITEM_PRIMAL_BIRTHRIGHT_NAME": "Primal Birthright",
- "SS2_ITEM_PRIMAL_BIRTHRIGHT_DESC": "Grants Legendary Chest , .",
- "SS2_ITEM_PRIMAL_BIRTHRIGHT_PICKUP": "Grants a Legendary Chest on each stage, .",
+ "SS2_ITEM_PRIMAL_BIRTHRIGHT_DESC": "Grants Legendary Chest(s) , but you and must claim it within or .",
+ "SS2_ITEM_PRIMAL_BIRTHRIGHT_PICKUP": "Grants a on each stage, and or .",
"SS2_ITEM_PRIMAL_BIRTHRIGHT_LORE": "The symbols on the parchment are foreign to you. You do not understand what they are, but somehow, you understand the meaning they carry. Power. Will. Authority, and a message. \n\n\"The right to rule is earned through strength and wit, and those alone. It cannot be granted by another. It cannot be granted by birth nor blood. Only strength justifies itself.\"\nYou look back down. The flickering lights of the hull cast strange shapes in the shard. Reflected shadows against its glow, coalescing into shapes that coalesce into figures.\n\nTwo shadows stumble aimlessly around in the reflection, against the backdrop of dawn. Short, stubby shadows. A seed falls into one's hair, and it laughs and plants it back into the soil. A seed falls into another's hands. It gently pries the thing open, to learn what will grow.\n\nThe shadows lengthen as the sun moves through the sky. Long, imposing shadows against twilight. Positioned perfectly, like an eerie gate to the light.\n\nOne shadow begins to grow faster still, stretching until the whole world is a blanket of darkness. The lone shadow thrashes against its prison, indistinguishable against the sea of blackness, fiercely refusing to fade away.\n\nOne shadow remains in the light. It stands in front of the now rising sun, eclipsing its light. Rays of golden sun wrap around it, forming a coronal halo for the shadow. Standing out starkly against the world around it- blinding, searing, formless. Selfish. It does not move.\n\nYou squint your eyes, and the symbols hold a new meaning.\n\n\"It isn't fair.\""
}
diff --git a/SS2-Project/Assets/Languages/en/SS2Lang_NonSurvivorBodies_en.json b/SS2-Project/Assets/Languages/en/SS2Lang_NonSurvivorBodies_en.json
index 8f1eae77c..d2f801e8d 100644
--- a/SS2-Project/Assets/Languages/en/SS2Lang_NonSurvivorBodies_en.json
+++ b/SS2-Project/Assets/Languages/en/SS2Lang_NonSurvivorBodies_en.json
@@ -39,6 +39,11 @@
"SS2_UNLOCKABLE_LOG_MIMIC": "Logbook: Security Chest",
"SS2_MIMIC_BODY_LORE": "\"Now, I'd like to see this as something of a learning experience, all things considered. Evolutionary biology has a curious place for mimicry, my friend- certain creatures seek not to be threatening or inviting by their own merit, but rather by the means of seeming to be a different thing entirely. Of course, evolution being random means that this isn't what we're dealing with-\"\n\n\"It’s also not what we're dealing with because-\"\n\n\"No no, let me finish. In this case we have a very fascinating example, don't we? A machine emulating another machine in such an animated way, as a means to trick us into getting close- why, it's positively Wicklerian in design, isn't it? Whoever made this thing really had a heart for it, don't you think?\"\n\n\"...Dude, it just steals shit. Nothin' fancy about it.\"\n\n\"Nature really is beautiful, even in a place like this.\"\n\n\"Shut up and let’s keep moving. Ugh, god, why'd I have to get stuck with this guy?\"\n\n-Signal echoes, UES Contact Light",
"SS2_MIMIC_THEFT": "";
+ }
+
+ return text;
+ }
+
+ public override bool IsDirty()
+ {
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Components/BirthrightObjectiveTimer.cs.meta b/SS2-Project/Assets/Starstorm2/Components/BirthrightObjectiveTimer.cs.meta
new file mode 100644
index 000000000..93e5ba399
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Components/BirthrightObjectiveTimer.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 53e9eb9240b6427ba7e866b4325ddf1f
+timeCreated: 1782533905
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Components/Chirr/ChirrFriendTracker.cs b/SS2-Project/Assets/Starstorm2/Components/Chirr/ChirrFriendTracker.cs
index 59b957c6b..517928b87 100644
--- a/SS2-Project/Assets/Starstorm2/Components/Chirr/ChirrFriendTracker.cs
+++ b/SS2-Project/Assets/Starstorm2/Components/Chirr/ChirrFriendTracker.cs
@@ -90,8 +90,9 @@ public bool CheckBody(CharacterBody body)
{
bool healthRequirement = true;// body.healthComponent.health < body.healthComponent.fullHealth * maximumFriendHealthFraction;
bool bossRequirement = !body.isBoss; // scepter
+ bool masterRequirement = body.master; // nres without master,. .
- return healthRequirement && bossRequirement;
+ return healthRequirement && bossRequirement && masterRequirement;
}
public HurtBox GetTrackingTarget()
{
diff --git a/SS2-Project/Assets/Starstorm2/Components/CoffeeBeanPickup.cs b/SS2-Project/Assets/Starstorm2/Components/CoffeeBeanPickup.cs
index e097c0431..f389f4451 100644
--- a/SS2-Project/Assets/Starstorm2/Components/CoffeeBeanPickup.cs
+++ b/SS2-Project/Assets/Starstorm2/Components/CoffeeBeanPickup.cs
@@ -30,7 +30,9 @@ private void OnTriggerStay(Collider other)
else
SS2Util.RefreshOldestBuffStack(body, SS2Content.Buffs.BuffCoffeeBag, CoffeeBag.buffDuration * stack);
EffectManager.SimpleEffect(this.pickupEffect, base.transform.position, Quaternion.identity, true);
-
+
+ body.OnPickup(CharacterBody.PickupClass.Minor); // handle collectors compulsion
+
this.alive = false;
pooler.Cleanup();
diff --git a/SS2-Project/Assets/Starstorm2/Components/MimicEquipInventoryManager.cs b/SS2-Project/Assets/Starstorm2/Components/MimicEquipInventoryManager.cs
new file mode 100644
index 000000000..e552d9264
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Components/MimicEquipInventoryManager.cs
@@ -0,0 +1,119 @@
+using UnityEngine;
+using RoR2;
+using System.Collections.Generic;
+using MSU;
+using R2API;
+using SS2.Monsters;
+using UnityEngine.Networking;
+
+namespace SS2.Components
+{
+ [RequireComponent(typeof(CharacterBody))]
+ [RequireComponent(typeof(PurchaseInteraction))]
+ public class MimicEquipInventoryManager : MonoBehaviour
+ {
+ private List equipmentIndex = new List();
+ private CharacterBody characterBody;
+ public Transform pickupPivot;
+ public CharacterDirection cdir;
+ public BasicPickupDropTable dropTable;
+ public float rechestPreventionTime = 2.5f;
+
+ public void Start()
+ {
+ if (!pickupPivot || !cdir)
+ {
+ FindPivot();
+ }
+
+ if (!NetworkServer.active) return;
+
+ GlobalEventManager.onServerDamageDealt += PreventRechest;
+
+ UniquePickup pickup = dropTable.GeneratePickupPreReplacement(Run.instance.treasureRng);
+ EquipmentIndex equipIndex = PickupCatalog.GetPickupDef(pickup.pickupIndex)!.equipmentIndex;
+ characterBody = GetComponent();
+
+ if (characterBody && characterBody.inventory)
+ {
+ if (characterBody.inventory.GetItemCountEffective(RoR2Content.Items.UseAmbientLevel) <= 0)
+ {
+ characterBody.inventory.GiveItemPermanent(RoR2Content.Items.UseAmbientLevel);
+ }
+
+ if (characterBody.inventory.currentEquipmentIndex == EquipmentIndex.None)
+ {
+ characterBody.inventory.SetEquipmentIndexForSlot(equipIndex, 0);
+
+ AddEquip(equipIndex);
+ }
+ }
+ }
+
+ private void PreventRechest(DamageReport obj)
+ {
+ if (obj.attackerBody != characterBody) return;
+ rechestPreventionTime = 2.5f;
+ }
+
+ public void FindPivot()
+ {
+ var mloc = this.GetComponent();
+ if (mloc && mloc.modelTransform)
+ {
+ var cloc = mloc.modelTransform.GetComponent();
+ cdir = GetComponent();
+ if (cloc && cdir)
+ {
+ pickupPivot = cloc.FindChild("PickupPivot");
+ }
+ }
+ }
+
+ private void FixedUpdate()
+ {
+ if(rechestPreventionTime > 0)
+ {
+ rechestPreventionTime -= Time.fixedDeltaTime;
+ }
+ }
+
+ public void AddEquip(EquipmentIndex ind)
+ {
+ equipmentIndex.Add(ind);
+ }
+
+ public void DropItems()
+ {
+ var temp = pickupPivot.position;
+ EffectData effectData = new EffectData
+ {
+ origin = temp
+ };
+
+ EffectManager.SpawnEffect(SS2.Monsters.MimicEquip.itemStarburst, effectData, true);
+
+ if (equipmentIndex.Count > 0 && pickupPivot && cdir)
+ {
+ var dir = cdir.forward;
+ var angle = 90 / equipmentIndex.Count;
+
+ Vector3 vec = Vector3.up * 5 + dir * 5;
+ Quaternion rot = Quaternion.AngleAxis(angle, Vector3.up);
+
+ foreach (var ind in equipmentIndex)
+ {
+ var pind = RoR2.PickupCatalog.FindPickupIndex(ind);
+ PickupDropletController.CreatePickupDroplet(pind, pickupPivot.position, vec);
+ vec = rot * vec;
+ }
+ }
+
+ var cb = GetComponent();
+ if(cb && cb.inventory)
+ {
+ cb.inventory.CleanInventory();
+ }
+ }
+ }
+}
diff --git a/SS2-Project/Assets/Starstorm2/Components/MimicEquipInventoryManager.cs.meta b/SS2-Project/Assets/Starstorm2/Components/MimicEquipInventoryManager.cs.meta
new file mode 100644
index 000000000..da7a0737f
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Components/MimicEquipInventoryManager.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 2a0758b7a7ea466c82229ffe4f7ab76f
+timeCreated: 1784716134
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Components/MimicEquipTakenOrbEffect.cs b/SS2-Project/Assets/Starstorm2/Components/MimicEquipTakenOrbEffect.cs
new file mode 100644
index 000000000..3d112aa22
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Components/MimicEquipTakenOrbEffect.cs
@@ -0,0 +1,58 @@
+using System.Collections;
+using RoR2;
+using SS2;
+using UnityEngine;
+
+namespace Starstorm2.Components
+{
+ [RequireComponent(typeof(EffectComponent))]
+ public class MimicEquipTakenOrbEffect : MonoBehaviour
+ {
+ public TrailRenderer trailToColor;
+
+ public ParticleSystem[] particlesToColor;
+
+ public SpriteRenderer[] spritesToColor;
+
+ public SpriteRenderer iconSpriteRenderer;
+
+ private void OnEnable()
+ {
+ StartCoroutine(DelayedUpdateSprite());
+ }
+
+ private IEnumerator DelayedUpdateSprite()
+ {
+ yield return 0;
+ EquipmentDef equipDef = EquipmentCatalog.GetEquipmentDef((EquipmentIndex)Util.UintToIntMinusOne(GetComponent().effectData.genericUInt));
+ SS2Log.Debug($"equip def null ? {equipDef == null} {GetComponent()}");
+ SS2Log.Debug($"equip def null ? {equipDef == null} {GetComponent().effectData}");
+ SS2Log.Debug($"equip def null ? {equipDef.pickupIconSprite} {GetComponent().effectData.genericUInt}");
+ ColorCatalog.ColorIndex colorIndex = ColorCatalog.ColorIndex.Error;
+ Sprite sprite = null;
+ if (equipDef != null)
+ {
+ colorIndex = equipDef.colorIndex;
+ sprite = equipDef.pickupIconSprite;
+ }
+ Color color = ColorCatalog.GetColor(colorIndex);
+ if (trailToColor != null)
+ {
+ trailToColor.startColor *= color;
+ trailToColor.endColor *= color;
+ }
+ for (int i = 0; i < particlesToColor.Length; i++)
+ {
+ ParticleSystem obj = particlesToColor[i];
+ ParticleSystem.MainModule main = obj.main;
+ main.startColor = color;
+ obj.Play();
+ }
+ for (int j = 0; j < spritesToColor.Length; j++)
+ {
+ spritesToColor[j].color = color;
+ }
+ iconSpriteRenderer.sprite = equipDef.pickupIconSprite;
+ }
+ }
+}
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Components/MimicEquipTakenOrbEffect.cs.meta b/SS2-Project/Assets/Starstorm2/Components/MimicEquipTakenOrbEffect.cs.meta
new file mode 100644
index 000000000..656c27cb8
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Components/MimicEquipTakenOrbEffect.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: eec0a212940540a686be929e1d6396d1
+timeCreated: 1784719150
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs b/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs
index f3352b0ae..9077390eb 100644
--- a/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs
+++ b/SS2-Project/Assets/Starstorm2/Components/TeleporterUpgradeController.cs
@@ -12,9 +12,15 @@ public class TeleporterUpgradeController : NetworkBehaviour
private static void Init()
{
//Add teleporter upgrading component to teleporters
- Addressables.LoadAssetAsync("RoR2/Base/Teleporters/Teleporter1.prefab").WaitForCompletion().AddComponent();
- Addressables.LoadAssetAsync("RoR2/Base/Teleporters/LunarTeleporter Variant.prefab").WaitForCompletion().AddComponent();
+ On.RoR2.TeleporterInteraction.Awake += TeleporterInteractionAwakeAddFieldAcceleratorTeleporter;
}
+
+ private static void TeleporterInteractionAwakeAddFieldAcceleratorTeleporter(On.RoR2.TeleporterInteraction.orig_Awake orig, TeleporterInteraction self)
+ {
+ orig(self);
+ self.gameObject.AddComponent();
+ }
+
[SyncVar]
public bool isEthereal = false;
[SyncVar]
diff --git a/SS2-Project/Assets/Starstorm2/Modules/Artifacts/Cognation.cs b/SS2-Project/Assets/Starstorm2/Modules/Artifacts/Cognation.cs
index be65914d5..562a15b87 100644
--- a/SS2-Project/Assets/Starstorm2/Modules/Artifacts/Cognation.cs
+++ b/SS2-Project/Assets/Starstorm2/Modules/Artifacts/Cognation.cs
@@ -1,14 +1,10 @@
using MSU.Config;
using MSU;
-using R2API.ScriptableObjects;
using RoR2;
-using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using UnityEngine;
using UnityEngine.Networking;
-using UnityEngine.SceneManagement;
-using UObject = UnityEngine.Object;
using RoR2.ContentManagement;
using RoR2.Items;
@@ -99,7 +95,7 @@ private bool CanMasterBecomeGhost(CharacterMaster victimMaster)
if (!victimMaster.hasBody)
return false;
- if (victimMaster.inventory.GetItemCount(SS2Content.Items.CognationHelper) != 0)
+ if (victimMaster.inventory.GetItemCountEffective(SS2Content.Items.CognationHelper) != 0)
return false;
if (BlacklistedMasterIndices.Contains(victimMaster.masterIndex))
@@ -115,14 +111,16 @@ private MasterSummon PrepareMasterSummon(CharacterMaster master)
{
var body = master.GetBody();
- var ghostSummon = new MasterSummon();
- ghostSummon.ignoreTeamMemberLimit = true;
- ghostSummon.masterPrefab = MasterCatalog.GetMasterPrefab(master.masterIndex);
- ghostSummon.position = body.corePosition;
- ghostSummon.rotation = Quaternion.LookRotation(body.inputBank.GetAimRay().direction);
- ghostSummon.teamIndexOverride = master.teamIndex;
- ghostSummon.summonerBodyObject = null;
- ghostSummon.inventoryToCopy = inheritInventory ? master.inventory : null;
+ var ghostSummon = new MasterSummon
+ {
+ ignoreTeamMemberLimit = true,
+ masterPrefab = MasterCatalog.GetMasterPrefab(master.masterIndex),
+ position = body.corePosition,
+ rotation = Quaternion.LookRotation(body.inputBank.GetAimRay().direction),
+ teamIndexOverride = master.teamIndex,
+ summonerBodyObject = null,
+ inventoryToCopy = inheritInventory ? master.inventory : null
+ };
return ghostSummon;
}
@@ -151,8 +149,8 @@ private void SummonGhost(CharacterMaster ghostMaster, CharacterMaster originalMa
}
}
- ghostMaster.inventory.SetEquipmentIndex(originalMaster.inventory.currentEquipmentIndex);
- ghostMaster.inventory.GiveItem(SS2Content.Items.CognationHelper);
+ ghostMaster.inventory.SetEquipmentIndex(originalMaster.inventory.currentEquipmentIndex, true);
+ ghostMaster.inventory.GiveItemPermanent(SS2Content.Items.CognationHelper);
}
var timer = ghostMaster.gameObject.AddComponent();
@@ -170,13 +168,13 @@ private void Start()
{
if (body.teamComponent.teamIndex == TeamIndex.Player)
{
- body.inventory.RemoveItem(SS2Content.Items.CognationHelper, stack);
+ body.inventory.RemoveItemPermanent(SS2Content.Items.CognationHelper, stack);
Destroy(this);
}
- if (body.inventory.GetItemCount(SS2Content.Items.TerminationHelper) > 0)
+ if (body.inventory.GetItemCountEffective(SS2Content.Items.TerminationHelper) > 0)
{
- body.inventory.RemoveItem(SS2Content.Items.TerminationHelper);
+ body.inventory.RemoveItemPermanent(SS2Content.Items.TerminationHelper);
}
body.baseMaxHealth *= 3;
@@ -193,27 +191,32 @@ private void Start()
Transform modelTransform = modelLoc.modelTransform;
if (modelTransform)
{
- model = modelTransform.GetComponent();
+ model = modelTransform.gameObject.GetComponent();
}
}
-
- if (model)
+
+ ModelSkinController skinController = model?.gameObject.GetComponent();
+ if (skinController)
{
- //SS2Log.Info("swapping shader");
- ModifyCharacterModel();
+ skinController.onSkinApplied += ApplyGhostMat;
}
}
- private void ModifyCharacterModel()
+ private void ApplyGhostMat(int obj)
{
- for (int i = 0; i < model.baseRendererInfos.Length; i++)
+ if (model)
{
- var mat = model.baseRendererInfos[i].defaultMaterial;
- if (mat.shader.name.StartsWith("Hopoo Games/Deferred"))
+ //SS2Log.Info($"swapping shader skin applied {model.baseRendererInfos.Length}");
+
+ for (int i = 0; i < model.baseRendererInfos.Length; i++)
{
- //SS2Log.Info("swapping shader real " +mat.shader.name + " | " + ghostMaterial + "
- mat = ghostMaterial;
- model.baseRendererInfos[i].defaultMaterial = mat;
+ var mat = model.baseRendererInfos[i].defaultMaterial;
+ if (mat.shader.name.StartsWith("Hopoo Games/Deferred"))
+ {
+ //SS2Log.Info("swapping shader real " + mat.shader.name + " | " + ghostMaterial);
+ mat = ghostMaterial;
+ model.baseRendererInfos[i].defaultMaterial = mat;
+ }
}
}
}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/MimicEquip.cs b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/MimicEquip.cs
new file mode 100644
index 000000000..eaf56a137
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/MimicEquip.cs
@@ -0,0 +1,193 @@
+using System.Linq;
+using MSU;
+using R2API;
+using RoR2;
+using SS2.Components;
+using EntityStates.MimicEquip;
+using On.EntityStates.GummyClone;
+using RoR2.ContentManagement;
+using RoR2.Orbs;
+using Starstorm2.Components;
+using UnityEngine;
+using UnityEngine.AddressableAssets;
+using static R2API.DamageAPI;
+
+namespace SS2.Monsters
+{
+ public sealed class MimicEquip : SS2Monster
+ {
+ public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acMimicEquip", SS2Bundle.Indev);
+
+ public static GameObject _masterPrefab;
+ public static ModdedDamageType StealItemDamageType { get; private set; }
+
+ public GameObject equipOrb;
+
+ public static GameObject itemStarburst;
+ public static GameObject zipperVFX;
+ public static GameObject jetVFX;
+ public static GameObject leapLandVFX;
+ public static GameObject rechestVFX;
+
+ public override void Initialize()
+ {
+ _masterPrefab = AssetCollection.FindAsset("MimicEquipMaster");
+
+ GlobalEventManager.onServerDamageDealt += ServerDamageStealItem;
+ GlobalEventManager.onCharacterDeathGlobal += CharacterDeathGlobalMimicTaunt;
+
+ On.RoR2.Util.GetBestBodyName += GetBestBodyNameRenameMimic;
+ On.RoR2.CharacterMaster.Respawn_Vector3_Quaternion_bool += RespawnMimicFixHitboxes;
+ On.EntityStates.GummyClone.GummyCloneSpawnState.OnEnter += GummyCloneSpawnStateOnOnEnter;
+
+ StealItemDamageType = ReserveDamageType();
+
+ equipOrb = AssetCollection.FindAsset("EquipTakenOrbEffect");
+
+ jetVFX = Addressables.LoadAssetAsync("RoR2/Base/Commando/CommandoDashJets.prefab").WaitForCompletion();
+ leapLandVFX = Addressables.LoadAssetAsync("RoR2/Base/Toolbot/CryoCanisterExplosionSecondary.prefab").WaitForCompletion();
+ rechestVFX = Addressables.LoadAssetAsync("RoR2/Base/Toolbot/RoboCratePodGroundImpact.prefab").WaitForCompletion();
+
+ itemStarburst = AssetCollection.FindAsset("Chest1Starburst");
+ zipperVFX = AssetCollection.FindAsset("ChestUnzipReal");
+
+ var ping = Addressables.LoadAssetAsync("RoR2/Base/ChestIcon_1.png").WaitForCompletion();
+ var mid = AssetCollection.FindAsset("idMimicEquip");
+ mid.Info.Visual = ping;
+
+ var commando = Addressables.LoadAssetAsync("RoR2/Base/Commando/CommandoBody.prefab").WaitForCompletion();
+ var commandoBank = commando.GetComponent();
+ var mimicBank = AssetCollection.bodyPrefab.AddComponent();
+ SS2Util.CopyComponent(commandoBank, AssetCollection.bodyPrefab);
+ }
+
+ private void GummyCloneSpawnStateOnOnEnter(GummyCloneSpawnState.orig_OnEnter orig, EntityStates.GummyClone.GummyCloneSpawnState self)
+ {
+ orig(self);
+
+ if (self.characterBody.baseNameToken == "SS2_MIMIC_EQUIP_BODY_NAME")
+ {
+ var next = new MimicEquipChestInteractableIdle() { };
+ self.outer.SetNextState(next); //leap begin
+ }
+ }
+
+ private void ServerDamageStealItem(DamageReport obj)
+ {
+ if (obj.damageInfo.HasModdedDamageType(MimicEquip.StealItemDamageType) && obj.victimBody && obj.victimBody.inventory && obj.attackerBody && obj.attackerBody.inventory)
+ {
+ EquipmentIndex survEquipIndex = obj.victimBody.inventory.GetEquipmentIndex();
+ if (survEquipIndex == EquipmentIndex.None) return;
+
+ MimicEquipInventoryManager equipInventoryManager = obj.attackerBody.gameObject.GetComponent();
+ if (!equipInventoryManager) return;
+
+ // i think its more interesting if ther mimic has a random equip it uses .,., .but idk !
+ //obj.attackerBody.inventory.SetEquipmentIndex(itemList, false);
+ obj.victimBody.inventory.RemoveEquipment(survEquipIndex);
+ equipInventoryManager.AddEquip(survEquipIndex);
+
+ EffectData effectData = new EffectData
+ {
+ origin = obj.victimBody.corePosition,
+ genericFloat = 1.5f,
+ genericUInt = (uint)(survEquipIndex + 1)
+ };
+ effectData.SetNetworkedObjectReference(obj.attacker);
+ EffectManager.SpawnEffect(equipOrb, effectData, true);
+
+ PickupDef pickupDef = PickupCatalog.GetPickupDef(PickupCatalog.FindPickupIndex(survEquipIndex));
+ Chat.SendBroadcastChat(new MimicTheftMessage
+ {
+ subjectAsCharacterBody = obj.attackerBody,
+ baseToken = "SS2_MIMIC_THEFT",
+ pickupToken = pickupDef.nameToken,
+ pickupColor = pickupDef.baseColor,
+ victimName = obj.victimBody.GetDisplayName()
+ });
+ }
+ }
+
+ private string GetBestBodyNameRenameMimic(On.RoR2.Util.orig_GetBestBodyName orig, GameObject bodyObject)
+ {
+ if (bodyObject && bodyObject.TryGetComponent(out var mpc) && mpc.isInteractable)
+ {
+ if(bodyObject.TryGetComponent(out var gdnp)){
+ return gdnp.GetDisplayName();
+ }
+ }
+ return orig(bodyObject);
+ }
+
+ //Puts the mimic back into chest mode after it kills someone.
+ private void CharacterDeathGlobalMimicTaunt(DamageReport obj)
+ {
+ if (obj.victimBody && obj.victimBody.isPlayerControlled && obj.attacker && obj.attackerMaster && obj.attackerMaster.masterIndex == MasterCatalog.FindMasterIndex(_masterPrefab))
+ {
+ var bodyESM = EntityStateMachine.FindByCustomName(obj.attackerMaster.bodyInstanceObject, "Body");
+ var rechest = new MimicEquipChestRechest { taunting = true };
+ bodyESM.SetNextState(rechest);
+
+ var weaponESM = EntityStateMachine.FindByCustomName(obj.attackerMaster.bodyInstanceObject, "Weapon");
+ weaponESM.SetNextStateToMain();
+ }
+ }
+
+ //Makes it so Respawned mimics via Dios and Void Dios are not invulnerable until purchased.
+ private CharacterBody RespawnMimicFixHitboxes(On.RoR2.CharacterMaster.orig_Respawn_Vector3_Quaternion_bool orig, CharacterMaster self, Vector3 footPosition, Quaternion rotation, bool wasRevivedMidStage)
+ {
+ var output = orig(self, footPosition, rotation, wasRevivedMidStage);
+
+ if(self.masterIndex == MasterCatalog.FindMasterIndex(_masterPrefab))
+ {
+ if(self.inventory.GetItemCount(RoR2Content.Items.ExtraLifeConsumed) > 0 || self.inventory.GetItemCount(DLC1Content.Items.ExtraLifeVoidConsumed) > 0)
+ {
+ var esm = EntityStateMachine.FindByCustomName(self.bodyInstanceObject, "Body");
+ esm.SetNextState(new MimicEquipChestActivateEnter());
+ }
+ }
+
+ return output;
+ }
+
+ [ConCommand(commandName = "spawn_equipmimic", flags = ConVarFlags.None, helpText = "Spawns a Security Barrel with the specified equipment def.")]
+ public static void SpawnEquipMimic(ConCommandArgs args)
+ {
+ var spawnCard = SS2Assets.LoadAsset("scMimicEquip", SS2Bundle.Indev);
+ if (spawnCard == null)
+ {
+ spawnCard = ScriptableObject.CreateInstance();
+ spawnCard.prefab = _masterPrefab;
+ spawnCard.sendOverNetwork = true;
+ var body = spawnCard.prefab.GetComponent().bodyPrefab;
+ }
+ var spawnRequest = new DirectorSpawnRequest(
+ spawnCard,
+ new DirectorPlacementRule
+ {
+ placementMode = DirectorPlacementRule.PlacementMode.Direct,
+ position = args.senderBody.footPosition
+ },
+ RoR2Application.rng
+ );
+ spawnRequest.summonerBodyObject = null;
+ spawnRequest.teamIndexOverride = TeamIndex.Monster;
+ spawnRequest.ignoreTeamMemberLimit = true;
+
+ var masterGameObject = spawnCard.DoSpawn(args.senderBody.footPosition, Quaternion.identity, spawnRequest).spawnedInstance;
+ if (args.TryGetArgInt(0) != null)
+ {
+ masterGameObject.GetComponent().inventory.SetEquipmentIndexForSlot((EquipmentIndex)args.GetArgInt(0), 0);
+ }
+ else
+ {
+ masterGameObject.GetComponent().inventory.SetEquipmentIndexForSlot(EquipmentCatalog.equipmentDefs.FirstOrDefault(def => def.name == args.GetArgString(0)).equipmentIndex, 0);
+ }
+ }
+
+ public override bool IsAvailable(ContentPack contentPack)
+ {
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/MimicEquip.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/MimicEquip.cs.meta
new file mode 100644
index 000000000..2d91043c6
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/Characters/Monsters/MimicEquip.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: a5154a71bd3840a0a61d9ffe3d10f292
+timeCreated: 1784713610
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Chirr/GrabDash.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Chirr/GrabDash.cs
index f15cb80e9..5bc3d2d6d 100644
--- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Chirr/GrabDash.cs
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Chirr/GrabDash.cs
@@ -85,31 +85,29 @@ public void AttemptGrab(float grabRadius)
sphereSearch.FilterCandidatesByDistinctHurtBoxEntities();
HurtBox[] hurtBoxes = sphereSearch.GetHurtBoxes();
foreach (HurtBox hurtBox in hurtBoxes)
- {
- if (hurtBox)
- {
- HealthComponent healthComponent = hurtBox.healthComponent;
- if (healthComponent && healthComponent.gameObject != base.gameObject)
- {
- if (!healthComponent.body.isChampion || (healthComponent.gameObject.name.Contains("Brother") && healthComponent.gameObject.name.Contains("Body")) || healthComponent.body.GetComponent())
- {
- //Vector3 between = hurtBox.healthComponent.transform.position - base.transform.position;
- //Vector3 v = between / 4f;
- //v.y = Math.Max(v.y, between.y);
- //base.characterMotor.AddDisplacement(v);
- // ^^^ SNAP TO VICTIM
- bool canGrab = BodyIsGrabbable(healthComponent.gameObject);
- if (!SS2.Survivors.Chirr.grabDrones) canGrab &= !IsBodyDrone(healthComponent.body);
- if(canGrab)
- {
- this.OnGrabBodyAuthority(hurtBox.healthComponent.body);
- return;
- }
-
- }
- }
- }
- }
+ {
+ if (!hurtBox) continue;
+
+ HealthComponent healthComponent = hurtBox.healthComponent;
+ if (!healthComponent || healthComponent.gameObject == base.gameObject) continue;
+
+ if (!healthComponent.body.isChampion || (healthComponent.gameObject.name.Contains("Brother") && healthComponent.gameObject.name.Contains("Body")) || healthComponent.body.GetComponent())
+ {
+ //Vector3 between = hurtBox.healthComponent.transform.position - base.transform.position;
+ //Vector3 v = between / 4f;
+ //v.y = Math.Max(v.y, between.y);
+ //base.characterMotor.AddDisplacement(v);
+ // ^^^ SNAP TO VICTIM
+ bool canGrab = BodyIsGrabbable(healthComponent.gameObject);
+ if (!SS2.Survivors.Chirr.grabDrones) canGrab &= !IsBodyDrone(healthComponent.body);
+ if (healthComponent.body.bodyIndex == DLC3Content.BodyPrefabs.ExhaustPortWeakpointBody.bodyIndex) canGrab = false;
+ if(canGrab)
+ {
+ this.OnGrabBodyAuthority(hurtBox.healthComponent.body);
+ return;
+ }
+ }
+ }
}
private bool IsBodyDrone(CharacterBody body)
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Executioner2/FireChargeGun.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Executioner2/FireChargeGun.cs
index 53b954663..1218a98c2 100644
--- a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Executioner2/FireChargeGun.cs
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/Executioner2/FireChargeGun.cs
@@ -215,6 +215,7 @@ private void Shoot()
};
bulletAttack.Fire();
+ characterBody.AddIncreasePrimaryDamageStack();
}
}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip.meta
new file mode 100644
index 000000000..0f1527dad
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: a1c890134166495799b7c0deb7b699dc
+timeCreated: 1784714407
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate.meta
new file mode 100644
index 000000000..eed4a4043
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 091b322c57e4496081040ea2c3dc6b36
+timeCreated: 1784714407
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateEnter.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateEnter.cs
new file mode 100644
index 000000000..56d07c5eb
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateEnter.cs
@@ -0,0 +1,158 @@
+using RoR2;
+using RoR2.CharacterAI;
+using RoR2.Hologram;
+using SS2;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Networking;
+
+namespace EntityStates.MimicEquip
+{
+ public class MimicEquipChestActivateEnter : BaseState
+ {
+ public static float baseDuration;
+ private float duration;
+
+ protected PurchaseInteraction purchaseInter;
+
+ private bool endedSuccessfully = false;
+ BaseAI ai;
+
+ GameObject lVFX;
+ GameObject rVFX;
+
+ public CharacterBody? target;
+ public HurtBox? hurt;
+
+ protected virtual bool enableInteraction => false;
+
+ public override void OnEnter()
+ {
+ duration = baseDuration / attackSpeedStat;
+ base.OnEnter();
+
+ PlayCrossfade("FullBody, Override", "ActivateEnter", "Activate.playbackRate", duration, 0.05f);
+
+ var animator = GetModelAnimator();
+ animator.SetBool("isGrounded", false);
+
+ purchaseInter = GetComponent();
+ if (NetworkServer.active && purchaseInter)
+ {
+ purchaseInter.SetAvailable(enableInteraction);
+ }
+
+ //Replicating the chest opening zipper
+ var master = characterBody.master;
+ if (master)
+ {
+ ai = master.GetComponent();
+ }
+
+
+ var zipL = FindModelChild("ZipperL");
+ if (zipL)
+ {
+ lVFX = UnityEngine.Object.Instantiate(SS2.Monsters.MimicEquip.zipperVFX, zipL);
+ }
+
+ var zipR = FindModelChild("ZipperR");
+ if (zipR)
+ {
+ rVFX = UnityEngine.Object.Instantiate(SS2.Monsters.MimicEquip.zipperVFX, zipR);
+ }
+
+ //Trying to aim at the interactor if it was purchased, or just at the nearest player
+ GetComponent().enabled = true;
+
+ if (target)
+ {
+ AimInDirection(ref ai.bodyInputs, (target.corePosition - transform.position).normalized);
+ }
+ else if(NetworkServer.active && isAuthority)
+ {
+ SphereSearch sphere = new SphereSearch();
+ List list = new List();
+
+ sphere.origin = this.transform.position;
+ sphere.mask = LayerIndex.entityPrecise.mask;
+ sphere.radius = 25f;
+ sphere.RefreshCandidates();
+ sphere.FilterCandidatesByHurtBoxTeam(TeamMask.GetUnprotectedTeams(characterBody.teamComponent.teamIndex));
+ sphere.FilterCandidatesByDistinctHurtBoxEntities();
+ sphere.OrderCandidatesByDistance();
+ sphere.GetHurtBoxes(list);
+ sphere.ClearCandidates();
+ if(list.Count > 0)
+ {
+ hurt = list[0];
+ AimInDirection(ref ai.bodyInputs, (hurt.transform.position - transform.position).normalized);
+ }
+ }
+ }
+
+ public override void FixedUpdate()
+ {
+ base.FixedUpdate();
+ if (fixedAge >= duration/4 && isAuthority && ai)
+ {
+ SS2Log.Debug($"updating aim to look at {ai.bodyInputs.desiredAimDirection}");
+ ai.UpdateBodyAim(Time.fixedDeltaTime);
+ }
+
+ if (fixedAge >= duration)
+ {
+ endedSuccessfully = true;
+ if (isAuthority)
+ {
+ outer.SetNextState(new MimicEquipChestActivateLoop());
+ }
+ }
+ }
+
+ public override void OnExit()
+ {
+ Destroy(lVFX);
+ Destroy(rVFX);
+
+ if (!endedSuccessfully)
+ {
+ PlayAnimation("FullBody, Override", "BufferEmpty");
+ }
+
+ //Setup more of the CharacterBody to actually work as an enemy
+ var intermediate = GetComponent();
+ var hbxg = intermediate.modelTransform.GetComponent();
+ foreach (var box in hbxg.hurtBoxes)
+ {
+ box.gameObject.SetActive(true);
+ }
+
+ GetComponent().enabled = false;
+ intermediate.modelTransform.GetComponent().FindChildGameObject("HologramPivot").SetActive(false);
+
+ intermediate.modelTransform.GetComponent().enabled = false;
+
+ characterBody.skillLocator.special.RemoveAllStocks();
+ characterBody.skillLocator.secondary.AddOneStock();
+ GetComponent().displayToken = "SS2_MIMIC_EQUIP_BODY_NAME";
+
+ base.OnExit();
+ }
+
+
+ protected void AimInDirection(ref BaseAI.BodyInputs dest, Vector3 aimDirection)
+ {
+ if (aimDirection != Vector3.zero)
+ {
+ dest.desiredAimDirection = aimDirection;
+ }
+ }
+
+ public override InterruptPriority GetMinimumInterruptPriority()
+ {
+ return InterruptPriority.PrioritySkill;
+ }
+ }
+}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateEnter.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateEnter.cs.meta
new file mode 100644
index 000000000..7ff3d2010
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateEnter.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: be9c72932e63417896597ded932033dd
+timeCreated: 1784714407
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateExit.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateExit.cs
new file mode 100644
index 000000000..95decac9b
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateExit.cs
@@ -0,0 +1,41 @@
+using RoR2;
+using SS2;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+namespace EntityStates.MimicEquip
+{
+ public class MimicEquipChestActivateExit : BaseState
+ {
+ public static float baseDuration;
+ private float duration;
+
+ public override void OnEnter()
+ {
+ duration = baseDuration / attackSpeedStat;
+ base.OnEnter();
+
+ PlayCrossfade("FullBody, Override", "ActivateExit", "Activate.playbackRate", duration, 0.05f);
+ Util.PlaySound("Play_MULT_shift_hit", gameObject);
+ }
+
+ public override void FixedUpdate()
+ {
+ base.FixedUpdate();
+ if (fixedAge >= duration && isAuthority)
+ {
+ outer.SetNextStateToMain();
+ }
+ }
+
+ public override void OnExit()
+ {
+ base.OnExit();
+ }
+
+ public override InterruptPriority GetMinimumInterruptPriority()
+ {
+ return InterruptPriority.PrioritySkill;
+ }
+ }
+}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateExit.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateExit.cs.meta
new file mode 100644
index 000000000..e646aea76
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateExit.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: c6e2149ddb834683a10dd77f97527dd8
+timeCreated: 1784714407
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateLoop.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateLoop.cs
new file mode 100644
index 000000000..a2c7b5360
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateLoop.cs
@@ -0,0 +1,167 @@
+using R2API;
+using RoR2;
+using SS2;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.AddressableAssets;
+using UnityEngine.Networking;
+
+namespace EntityStates.MimicEquip
+{
+ public class MimicEquipChestActivateLoop : BaseCharacterMain
+ {
+ public static float baseDuration;
+ private float duration;
+ public static float blastRadius;
+
+ public static float blastProcCoefficient;
+ public static float damageCoeff;
+
+ public float blastForce;
+ public Vector3 blastBonusForce;
+ public static float knockbackForce;
+
+ public static string leapSoundString;
+
+ public GameObject blastImpactEffectPrefab;
+ public GameObject blastEffectPrefab;
+
+ public static float airControl;
+
+ public static float aimVelocity;
+ public static float upwardVelocity;
+ public static float forwardVelocity;
+
+ public static float minimumY;
+ public static float minYVelocityForAnim;
+ public static float maxYVelocityForAnim;
+
+ public static string soundLoopStartEvent;
+ public static string soundLoopStopEvent;
+
+ public static NetworkSoundEventDef landingSound;
+
+ private float previousAirControl;
+ protected bool isCritAuthority;
+
+ private bool endedSuccessfully = false;
+
+ public override void OnEnter()
+ {
+ duration = baseDuration / attackSpeedStat;
+ base.OnEnter();
+ PlayCrossfade("FullBody, Override", "ActivateLoop", "Activate.playbackRate", duration, 0.05f);
+
+ previousAirControl = characterMotor.airControl;
+ characterMotor.airControl = airControl;
+
+ Vector3 direction = GetAimRay().direction;
+ if (isAuthority)
+ {
+ characterBody.isSprinting = true;
+ direction.y = Mathf.Max(direction.y, minimumY);
+ Vector3 a = direction.normalized * aimVelocity * moveSpeedStat;
+ Vector3 b = Vector3.up * upwardVelocity;
+ Vector3 b2 = new Vector3(direction.x, 0f, direction.z).normalized * forwardVelocity;
+ characterMotor.Motor.ForceUnground(0.1f);
+ characterMotor.velocity = a + b + b2;
+ isCritAuthority = RollCrit();
+ }
+ if (NetworkServer.active)
+ {
+ characterBody.AddTimedBuff(JunkContent.Buffs.IgnoreFallDamage, 0.25f, 1);
+ characterBody.AddTimedBuff(RoR2Content.Buffs.ArmorBoost, duration);
+ }
+ GetModelTransform().GetComponent().enabled = true;
+
+ Util.PlaySound(leapSoundString, gameObject);
+ characterDirection.moveVector = direction;
+ Util.PlaySound(soundLoopStartEvent, gameObject);
+
+
+ var lThruster = FindModelChild("ThrusterL");
+ var rThruster = FindModelChild("ThrusterR");
+
+ if (lThruster)
+ {
+ UnityEngine.Object.Instantiate(SS2.Monsters.MimicEquip.jetVFX, lThruster);
+ }
+
+ if (rThruster)
+ {
+ UnityEngine.Object.Instantiate(SS2.Monsters.MimicEquip.jetVFX, rThruster);
+ }
+ }
+
+ public override void FixedUpdate()
+ {
+ base.FixedUpdate();
+ if (characterMotor)
+ {
+ if (fixedAge >= duration)
+ {
+ endedSuccessfully = true;
+ if (isAuthority)
+ {
+ outer.SetNextState(new MimicEquipChestActivateExit());
+ }
+ }
+ }
+ }
+
+ protected BlastAttack.Result DetonateAuthority()
+ {
+ DamageTypeCombo damageTypeCombo = DamageType.Generic;
+ damageTypeCombo.damageSource = DamageSource.Special;
+ BlastAttack attack = new BlastAttack
+ {
+ attacker = gameObject,
+ baseDamage = damageStat * damageCoeff,
+ baseForce = blastForce,
+ bonusForce = blastBonusForce,
+ crit = isCritAuthority,
+ damageType = damageTypeCombo,
+ falloffModel = BlastAttack.FalloffModel.None,
+ procCoefficient = blastProcCoefficient,
+ radius = blastRadius,
+ position = characterBody.corePosition,
+ attackerFiltering = AttackerFiltering.NeverHitSelf,
+ teamIndex = teamComponent.teamIndex,
+ };
+
+ attack.AddModdedDamageType(SS2.Monsters.MimicEquip.StealItemDamageType);
+
+ EffectData effectData = new EffectData
+ {
+ origin = characterBody.corePosition
+ };
+ effectData.SetNetworkedObjectReference(this.gameObject);
+ EffectManager.SpawnEffect(SS2.Monsters.MimicEquip.leapLandVFX, effectData, transmit: true);
+
+ return attack.Fire();
+ }
+
+ public override void OnExit()
+ {
+ base.OnExit();
+
+ Util.PlaySound(soundLoopStopEvent, gameObject);
+ characterMotor.airControl = previousAirControl;
+
+ if (!endedSuccessfully)
+ {
+ PlayAnimation("FullBody, Override", "BufferEmpty");
+ }
+ else if(NetworkServer.active && isAuthority)
+ {
+ DetonateAuthority();
+ }
+ }
+
+ public override InterruptPriority GetMinimumInterruptPriority()
+ {
+ return InterruptPriority.PrioritySkill;
+ }
+ }
+}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateLoop.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateLoop.cs.meta
new file mode 100644
index 000000000..ebf4990d4
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipActivate/MimicEquipChestActivateLoop.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: b4c771d54a9a4772acecaceb7af6df84
+timeCreated: 1784714407
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestDeath.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestDeath.cs
new file mode 100644
index 000000000..2a89bbd19
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestDeath.cs
@@ -0,0 +1,110 @@
+using KinematicCharacterController;
+using RoR2;
+using RoR2.Hologram;
+using SS2;
+using SS2.Components;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.AddressableAssets;
+using UnityEngine.Networking;
+
+namespace EntityStates.MimicEquip
+{
+ public class MimicEquipChestDeath : GenericCharacterDeath
+ {
+ GameObject lVFX;
+ GameObject rVFX;
+ bool hasDropped = false;
+ bool shouldMakeVFX = true;
+
+ MimicEquipInventoryManager mimicInventory;
+
+ public override bool shouldAutoDestroy => false;
+
+ public override void OnEnter()
+ {
+ base.OnEnter();
+
+ PlayAnimation("Gesture, Override", "BufferEmpty");
+ PlayAnimation("FullBody, Override", "BufferEmpty");
+
+ if(characterBody.modelLocator.modelTransform.TryGetComponent(out var cmodel))
+ {
+ if(cmodel.invisibilityCount >= 1)
+ {
+ shouldMakeVFX = false;
+ }
+ }
+
+ //Replicating the chest opening VFX
+ var zipL = FindModelChild("ZipperL");
+ if (zipL && shouldMakeVFX)
+ {
+ lVFX = UnityEngine.Object.Instantiate(SS2.Monsters.MimicEquip.zipperVFX, zipL);
+ }
+
+ var zipR = FindModelChild("ZipperR");
+ if (zipR && shouldMakeVFX)
+ {
+ rVFX = UnityEngine.Object.Instantiate(SS2.Monsters.MimicEquip.zipperVFX, zipR);
+ }
+
+ var purchaseInter = GetComponent();
+ if (NetworkServer.active && purchaseInter)
+ {
+ purchaseInter.SetAvailable(false);
+ }
+ var holo = GetComponent();
+ if (holo)
+ {
+ holo.enabled = false;
+ }
+
+ //Let them smush into the ground more
+ var kinematic = GetComponent();
+ kinematic.SetCapsuleDimensions(kinematic.CapsuleRadius, kinematic.CapsuleHeight, 1.88f);
+
+ mimicInventory = gameObject.GetComponent();
+
+ if (TryGetComponent(out var soa))
+ {
+ soa.grabbable = false;
+ }
+ }
+
+ public override void FixedUpdate()
+ {
+ base.FixedUpdate();
+ //Attempting to lock mimic in place when it dies
+ characterMotor.velocity.x = 0;
+ characterMotor.velocity.z = 0;
+
+ if (fixedAge > 1.5f && !hasDropped && mimicInventory)
+ {
+ hasDropped = true;
+ mimicInventory.DropItems();
+ }
+ if (!shouldMakeVFX && !hasDropped && mimicInventory)
+ {
+ hasDropped = true;
+ mimicInventory.DropItems();
+ }
+ }
+
+ public override void OnExit()
+ {
+ base.OnExit();
+
+ if (lVFX)
+ {
+ GameObject.Destroy(lVFX);
+ }
+
+ if (rVFX)
+ {
+ GameObject.Destroy(rVFX);
+ }
+
+ }
+ }
+}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestDeath.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestDeath.cs.meta
new file mode 100644
index 000000000..df6aee2d6
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestDeath.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 3acd2df1887943a9b4621b9f2a066171
+timeCreated: 1784714407
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestInteractableIdle.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestInteractableIdle.cs
new file mode 100644
index 000000000..80b651a50
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestInteractableIdle.cs
@@ -0,0 +1,275 @@
+using KinematicCharacterController;
+using RoR2;
+using RoR2.Hologram;
+using SS2;
+using SS2.Components;
+using System;
+using MSU;
+using UnityEngine;
+using UnityEngine.Networking;
+
+namespace EntityStates.MimicEquip
+{
+ public class MimicEquipChestInteractableIdle : BaseState
+ {
+ protected PurchaseInteraction purchaseInter;
+
+ protected virtual bool enableInteraction
+ {
+ get
+ {
+ return true;
+ }
+ }
+
+ private bool activated = false;
+
+ public static float baseDuration;
+ private float duration;
+
+ private float timer = 0;
+ private CharacterBody target;
+ public bool rechest = false;
+ public float healthPrevious;
+
+
+ public override void OnEnter()
+ {
+ base.OnEnter();
+ duration = baseDuration / attackSpeedStat;
+
+ purchaseInter = GetComponent();
+ if (NetworkServer.active && purchaseInter)
+ {
+ purchaseInter.SetAvailable(enableInteraction);
+ }
+
+ purchaseInter.onPurchase.AddListener(delegate (Interactor interactor)
+ {
+ OnPurchaseMimic(interactor, purchaseInter);
+ });
+
+ if (!rechest)
+ {
+ int adjust = UnityEngine.Random.Range(0, 2) - 1;
+ purchaseInter.cost += adjust;
+
+ //Turn off gravity, so they don't fall through the ground on some uneven surfaces
+ characterMotor.velocity = Vector3.zero;
+ var characterGravityParameterProvider = gameObject.GetComponent();
+ if (characterGravityParameterProvider != null)
+ {
+ CharacterGravityParameters gravityParameters = characterGravityParameterProvider.gravityParameters;
+ ++gravityParameters.channeledAntiGravityGranterCount;
+ characterGravityParameterProvider.gravityParameters = gravityParameters;
+ }
+ }
+ else
+ {
+ characterBody.GetComponent().enabled = true;
+ characterBody.GetComponent().enabled = false;
+
+ characterBody.GetComponent().displayToken = "EQUIPMENTBARREL_NAME";
+
+ var intermediate = GetComponent();
+ intermediate.modelTransform.GetComponent().FindChildGameObject("HologramPivot").SetActive(true);
+
+ if (modelLocator && modelLocator.modelTransform)
+ {
+ var mdl = modelLocator.modelTransform;
+ mdl.GetComponent().enabled = true;
+ }
+
+ EffectData effectData = new EffectData { origin = characterBody.corePosition };
+ EffectManager.SpawnEffect(SS2.Monsters.MimicEquip.rechestVFX, effectData, transmit: false);
+
+ PlayAnimation("Body", "IntermediateIdle");
+
+ GetComponent().enabled = true;
+
+ if (NetworkServer.active)
+ {
+ ProcChainMask mask = new ProcChainMask();
+ healthComponent.HealFraction(.5f, mask);
+ Util.CleanseBody(characterBody, true, true, true, true, true, false);
+ }
+ }
+
+ var setstate = GetComponent();
+ if (setstate)
+ {
+ setstate.canBeFrozen = false;
+ setstate.canBeStunned = false;
+ }
+
+ var pingc = GetComponent();
+ pingc.isInteractable = true;
+
+ if (characterBody)
+ {
+ if (characterBody.modelLocator)
+ {
+ if (characterBody.modelLocator.modelTransform)
+ {
+ var anim = characterBody.modelLocator.modelTransform.GetComponent();
+ if (anim)
+ {
+ anim.SetBool("aimActive", false);
+ }
+ }
+ }
+ }
+
+ //respawn edge cases ,.,.
+ if (characterBody.HasItem(DLC1Content.Items.GummyCloneIdentifier) || characterBody.HasBuff(DLC2Content.Buffs.ExtraLifeBuff))
+ {
+ characterBody.master.money = (uint)purchaseInter.cost;
+ //having it repurchase itself since some purchase stuff is done in unity .,,.
+ purchaseInter.OnInteractionBegin(characterBody.gameObject.GetComponent());
+ timer = duration;
+ target = null;
+
+ GetComponent().enabled = false;
+ GetComponent().modelTransform.GetComponent().FindChildGameObject("HologramPivot").SetActive(false);
+ purchaseInter.SetAvailable(false);
+ }
+ }
+
+ private void OnPurchaseMimic(Interactor interactor, PurchaseInteraction purchaseInter)
+ {
+ PlayCrossfade("Body", "Activate", "Activate.playbackRate", 1, 0.05f);
+ timer = 0;
+ activated = true;
+ target = interactor?.GetComponent();
+ }
+
+ public override void FixedUpdate()
+ {
+ base.FixedUpdate();
+
+ HandleSkill(base.skillLocator.special, ref base.inputBank.skill4);
+ skillLocator.secondary.RemoveAllStocks();
+
+ if (activated)
+ {
+ timer += Time.fixedDeltaTime;
+ if (timer >= duration && isAuthority)
+ {
+ var next = new MimicEquipChestActivateEnter { target = this.target };
+ outer.SetNextState(next); //leap begin
+ }
+ }
+
+ if (healthPrevious > healthComponent.health && isAuthority)
+ {
+ var next = new MimicEquipChestActivateEnter { target = this.target };
+ outer.SetNextState(next); //leap begin
+ }
+ else
+ {
+ healthPrevious = healthComponent.health;
+ }
+
+
+ if (rechest)
+ {
+ //After rechesting, they'll be fine - just make it so they can't move, but do fall correctly
+ characterMotor.velocity.x = 0;
+ characterMotor.velocity.z = 0;
+ }
+ else
+ {
+ //Lock then in place so they don't fall through the map on uneven ground
+ characterMotor.velocity = Vector3.zero;
+ }
+
+ }
+
+ //Allows mimic to cast Jumpscare while in chest mode
+ void HandleSkill(GenericSkill skillSlot, ref InputBankTest.ButtonState buttonState)
+ {
+ if (skillSlot && !(skillSlot.skillDef == null) && (buttonState.down || !skillSlot.skillDef) && (!skillSlot.mustKeyPress || !buttonState.hasPressBeenClaimed))
+ {
+ if (rechest)
+ {
+ if (UnityEngine.Random.Range(0, 3) == 0)
+ {
+ skillSlot.ExecuteIfReady();
+ buttonState.hasPressBeenClaimed = true;
+ }
+ else
+ {
+ skillSlot.RemoveAllStocks();
+ }
+ }
+ else
+ {
+ if (UnityEngine.Random.Range(0, 4) == 0)
+ {
+ skillSlot.ExecuteIfReady();
+ buttonState.hasPressBeenClaimed = true;
+ }
+ else
+ {
+ skillSlot.RemoveAllStocks();
+ }
+ }
+ }
+ }
+
+ public override void OnExit()
+ {
+ base.OnExit();
+ if (characterBody)
+ {
+ if (characterBody.modelLocator)
+ {
+ if (characterBody.modelLocator.modelTransform)
+ {
+ var anim = characterBody.modelLocator.modelTransform.GetComponent();
+ if (anim)
+ {
+ anim.SetBool("aimActive", true);
+ }
+ }
+ }
+ }
+
+ if (!rechest)
+ {
+ var characterGravityParameterProvider = gameObject.GetComponent();
+ if (characterGravityParameterProvider != null)
+ {
+ CharacterGravityParameters gravityParameters = characterGravityParameterProvider.gravityParameters;
+ --gravityParameters.channeledAntiGravityGranterCount;
+ characterGravityParameterProvider.gravityParameters = gravityParameters;
+ }
+ }
+
+ var pingc = GetComponent();
+ pingc.isInteractable = false;
+
+ //Set their height to a value more appropriate for moving nicely visually
+ var kinematic = GetComponent();
+ kinematic.SetCapsuleDimensions(0.53f, 3.43f, 1.77f);
+
+ var setstate = GetComponent();
+ if (setstate)
+ {
+ setstate.canBeFrozen = true;
+ setstate.canBeStunned = true;
+ }
+
+
+ if (NetworkServer.active && purchaseInter)
+ {
+ purchaseInter.SetAvailable(false);
+ }
+ }
+
+ public override InterruptPriority GetMinimumInterruptPriority()
+ {
+ return InterruptPriority.PrioritySkill;
+ }
+ }
+}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestInteractableIdle.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestInteractableIdle.cs.meta
new file mode 100644
index 000000000..e834b7ef8
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestInteractableIdle.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 036e14e181aa4a929d1ca6201ca2a399
+timeCreated: 1784714407
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestRechest.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestRechest.cs
new file mode 100644
index 000000000..ddd292f8e
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestRechest.cs
@@ -0,0 +1,107 @@
+using RoR2;
+using RoR2.Hologram;
+using SS2;
+using SS2.Components;
+using System;
+using UnityEngine;
+using UnityEngine.AddressableAssets;
+using UnityEngine.Networking;
+
+namespace EntityStates.MimicEquip
+{
+ public class MimicEquipChestRechest : BaseState
+ {
+ protected PurchaseInteraction purchaseInter;
+
+ protected virtual bool enableInteraction
+ {
+ get
+ {
+ return false;
+ }
+ }
+
+ public static float baseDuration;
+ private float duration;
+
+ public bool taunting = false;
+ public bool tryRechest = true;
+ private MimicEquipInventoryManager mim;
+
+ public override void OnEnter()
+ {
+ base.OnEnter();
+ duration = baseDuration / attackSpeedStat;
+
+ purchaseInter = GetComponent();
+ if (NetworkServer.active && purchaseInter)
+ {
+ purchaseInter.SetAvailable(enableInteraction);
+ }
+
+ PlayAnimation("Gesture, Override", "BufferEmpty");
+ PlayAnimation("FullBody, Override", "BufferEmpty");
+
+ mim = GetComponent();
+ }
+
+ public override void FixedUpdate()
+ {
+ base.FixedUpdate();
+
+ if (mim && mim.rechestPreventionTime > 0 && !taunting){
+ tryRechest = false;
+ if (isAuthority)
+ {
+ skillLocator.utility.RemoveAllStocks();
+ skillLocator.utility.RunRecharge(Mathf.Max(0, skillLocator.special.cooldownRemaining - 3));
+
+ outer.SetNextStateToMain();
+ }
+ }
+
+ if (fixedAge >= duration && tryRechest)
+ {
+ if (isAuthority)
+ {
+ skillLocator.special.cooldownOverride = 1;
+ skillLocator.special.AddOneStock();
+ skillLocator.secondary.RemoveAllStocks();
+
+ var next = new MimicEquipChestInteractableIdle { rechest = true };
+ outer.SetNextState(next);
+ }
+ }
+ }
+
+ public override void OnExit()
+ {
+ base.OnExit();
+ }
+
+ public override InterruptPriority GetMinimumInterruptPriority()
+ {
+ return InterruptPriority.PrioritySkill;
+ }
+
+ public override void OnSerialize(NetworkWriter writer)
+ {
+ base.OnSerialize(writer);
+ writer.Write(taunting);
+ }
+
+ public override void OnDeserialize(NetworkReader reader)
+ {
+ base.OnDeserialize(reader);
+ taunting = reader.ReadBoolean();
+ }
+
+ public override void ModifyNextState(EntityState nextState)
+ {
+ if (nextState is MimicEquipChestInteractableIdle idle)
+ {
+ idle.rechest = true;
+ }
+ }
+ }
+}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestRechest.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestRechest.cs.meta
new file mode 100644
index 000000000..c7e56c80a
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipChestRechest.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 43bd040347a240249dbb94e25d22c10c
+timeCreated: 1784714407
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap.meta
new file mode 100644
index 000000000..9b171d1d2
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 7593f1bc8bc74a3a85ffed40237f22f5
+timeCreated: 1784714407
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapEnter.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapEnter.cs
new file mode 100644
index 000000000..192763ea8
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapEnter.cs
@@ -0,0 +1,63 @@
+using EntityStates;
+using EntityStates.Mimic;
+using RoR2;
+using System.Collections;
+using System.Collections.Generic;
+using RoR2.CharacterAI;
+using SS2;
+using UnityEngine;
+using UnityEngine.Networking;
+
+namespace EntityStates.MimicEquip
+{
+ public class MimicEquipLeapEnter : BaseState
+ {
+ public static float baseDuration;
+ private float duration;
+ private bool endedSuccessfully = false;
+ private BaseAI ai;
+
+ public override void OnEnter()
+ {
+ base.OnEnter();
+ duration = baseDuration / attackSpeedStat;
+
+ PlayCrossfade("FullBody, Override", "LeapEnter", "Leap.playbackRate", duration, 0.05f);
+
+ var animator = GetModelAnimator();
+ animator.SetBool("isGrounded", false);
+
+ characterMotor.walkSpeedPenaltyCoefficient += .6f;
+ characterBody.skillLocator.secondary.AddOneStock(); // dont rteally have a better spot just need it to be added <3 .,
+ }
+
+ public override void FixedUpdate()
+ {
+ base.FixedUpdate();
+
+ if (fixedAge >= duration)
+ {
+ characterMotor.walkSpeedPenaltyCoefficient -= .6f;
+ endedSuccessfully = true;
+ if (isAuthority)
+ {
+ outer.SetNextState(new MimicEquipLeapLoop());
+ }
+ }
+ }
+
+ public override void OnExit()
+ {
+ if (!endedSuccessfully)
+ {
+ PlayAnimation("FullBody, Override", "BufferEmpty");
+ }
+ base.OnExit();
+ }
+
+ public override InterruptPriority GetMinimumInterruptPriority()
+ {
+ return InterruptPriority.PrioritySkill;
+ }
+ }
+}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapEnter.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapEnter.cs.meta
new file mode 100644
index 000000000..25bc4cd40
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapEnter.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: dfa828d07eef486487532dd17ce967ba
+timeCreated: 1784714407
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapExit.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapExit.cs
new file mode 100644
index 000000000..5ee73501d
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapExit.cs
@@ -0,0 +1,44 @@
+using EntityStates;
+using EntityStates.Mimic;
+using RoR2;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace EntityStates.MimicEquip
+{
+ public class MimicEquipLeapExit : BaseState
+ {
+ public static float baseDuration;
+ private float duration;
+
+ public override void OnEnter()
+ {
+ base.OnEnter();
+ duration = baseDuration / attackSpeedStat;
+
+ PlayCrossfade("FullBody, Override", "LeapExit", "Leap.playbackRate", duration, 0.05f);
+ Util.PlaySound("Play_MULT_shift_hit", gameObject);
+ }
+
+ public override void FixedUpdate()
+ {
+ base.FixedUpdate();
+ if (fixedAge >= duration && isAuthority)
+ {
+ characterBody.isSprinting = false;
+ outer.SetNextStateToMain();
+ }
+ }
+
+ public override void OnExit()
+ {
+ base.OnExit();
+ }
+
+ public override InterruptPriority GetMinimumInterruptPriority()
+ {
+ return InterruptPriority.PrioritySkill;
+ }
+ }
+}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapExit.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapExit.cs.meta
new file mode 100644
index 000000000..33785ffdb
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapExit.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 7d3a480163754bfeb90c5d3e8df48777
+timeCreated: 1784714407
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapLoop.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapLoop.cs
new file mode 100644
index 000000000..cffdd8eca
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapLoop.cs
@@ -0,0 +1,183 @@
+using EntityStates;
+using RoR2;
+using SS2;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using UnityEngine.AddressableAssets;
+using UnityEngine.Networking;
+
+namespace EntityStates.MimicEquip
+{
+ public class MimicEquipLeapLoop : BaseCharacterMain
+ {
+
+ public static float minimumDuration;
+ public static float blastRadius;
+
+ public static float blastProcCoefficient;
+ public static float damageCoeff;
+
+ public float blastForce;
+ public Vector3 blastBonusForce;
+ public static float knockbackForce;
+
+ public static string leapSoundString;
+
+ public GameObject blastImpactEffectPrefab;
+ public GameObject blastEffectPrefab;
+
+ public static float airControl;
+
+ public static float aimVelocity;
+ public static float upwardVelocity;
+ public static float forwardVelocity;
+
+ public static float minimumY;
+
+ public static string soundLoopStartEvent;
+ public static string soundLoopStopEvent;
+
+ public static NetworkSoundEventDef landingSound;
+
+ private float previousAirControl;
+ protected bool isCritAuthority;
+ private bool detonateNextFrame;
+
+ private bool endedSuccessfully = false;
+
+ public override void OnEnter()
+ {
+ base.OnEnter();
+ PlayCrossfade("FullBody, Override", "LeapLoop", 0.05f);
+
+ previousAirControl = characterMotor.airControl;
+ characterMotor.airControl = airControl;
+
+ Vector3 direction = GetAimRay().direction;
+ if (isAuthority)
+ {
+ characterBody.isSprinting = true;
+ direction.y = Mathf.Max(direction.y, minimumY);
+ Vector3 a = direction.normalized * aimVelocity * moveSpeedStat/2;
+ Vector3 b = Vector3.up * upwardVelocity;
+ Vector3 b2 = new Vector3(direction.x, 0f, direction.z).normalized * forwardVelocity;
+ characterMotor.Motor.ForceUnground(0.1f);
+ characterMotor.velocity = a + b + b2;
+ isCritAuthority = RollCrit();
+ }
+ if (NetworkServer.active)
+ {
+ characterBody.AddTimedBuff(JunkContent.Buffs.IgnoreFallDamage, 0.25f, 1);
+ }
+ GetModelTransform().GetComponent().enabled = true;
+
+ Util.PlaySound(leapSoundString, gameObject);
+ characterDirection.moveVector = direction;
+
+ if (isAuthority)
+ {
+ characterMotor.onMovementHit += OnMovementHit;
+ }
+
+ Util.PlaySound(soundLoopStartEvent, gameObject);
+
+ var lThruster = FindModelChild("ThrusterL");
+ var rThruster = FindModelChild("ThrusterR");
+
+ if (lThruster)
+ {
+ UnityEngine.Object.Instantiate(SS2.Monsters.MimicEquip.jetVFX, lThruster);
+ }
+
+ if (rThruster)
+ {
+ UnityEngine.Object.Instantiate(SS2.Monsters.MimicEquip.jetVFX, rThruster);
+ }
+ }
+
+ private void OnMovementHit(ref CharacterMotor.MovementHitInfo movementHitInfo)
+ {
+ detonateNextFrame = true;
+ }
+
+ public override void FixedUpdate()
+ {
+ base.FixedUpdate();
+ if (characterMotor)
+ {
+ if (fixedAge >= minimumDuration && (detonateNextFrame || (characterMotor.Motor.GroundingStatus.IsStableOnGround && !characterMotor.Motor.LastGroundingStatus.IsStableOnGround)))
+ {
+ endedSuccessfully = true;
+ if (isAuthority)
+ {
+ characterMotor.moveDirection = inputBank.moveVector;
+ DoImpactAuthority();
+ outer.SetNextState(new MimicEquipLeapExit());
+ }
+ }
+ }
+ }
+
+ protected void DoImpactAuthority()
+ {
+ if (landingSound)
+ {
+ EffectManager.SimpleSoundEffect(landingSound.index, characterBody.footPosition, true);
+ }
+ DetonateAuthority();
+ }
+
+ protected BlastAttack.Result DetonateAuthority()
+ {
+ EffectData effectData = new EffectData
+ {
+ origin = characterBody.corePosition
+ };
+ effectData.SetNetworkedObjectReference(this.gameObject);
+ EffectManager.SpawnEffect(SS2.Monsters.MimicEquip.leapLandVFX, effectData, transmit: true);
+
+ DamageTypeCombo damageTypeCombo = DamageType.Generic;
+ damageTypeCombo.damageSource = DamageSource.Secondary;
+ return new BlastAttack
+ {
+ attacker = gameObject,
+ baseDamage = damageStat * damageCoeff,
+ baseForce = blastForce,
+ bonusForce = blastBonusForce,
+ crit = isCritAuthority,
+ damageType = damageTypeCombo,
+ falloffModel = BlastAttack.FalloffModel.None,
+ procCoefficient = blastProcCoefficient,
+ radius = blastRadius,
+ position = characterBody.corePosition,
+ attackerFiltering = AttackerFiltering.NeverHitSelf,
+ teamIndex = teamComponent.teamIndex
+ }.Fire();
+ }
+
+ public override void OnExit()
+ {
+ Util.PlaySound(soundLoopStopEvent, gameObject);
+ if (isAuthority)
+ {
+ characterMotor.onMovementHit -= OnMovementHit;
+ }
+ characterMotor.airControl = previousAirControl;
+ base.OnExit();
+
+ if (!endedSuccessfully)
+ {
+ PlayAnimation("FullBody, Override", "BufferEmpty");
+ }
+
+ }
+
+ public override InterruptPriority GetMinimumInterruptPriority()
+ {
+ return InterruptPriority.PrioritySkill;
+ }
+
+ }
+}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapLoop.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapLoop.cs.meta
new file mode 100644
index 000000000..e2f99ce9a
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipLeap/MimicEquipLeapLoop.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 835fe4dacf66483089834063c8485b20
+timeCreated: 1784714407
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipUseEquipment.cs b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipUseEquipment.cs
new file mode 100644
index 000000000..edbb8e7a5
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipUseEquipment.cs
@@ -0,0 +1,37 @@
+using RoR2;
+using RoR2.Hologram;
+using SS2;
+using SS2.Components;
+using System;
+using UnityEngine;
+using UnityEngine.AddressableAssets;
+using UnityEngine.Networking;
+
+namespace EntityStates.MimicEquip
+{
+ public class MimicEquipUseEquipment : BaseState
+ {
+ public static float baseDuration;
+ private float duration;
+
+ public override void OnEnter()
+ {
+ base.OnEnter();
+
+ }
+
+ public override void FixedUpdate()
+ {
+ base.FixedUpdate();
+ if (fixedAge >= duration && isAuthority)
+ {
+ outer.SetNextStateToMain();
+ }
+ }
+
+ public override void OnExit()
+ {
+ base.OnExit();
+ }
+ }
+}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipUseEquipment.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipUseEquipment.cs.meta
new file mode 100644
index 000000000..12abf522b
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/EntityStates/MimicEquip/MimicEquipUseEquipment.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 5c8ea855387a4e778f2cd0a4bd1c240c
+timeCreated: 1785328345
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/Interactables/InteractableTypes/MimicEquipInteractable.cs b/SS2-Project/Assets/Starstorm2/Modules/Interactables/InteractableTypes/MimicEquipInteractable.cs
new file mode 100644
index 000000000..3034b2401
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/Interactables/InteractableTypes/MimicEquipInteractable.cs
@@ -0,0 +1,21 @@
+using RoR2;
+using UnityEngine;
+using RoR2.ContentManagement;
+
+namespace SS2.Interactables
+{
+ public sealed class MimicEquipInteractable : SS2Interactable
+ {
+ public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acMimicEquipInteractable", SS2Bundle.Indev);
+
+ public override void Initialize()
+ {
+
+ }
+
+ public override bool IsAvailable(ContentPack contentPack)
+ {
+ return true;
+ }
+ }
+}
diff --git a/SS2-Project/Assets/Starstorm2/Modules/Interactables/InteractableTypes/MimicEquipInteractable.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/Interactables/InteractableTypes/MimicEquipInteractable.cs.meta
new file mode 100644
index 000000000..a51ecbff0
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/Interactables/InteractableTypes/MimicEquipInteractable.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 61840f2d66ff48af87b61cf7fd4d0bc5
+timeCreated: 1784713567
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Boss/ScavengersFortune.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Boss/ScavengersFortune.cs
index 57bb15adc..fefa66380 100644
--- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Boss/ScavengersFortune.cs
+++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Boss/ScavengersFortune.cs
@@ -67,7 +67,7 @@ public sealed class Behavior : BaseItemBodyBehavior
public void FixedUpdate()
{
- int currentMoney = (int)body.master.money;
+ int currentMoney = body.master ? (int)body.master.money : 0; // spams nre on corpses ,.,.
int moneyMade = (currentMoney - updateMoney);
if (currentMoney > updateMoney)
{
diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Hidden/BirthrightChimeraHelper.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Hidden/BirthrightChimeraHelper.cs
new file mode 100644
index 000000000..4c761950d
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Hidden/BirthrightChimeraHelper.cs
@@ -0,0 +1,35 @@
+using RoR2;
+using RoR2.ContentManagement;
+using UnityEngine;
+
+namespace SS2.Items
+{
+ public sealed class BirthrightChimeraHelper : SS2Item
+ {
+ public override SS2AssetRequest AssetRequest => SS2Assets.LoadAssetAsync("acBirthrightChimeraHelper", SS2Bundle.Items);
+
+ public override void Initialize()
+ {
+ On.RoR2.UI.HealthBar.UpdateBarInfos += HealthBarOnUpdateBarInfos;
+ }
+
+ private void HealthBarOnUpdateBarInfos(On.RoR2.UI.HealthBar.orig_UpdateBarInfos orig, RoR2.UI.HealthBar self)
+ {
+ //stolen from neb neb ,..,
+ orig(self);
+
+ HealthComponent healthComponent = self._source;
+ if (!healthComponent) return;
+
+ if (healthComponent.body?.inventory?.GetItemCountEffective(ItemDef) > 0)
+ {
+ self.barInfoCollection.trailingOverHealthbarInfo.color = new Color32(100, 200, 255, 255);
+ }
+ }
+
+ public override bool IsAvailable(ContentPack contentPack)
+ {
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Hidden/BirthrightChimeraHelper.cs.meta b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Hidden/BirthrightChimeraHelper.cs.meta
new file mode 100644
index 000000000..45fafb440
--- /dev/null
+++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Hidden/BirthrightChimeraHelper.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 3a19acdebf024dbabebf6e911613543e
+timeCreated: 1782514786
\ No newline at end of file
diff --git a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Lunar/PrimalBirthright.cs b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Lunar/PrimalBirthright.cs
index 7478ed024..6785ad9e5 100644
--- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Lunar/PrimalBirthright.cs
+++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Lunar/PrimalBirthright.cs
@@ -1,18 +1,16 @@
-using EntityStates;
+using EntityStates;
using MSU;
using MSU.Config;
using R2API;
using RoR2;
-using RoR2.ContentManagement;
using RoR2.Items;
using RoR2.UI;
using System;
-using System.Collections;
using System.Collections.Generic;
+using Starstorm2.Components;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
-using static SS2.Items.FieldAccelerator;
namespace SS2.Items
{
@@ -27,23 +25,50 @@ public sealed class PrimalBirthright : SS2Item
[RiskOfOptionsConfigureField(SS2Config.ID_ITEM, configDescOverride = "Amount of legendary chests each additional stack grants per stage.")]
[FormatToken("SS2_ITEM_PRIMAL_BIRTHRIGHT_DESC", 1)]
public static float legendaryCountStacking = 1f;
-
+
+ [RiskOfOptionsConfigureField(SS2Config.ID_ITEM, configDescOverride = "How quickly you must claim your birthright (base).")]
+ [FormatToken("SS2_ITEM_PRIMAL_BIRTHRIGHT_DESC", 2)]
+ public static float birthrightCompletionTime = 200f;
+
+ [RiskOfOptionsConfigureField(SS2Config.ID_ITEM, configDescOverride = "How quickly you must claim your birthright (stacking).")]
+ [FormatToken("SS2_ITEM_PRIMAL_BIRTHRIGHT_DESC", 3)]
+ public static float birthrightCompletionTimeStacking = 125f;
+
[RiskOfOptionsConfigureField(SS2Config.ID_ITEM, configDescOverride = "Amount the price of the Legendary chest is multiplied by. (1 = 100%, normal value for current level)")]
- [FormatToken("SS2_ITEM_RELICOFMASS_DESC", FormatTokenAttribute.OperationTypeEnum.MultiplyByN, 100, 2)]
- public static float priceModifier = 2.1f;
+ public static float birthrightPriceModifier = 1.3f;
+ [RiskOfOptionsConfigureField(SS2Config.ID_ITEM, configDescOverride = "Required stage count for Lunar Wisps to start replacing Lunar Golems upon failing to claim your birthright.")]
+ public static float lunarWispStageCount = 3f;
+
+ [RiskOfOptionsConfigureField(SS2Config.ID_ITEM, configDescOverride = "Chance for Lunar Wisps to replace Lunar Golems upon failing to claim your birthright.")]
+ public static float lunarWispChance = 20f;
+
+ [RiskOfOptionsConfigureField(SS2Config.ID_ITEM, configDescOverride = "Chance for perfected enemies to replace regular enemy spawns upon failing to claim your birthright.")]
+ public static float perfectedReplacementChance = 15f;
+
+ [RiskOfOptionsConfigureField(SS2Config.ID_ITEM, configDescOverride = "Wait time between waves of Lunar Chimeras upon failing to claim your birthright.")]
+ public static float chimeraWaitTime = 30f;
+
+ [RiskOfOptionsConfigureField(SS2Config.ID_ITEM, configDescOverride = "Wait time variance between waves of Lunar Chimeras upon failing to claim your birthright. (Minimum wait time will be base wait time - variance)")]
+ public static float chimeraWaitTimeVariance = 5f;
+
+ [RiskOfOptionsConfigureField(SS2Config.ID_ITEM, configDescOverride = "Whether Lunar Chimeras should use Lunar team. (causes enemy infighting (silly))")]
+ public static bool useLunarTeam = false;
+
public GameObject indevChest; // this probably not be here in a live build i just wanted to do it fast
public InteractableSpawnCard indevCard;
public static PrimalPrevention? primalToken;
public Xoroshiro128Plus birthrightRng;
-
+ public static DamageColorIndex primalStormDamageColor;
+ public static GameObject stormPrefab;
+
public override void Initialize()
{
On.RoR2.TeleporterInteraction.IdleState.OnInteractionBegin += TeleporterInteractionPrimalOverride;
On.RoR2.SceneDirector.PopulateScene += PopulateSceneAddPrimalChest;
On.RoR2.PurchaseInteraction.GetDisplayName += GetDisplayNameAlterPrimalName;
- //On.RoR2.SceneDirector.OnServerTeleporterPlaced += OnTeleporterPlacedAddPrimalToken;
- //ObjectivePanelController.collectObjectiveSources -= this.OnCollectObjectiveSources;
+ On.RoR2.CombatDirector.Spawn += CombatDirectorOnSpawnPerfected;
+ On.RoR2.TeleporterInteraction.Awake += TeleporterInteractionAwakeAddPrimalPrevention;
var tempChest = Addressables.LoadAssetAsync("RoR2/Base/GoldChest/GoldChest.prefab").WaitForCompletion();
indevChest = PrefabAPI.InstantiateClone(tempChest, "PrimalChest");
@@ -56,11 +81,7 @@ public override void Initialize()
pinter.contextToken = "SS2_BIRTHRIGHT_CHEST_CONTEXT";
}
-
- var token = indevChest.AddComponent();
- //token.enabled = false;
-
- //token.RpcSetToken(false); //unsure if needed
+ indevChest.AddComponent();
pinter.onPurchase.AddListener(delegate (Interactor interactor)
{
@@ -76,18 +97,9 @@ public override void Initialize()
{
SS2Log.Error("Unable to apply Primal Chest material. Unexpected hierarchy: " + e);
}
-
- //indevChest.AddComponent();
- //indevChest.AddComponent();
PrefabAPI.RegisterNetworkPrefab(indevChest);
- //var assets = AssetCollection.assets;
- //UnityEngine.Object[] assets2 = new UnityEngine.Object[assets.Length + 1];
- //assets.CopyTo(assets2, 0);
- //assets2[assets2.Length - 1] = indevChest;
- //AssetCollection.assets = assets2;
-
UnityEngine.Object[] assets2 = new UnityEngine.Object[1];
assets2[0] = indevChest;
AssetCollection.AddAssets(assets2);
@@ -107,12 +119,28 @@ public override void Initialize()
indevCard.orientToFloor = true;
indevCard.skipSpawnWhenSacrificeArtifactEnabled = false;
indevCard.maxSpawnsPerStage = -1;
+
+ //storm stuff .,. ,
+ primalStormDamageColor = ColorsAPI.RegisterDamageColor(new Color32(200, 200, 255, 255));
+ stormPrefab = AssetCollection.FindAsset("PrimalMeteorStorm");
+ }
- // TODO: A util method for adding components to all the teleporters in the game so it remains future proof + mod compat
- Addressables.LoadAssetAsync("RoR2/Base/Teleporters/Teleporter1.prefab").Completed += (r) => r.Result.AddComponent();
- Addressables.LoadAssetAsync("RoR2/Base/Teleporters/LunarTeleporter Variant.prefab").Completed += (r) => r.Result.AddComponent();
- Addressables.LoadAssetAsync("RoR2/DLC3/conduitcanyon/Teleporter_ConduitCanyon_Variant.prefab").Completed += (r) => r.Result.AddComponent();
+ private void TeleporterInteractionAwakeAddPrimalPrevention(On.RoR2.TeleporterInteraction.orig_Awake orig, TeleporterInteraction self)
+ {
+ //seriouslyt why were we doing the prefab stuff before this works fine TT ,.,.
+ orig(self);
+ self.gameObject.AddComponent();
+ }
+
+ private bool CombatDirectorOnSpawnPerfected(On.RoR2.CombatDirector.orig_Spawn orig, CombatDirector self, SpawnCard spawncard, EliteDef elitedef, Transform spawntarget, DirectorCore.MonsterSpawnDistance spawndistance, bool preventoverhead, float valuemultiplier, DirectorPlacementRule.PlacementMode placementmode, bool singlescaledboss)
+ {
+ if (NetworkServer.active && BirthrightObjectiveTimer.instance?.spawnedMeteors == true && !elitedef && Run.instance.spawnRng.RangeFloat(0, 100) <= perfectedReplacementChance && spawncard.prefab.GetComponent()?.bodyPrefab?.GetComponent()?.isChampion != true)
+ {
+ elitedef = RoR2Content.Elites.Lunar;
+ SS2Log.Debug($"set {spawncard.prefab.name} to be perfected ,.., ,.");
+ }
+ return orig(self, spawncard, elitedef, spawntarget, spawndistance, preventoverhead, valuemultiplier, placementmode, singlescaledboss);
}
private string GetDisplayNameAlterPrimalName(On.RoR2.PurchaseInteraction.orig_GetDisplayName orig, PurchaseInteraction self)
@@ -122,12 +150,10 @@ private string GetDisplayNameAlterPrimalName(On.RoR2.PurchaseInteraction.orig_Ge
{
var intermediate = Language.GetString(self.displayNameToken);
- if (pbot.master)
+ if (pbot.playerName != "")
{
- return intermediate.Replace("{0}", Util.GetBestMasterName(pbot.master));
+ return intermediate.Replace("{0}", pbot.playerName);
}
- //intermediate.Replace("{0}", pbot.masterObject.GetComponent().GetBody().GetDisplayName())
-
}
return orig(self);
}
@@ -142,18 +168,6 @@ private void OnPurchaseBirthrightChest(Interactor interactor, PurchaseInteractio
}
}
- public static void OnCollectObjectiveSources(CharacterMaster master, List objectiveSourcesList)
- {
- var newObjective = new ObjectivePanelController.ObjectiveSourceDescriptor
- {
- master = master,
- objectiveType = typeof(PrimalBirthrightObjectiveTracker),
- source = primalToken
- };
-
- objectiveSourcesList.Add(newObjective);
- }
-
private void TeleporterInteractionPrimalOverride(On.RoR2.TeleporterInteraction.IdleState.orig_OnInteractionBegin orig, BaseState self, Interactor activator)
{
self.outer.gameObject.TryGetComponent(out var tc);
@@ -167,60 +181,56 @@ private void TeleporterInteractionPrimalOverride(On.RoR2.TeleporterInteraction.I
birthrightRng = new Xoroshiro128Plus(Run.instance.seed);
}
- foreach (var pinter in listcopy)
+ foreach (PurchaseInteraction pinter in listcopy)
{
- if (pinter)
+ if (!pinter) continue;
+
+ var pbot = pinter.GetComponent();
+ if (!pbot) continue;
+
+ if (birthrightRng.RangeFloat(0, 1) >= .975f)
{
- var pbot = pinter.GetComponent();
- if (pbot)
+ Chat.SendBroadcastChat(new Chat.SimpleChatMessage
{
- if (birthrightRng.RangeFloat(0, 1) >= .975f)
+ baseToken = "SS2_BIRTHRIGHT_UNCLAIMED_RARE"
+ });
+ }
+ else
+ {
+ var body = pbot.master.GetBody();
+ if (body)
+ {
+ if (body.GetItemCount(SS2Content.Items.PrimalBirthright) <= 0)
{
- Chat.SendBroadcastChat(new Chat.SimpleChatMessage
+ Chat.SendBroadcastChat(new Chat.SubjectFormatChatMessage
{
- baseToken = "SS2_BIRTHRIGHT_UNCLAIMED_RARE"
+ subjectAsCharacterBody = pbot.master.GetBody(),
+ baseToken = "SS2_BIRTHRIGHT_UNCLAIMED_REMOVED"
});
}
else
{
- var body = pbot.master.GetBody();
- if (body)
+ Chat.SendBroadcastChat(new Chat.SubjectFormatChatMessage
{
- if (body.GetItemCount(SS2Content.Items.PrimalBirthright) <= 0)
- {
- Chat.SendBroadcastChat(new Chat.SubjectFormatChatMessage
- {
- subjectAsCharacterBody = pbot.master.GetBody(),
- baseToken = "SS2_BIRTHRIGHT_UNCLAIMED_REMOVED"
- });
- }
- else
- {
- Chat.SendBroadcastChat(new Chat.SubjectFormatChatMessage
- {
- subjectAsCharacterBody = pbot.master.GetBody(),
- baseToken = "SS2_BIRTHRIGHT_UNCLAIMED"
- });
- }
- }
- else
- {
- Chat.SendBroadcastChat(new Chat.SimpleChatMessage
- {
- baseToken = "SS2_BIRTHRIGHT_UNCLAIMED_DEAD"
- });
- }
+ subjectAsCharacterBody = pbot.master.GetBody(),
+ baseToken = "SS2_BIRTHRIGHT_UNCLAIMED"
+ });
}
- return;
+ }
+ else
+ {
+ Chat.SendBroadcastChat(new Chat.SimpleChatMessage
+ {
+ baseToken = "SS2_BIRTHRIGHT_UNCLAIMED_DEAD"
+ });
}
}
+
+ return;
}
- orig(self, activator);
- }
- else
- {
- orig(self, activator);
}
+
+ orig(self, activator);
}
private void PopulateSceneAddPrimalChest(On.RoR2.SceneDirector.orig_PopulateScene orig, SceneDirector self)
@@ -247,37 +257,47 @@ private void PopulateSceneAddPrimalChest(On.RoR2.SceneDirector.orig_PopulateScen
foreach (var player in PlayerCharacterMasterController.instances)
{
//SS2Log.Info("Found a player with item");
- int itemCount = player.master.inventory.GetItemCount(SS2Content.Items.PrimalBirthright);
+ int itemCount = player.master.inventory.GetItemCountEffective(SS2Content.Items.PrimalBirthright);
for (int i = 0; i < itemCount; ++i)
{
var chest = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(indevCard, new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Random }, birthrightRng));
//SS2Log.Warning("Chest : " + chest + " | " + chest.name);
var pinter = chest.GetComponent();
var behav = chest.GetComponent();
- if (pinter && behav)
- {
- //primalToken.purchaseInteractions.Add((pinter, player.master));
- pinter.Networkcost = (int)(Run.instance.GetDifficultyScaledCost(pinter.cost) * priceModifier);
-
- pinter.onPurchase.AddListener(delegate (Interactor interactor)
- {
- this.OnPurchaseBirthrightChest(interactor, pinter);
- });
-
- var objtoken = chest.GetComponent();
- objtoken.masterObject = player.master.gameObject;
- objtoken.master = player.master;
-
- //objtoken.playername = Util.GetBestMasterName(player.master);
+ if (!pinter || !behav) continue;
+
+ pinter.Networkcost = (int)(Run.instance.GetDifficultyScaledCost(pinter.cost) * birthrightPriceModifier);
- //pinter.GetDisplayName
+ pinter.onPurchase.AddListener(delegate (Interactor interactor)
+ {
+ this.OnPurchaseBirthrightChest(interactor, pinter);
+ });
- }
+ var objtoken = chest.GetComponent();
+ objtoken.master = player.master;
+ objtoken.playerName = player.networkUser.userName;
}
}
}
}
+
+ public class Behavior : BaseItemBodyBehavior
+ {
+ [ItemDefAssociation(useOnServer = true, useOnClient = false)]
+ private static ItemDef GetItemDef() => SS2Content.Items.PrimalBirthright;
+
+ private static GameObject stormObject;
+ private void OnEnable()
+ {
+ // !BirthrightObjectiveTimer.instance would probably work here too but im worried if 2 players have it and instance is set too late or something and it spawns 2 and oough ,.,.
+ if (!stormObject)
+ {
+ stormObject = Instantiate(stormPrefab);
+ NetworkServer.Spawn(stormObject);
+ }
+ }
+ }
}
public class PrimalPrevention : MonoBehaviour
@@ -287,24 +307,21 @@ public class PrimalPrevention : MonoBehaviour
}
- public class PrimalBirthrightObjectiveToken : NetworkBehaviour {
+ public class PrimalBirthrightObjectiveToken : NetworkBehaviour
+ {
+ private float oobTimer;
+ private bool dontTryRemove;
public static List instanceList = new List();
public PurchaseInteraction pinter;
-
- [SyncVar(hook = "SetMaster")]
- public GameObject masterObject;
-
public CharacterMaster master;
+
+ [SyncVar]
+ public string playerName;
public void OnEnable()
{
pinter = this.gameObject.GetComponent();
instanceList.Add(pinter);
-
- if (instanceList.Count == 1)
- {
- ObjectivePanelController.collectObjectiveSources += PrimalBirthright.OnCollectObjectiveSources;
- }
}
public void OnDisable()
@@ -313,7 +330,10 @@ public void OnDisable()
if (instanceList.Count <= 0)
{
- ObjectivePanelController.collectObjectiveSources -= PrimalBirthright.OnCollectObjectiveSources;
+ if (!dontTryRemove)
+ {
+ BirthrightObjectiveTimer.instance?.TryRemoveObjective();
+ }
if (PrimalBirthright.primalToken)
{
@@ -322,32 +342,39 @@ public void OnDisable()
}
}
- [ClientRpc]
- public void RpcSetToken(bool enable)
+ public void FixedUpdate()
{
- this.enabled = enable;
- }
-
- public void SetMaster(GameObject masterObj)
- {
- master = masterObj.GetComponent();
- }
-
- }
+ oobTimer += Time.deltaTime;
+ if (oobTimer > 15)
+ {
+ oobTimer = 0;
- public class PrimalBirthrightObjectiveTracker : ObjectivePanelController.ObjectiveTracker
- {
- public override string GenerateString()
- {
- return string.Format(Language.GetString("SS2_BIRTHRIGHT_OBJECTIVE"), PrimalBirthrightObjectiveToken.instanceList.Count);
+ if (!Util.IsPositionWithinMapBounds(gameObject.transform.position))
+ {
+ if (instanceList.Count == 1)
+ {
+ //if youre drifter and throw the last birthright off the map be evil and spawn meteors. ,.,
+ BirthrightObjectiveTimer.instance.timer = 0;
+ dontTryRemove = true;
+ }
+
+ if (NetworkServer.active)
+ {
+ Chat.SendBroadcastChat(new Chat.SimpleChatMessage
+ {
+ baseToken = "SS2_BIRTHRIGHT_UNCLAIMED_RARE"
+ });
+ }
+
+ Destroy(gameObject);
+ }
+ }
}
-
- public override bool IsDirty()
+
+ [ClientRpc]
+ public void RpcSetToken(bool enable)
{
- return true;
+ enabled = enable;
}
}
-
-}
-
-
+}
\ No newline at end of file
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..dd225ba0b 100644
--- a/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/FieldAccelerator.cs
+++ b/SS2-Project/Assets/Starstorm2/Modules/Pickups/Items/Tier2/FieldAccelerator.cs
@@ -32,14 +32,14 @@ public override void Initialize()
{
//???
_objectPrefab = AssetCollection.FindAsset("ObjectFieldAccelerator"); //
+
+ On.RoR2.TeleporterInteraction.Awake += TeleporterInteractionAwakeAddFieldAcceleratorTeleporter;
+ }
- // TODO Switch to a more generic solution
- // Per Chinchi's advice "the more generic solution would be to hook TeleporterInteraction.Awake and add the component dynamically"
-
- // TODO: A util method for adding components to all the teleporters in the game so it remains future proof + mod compat
- Addressables.LoadAssetAsync("RoR2/Base/Teleporters/Teleporter1.prefab").Completed+= (r) => r.Result.AddComponent();
- Addressables.LoadAssetAsync("RoR2/Base/Teleporters/LunarTeleporter Variant.prefab").Completed += (r) => r.Result.AddComponent();
- Addressables.LoadAssetAsync("RoR2/DLC3/conduitcanyon/Teleporter_ConduitCanyon_Variant.prefab").Completed += (r) => r.Result.AddComponent();
+ private void TeleporterInteractionAwakeAddFieldAcceleratorTeleporter(On.RoR2.TeleporterInteraction.orig_Awake orig, TeleporterInteraction self)
+ {
+ orig(self);
+ self.gameObject.AddComponent();
}
public sealed class Behavior : BaseItemBodyBehavior, IOnKilledOtherServerReceiver
diff --git a/SS2-Project/Assets/Starstorm2/SS2-Manifest.asset b/SS2-Project/Assets/Starstorm2/SS2-Manifest.asset
index 2053a6114..c0782f950 100644
--- a/SS2-Project/Assets/Starstorm2/SS2-Manifest.asset
+++ b/SS2-Project/Assets/Starstorm2/SS2-Manifest.asset
@@ -133,6 +133,7 @@ MonoBehaviour:
- {fileID: 2800000, guid: eb3a70227647f7045b1310400a551084, type: 3}
- {fileID: 2800000, guid: ab18fbb30379631499164b1b499a3b9a, type: 3}
- {fileID: 2800000, guid: 1973417585079444ea976f56d0d6ddd5, type: 3}
+ - {fileID: 2800000, guid: c105f5995486de54886ee98971a0f175, type: 3}
- {fileID: 2800000, guid: 0c1e0b0817d88de4397951d01139ce78, type: 3}
- assetBundleName: SS2Base
assets:
diff --git a/SS2-Project/Assets/Starstorm2/SS2Config.cs b/SS2-Project/Assets/Starstorm2/SS2Config.cs
index 3076d0b07..5a1ac194b 100644
--- a/SS2-Project/Assets/Starstorm2/SS2Config.cs
+++ b/SS2-Project/Assets/Starstorm2/SS2Config.cs
@@ -57,21 +57,21 @@ internal static IEnumerator RegisterToModSettingsManager()
{
SS2AssetRequest spriteRequest = SS2Assets.LoadAssetAsync("icon", SS2Bundle.Main);
spriteRequest.StartLoad();
-
+
while (!spriteRequest.IsComplete)
yield return null;
+
Sprite icon = spriteRequest.Asset;
- ModSettingsManager.SetModIcon(icon, SS2Main.GUID, SS2Main.MODNAME);
ModSettingsManager.SetModIcon(icon, GUID(ID_MAIN), MODNAME(ID_MAIN));
ModSettingsManager.SetModIcon(icon, GUID(ID_ITEM), MODNAME(ID_ITEM));
ModSettingsManager.SetModIcon(icon, GUID(ID_SURVIVOR), MODNAME(ID_SURVIVOR));
+ ModSettingsManager.SetModIcon(icon, GUID(ID_MONSTER), MODNAME(ID_MONSTER));
ModSettingsManager.SetModIcon(icon, GUID(ID_EVENT), MODNAME(ID_EVENT));
- ModSettingsManager.SetModIcon(icon, GUID(ID_INTERACTABLE), MODNAME(ID_INTERACTABLE));
+ //ModSettingsManager.SetModIcon(icon, GUID(ID_INTERACTABLE), MODNAME(ID_INTERACTABLE));
ModSettingsManager.SetModIcon(icon, GUID(ID_ARTIFACT), MODNAME(ID_ARTIFACT));
ModSettingsManager.SetModIcon(icon, GUID(ID_MISC), MODNAME(ID_MISC));
ModSettingsManager.SetModIcon(icon, GUID(ID_BETA), MODNAME(ID_BETA));
ModSettingsManager.SetModIcon(icon, GUID(ID_ACCESSIBILITY), MODNAME(ID_ACCESSIBILITY));
- ModSettingsManager.SetModDescription("A general content mod adapting ideas from Risk of Rain 1's Starstorm", SS2Main.GUID, SS2Main.MODNAME);
}
diff --git a/SS2-Project/Assets/Starstorm2/SS2Content.cs b/SS2-Project/Assets/Starstorm2/SS2Content.cs
index e33331998..0ea72e253 100644
--- a/SS2-Project/Assets/Starstorm2/SS2Content.cs
+++ b/SS2-Project/Assets/Starstorm2/SS2Content.cs
@@ -1,4 +1,4 @@
-using RoR2.ExpansionManagement;
+using RoR2.ExpansionManagement;
using RoR2.ContentManagement;
using System;
using System.Collections;
@@ -187,6 +187,7 @@ static SS2Content()
return VanillaSurvivorModule.InitializeVanillaSurvivorContentPieces(main);
},
LoadFromAssetBundles,
+ SS2Config.RegisterToModSettingsManager
};
_fieldAssignDispatchers = new Func[]
@@ -441,6 +442,7 @@ public static class Items
public static ItemDef StackShieldGate;
public static ItemDef StackHitList;
public static ItemDef PrimalBirthright;
+ public static ItemDef BirthrightChimeraHelper;
public static ItemDef GalvanicCore;
diff --git a/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/SS2-Manifest-Quick.asset b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/SS2-Manifest-Quick.asset
new file mode 100644
index 000000000..835c5f046
--- /dev/null
+++ b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/SS2-Manifest-Quick.asset
@@ -0,0 +1,250 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-5363697519406383111
+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: 4b243ff405b33b94dbf5b6775dd9aa33, type: 3}
+ m_Name: Files
+ m_EditorClassIdentifier:
+ StagingPaths:
+ -
+ includeMetaFiles: 0
+ files:
+ - {fileID: 102900000, guid: bbd0875c0bbb03148a553bc8fea17d0d, type: 3}
+ - {fileID: 102900000, guid: b7eb73f1ecff00647b0e0ae192a986c4, type: 3}
+ - {fileID: 102900000, guid: b82e197e17cc20748a70452cacaa335d, type: 3}
+ - {fileID: 102900000, guid: 0cf295501f061764a80471fbaffb33c9, type: 3}
+ - {fileID: 102900000, guid: 665528024a7f3bc4f9ae3ee15f3bfa4f, type: 3}
+ - {fileID: 102900000, guid: ec0f82fea01468e4589abccf5e2aab79, type: 3}
+ - {fileID: 102900000, guid: 3d0d05e2ada7d6c469cbc13517dd8030, type: 3}
+--- !u!114 &-4467616490986340797
+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: 4b243ff405b33b94dbf5b6775dd9aa33, type: 3}
+ m_Name: Files
+ m_EditorClassIdentifier:
+ StagingPaths:
+ -
+ includeMetaFiles: 0
+ files:
+ - {fileID: 4900000, guid: 727b33b9961d7bf448495841a9f95e9c, type: 3}
+ - {fileID: 4900000, guid: c1d0a03d082afa8489c22f31b287706d, type: 3}
+ - {fileID: 4900000, guid: 4e8e9182b5bd7fd49bd1806816866239, type: 3}
+ - {fileID: 2800000, guid: c105f5995486de54886ee98971a0f175, type: 3}
+--- !u!114 &-3892906877110538616
+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: e563561e08b6a3642a487177f5cfbb37, type: 3}
+ m_Name: SS2-Manifest-Quick
+ m_EditorClassIdentifier:
+ Data:
+ - {fileID: 114211852988908172}
+ - {fileID: -648994308371041655}
+ - {fileID: 114431642618062350}
+ - {fileID: 114987763159783732}
+ - {fileID: -5363697519406383111}
+ - {fileID: 8324102109481770816}
+ - {fileID: -4467616490986340797}
+ - {fileID: 4961625933286759612}
+ identity: {fileID: 114211852988908172}
+ QuickAccess: 1
+--- !u!114 &-648994308371041655
+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: 2b7e13dda513544419a89926bd12ad8a, type: 3}
+ m_Name: AssemblyDefinitions
+ m_EditorClassIdentifier:
+ StagingPaths:
+ -
+ definitions:
+ - {fileID: 5897886265953266890, guid: f054131d8b8c38f49bfb7567178d0531, type: 3}
+--- !u!114 &114211852988908172
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ 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: f22bb7fd1d3b56a48bc52f8e407901d6, type: 3}
+ m_Name: ManifestIdentity
+ m_EditorClassIdentifier:
+ StagingPaths:
+ -
+ Author: TeamMoonstorm
+ Name: Starstorm2
+ Description: A sequel to Starstorm 1. Adds new survivors, mechanics, items, skills,
+ enemies, and more!
+ Version: 0.6.38
+ Dependencies: []
+--- !u!114 &114431642618062350
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ 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: 17d1008b78cb6e846889b7778282fbef, type: 3}
+ m_Name: AssetBundleDefinitions
+ m_EditorClassIdentifier:
+ StagingPaths:
+ -
+ assetBundles:
+ - assetBundleName: SS2LoadingScreenSprites
+ assets:
+ - {fileID: 102900000, guid: 54c2086f9c6a73f41916eb6971d21e8f, type: 3}
+ - assetBundleName: SS2Main
+ assets:
+ - {fileID: 11400000, guid: 59a1ba2efde60ad44a82ed4c314d08ba, type: 2}
+ - {fileID: 2800000, guid: eb3a70227647f7045b1310400a551084, type: 3}
+ - {fileID: 2800000, guid: ab18fbb30379631499164b1b499a3b9a, type: 3}
+ - {fileID: 2800000, guid: 1973417585079444ea976f56d0d6ddd5, type: 3}
+ - {fileID: 2800000, guid: c105f5995486de54886ee98971a0f175, type: 3}
+ - assetBundleName: SS2Base
+ assets:
+ - {fileID: 102900000, guid: 90b5ce85b0fd1454a8828bd58f78fadc, type: 3}
+ - {fileID: 102900000, guid: bf6e7a26ee4dd474d8a1e82dcde8bd24, type: 3}
+ - {fileID: 102900000, guid: 501542b4bcf431240b0346bdaa9917d9, type: 3}
+ - {fileID: 102900000, guid: 3aa584817df1c0b4ab71cb90742e4cbd, type: 3}
+ - {fileID: 102900000, guid: 3315791aad1fb6f4d88e06c582dd287e, type: 3}
+ - {fileID: 102900000, guid: 7744affa0b6848944a9814b4e637b9b3, type: 3}
+ - {fileID: 102900000, guid: c9fe5ab2b5efee544a0d4ce799dabf63, type: 3}
+ - {fileID: 102900000, guid: a05a59be7ddf0f9499b10f40fd75de8b, type: 3}
+ - assetBundleName: SS2Artifacts
+ assets:
+ - {fileID: 102900000, guid: 3a0ad87d866aef74dba7a41400574ae2, type: 3}
+ - assetBundleName: SS2Chirr
+ assets:
+ - {fileID: 102900000, guid: 0fa3260ca25541642a3fceff33e143e2, type: 3}
+ - assetBundleName: SS2Equipments
+ assets:
+ - {fileID: 102900000, guid: 54c50cc18d9504f47b057c63be6e441e, type: 3}
+ - {fileID: 102900000, guid: 813c50a9d97ae1d4fabdc2a7828bdc86, type: 3}
+ - assetBundleName: SS2Items
+ assets:
+ - {fileID: 102900000, guid: 11b0ea49617bade468afe6088793a9cc, type: 3}
+ - assetBundleName: SS2Events
+ assets:
+ - {fileID: 102900000, guid: 1b7496dcbe7d1ad45a0938f99547c81a, type: 3}
+ - assetBundleName: SS2Vanilla
+ assets:
+ - {fileID: 102900000, guid: 55f7dd6be561cc14cafa245d9a2085fb, type: 3}
+ - assetBundleName: SS2Dev
+ assets:
+ - {fileID: 102900000, guid: 117bdc60d32a3cc4d847c477c2b26d45, type: 3}
+ - assetBundleName: SS2Shared
+ assets:
+ - {fileID: 102900000, guid: 6aaeac829803fd14f9ee898e61c14d8b, type: 3}
+ - {fileID: 2800000, guid: 5f51e0b22aa8cb84b9f422576ce87ff9, type: 3}
+ - {fileID: 2800000, guid: a7ec9e7ad8b847b7ae4510af83c5d868, type: 3}
+ - {fileID: 2800000, guid: ee148e281f3c41c5b4ff5f8a5afe5a6c, type: 3}
+ - {fileID: 2800000, guid: 3ee40aa79cd242a5b53b0b0ca4f13f0f, type: 3}
+ - {fileID: 2800000, guid: ec7c645d93308c04d8840982af12101e, type: 3}
+ - {fileID: 2800000, guid: 2fd6421f253b4ef1a19526541f9ffc0c, type: 3}
+ - {fileID: 102900000, guid: f54d1bd14bd3ca042bd867b519fee8cc, type: 3}
+ - {fileID: 4800000, guid: 68e6db2ebdc24f95958faec2be5558d6, type: 3}
+ - assetBundleName: SS2Stages
+ assets:
+ - {fileID: 102900000, guid: 23115ec71d347cc42b6620dde9eee00a, type: 3}
+ - assetBundleName: SS2NemCommando
+ assets:
+ - {fileID: 102900000, guid: 2da2c3ce805f34048a21940bffd6e167, type: 3}
+ - assetBundleName: SS2Executioner2
+ assets:
+ - {fileID: 102900000, guid: fdeae74d19fd5cc488d40d33ab8e465b, type: 3}
+ - assetBundleName: SS2NemMercenary
+ assets:
+ - {fileID: 102900000, guid: 779df424582ae894b9c16c18aaae0724, type: 3}
+ - assetBundleName: SS2NemExecutioner
+ assets:
+ - {fileID: 102900000, guid: 659b168f2fadf394cb781856560b5bc8, type: 3}
+ - assetBundleName: SS2Interactables
+ assets:
+ - {fileID: 102900000, guid: 8faaf5ddcf664be4dbaea5c2309102ad, type: 3}
+ - {fileID: 102900000, guid: e5ba1e2b33b91e040a86ed11c7bd4c2d, type: 3}
+ - assetBundleName: SS2Monsters
+ assets:
+ - {fileID: 102900000, guid: 4a187108b3b0e564fad1428006ddf183, type: 3}
+ - assetBundleName: SS2VoidShop
+ assets:
+ - {fileID: 102900000, guid: ebb9a80b520af6343a87fd4fbbd88f61, type: 3}
+ - assetBundleName: SS2SlateMines
+ assets:
+ - {fileID: 102900000, guid: 9741cf5ed297e7d4fb86f760c1128dcf, type: 3}
+--- !u!114 &114987763159783732
+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: 4b243ff405b33b94dbf5b6775dd9aa33, type: 3}
+ m_Name: Files
+ m_EditorClassIdentifier:
+ StagingPaths:
+ -
+ includeMetaFiles: 0
+ files:
+ - {fileID: 102900000, guid: 7631214b97f81ad48a53c3c60fe99825, type: 3}
+ - {fileID: 102900000, guid: 93b3518e45956fc4ab34d872b34b2204, type: 3}
+ - {fileID: 102900000, guid: 8d193d75cb64dab418c6162045cedc1d, type: 3}
+--- !u!114 &4961625933286759612
+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: 8871ca15c6b4bb247b2c0735eef89e9c, type: 3}
+ m_Name: BurstAssemblyDefinitionsDatum
+ m_EditorClassIdentifier:
+ StagingPaths:
+ -
+ definitions:
+ - {fileID: 5897886265953266890, guid: f054131d8b8c38f49bfb7567178d0531, type: 3}
+--- !u!114 &8324102109481770816
+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: e0a82fec78ebc734d9ad1346cd40b5f9, type: 3}
+ m_Name: ThunderstoreData
+ m_EditorClassIdentifier:
+ StagingPaths:
+ -
+ url: https://github.com/TeamMoonstorm/Starstorm2
diff --git a/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/SS2-Manifest-Quick.asset.meta b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/SS2-Manifest-Quick.asset.meta
new file mode 100644
index 000000000..d8446d5d9
--- /dev/null
+++ b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/SS2-Manifest-Quick.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e8898db4e89ccab9a80732c5643b7eea
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: -3892906877110538616
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaBuild.asset b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaBuild.asset
index 9507a0537..273b56019 100644
--- a/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaBuild.asset
+++ b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaBuild.asset
@@ -57,15 +57,16 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 77f65d4371163fb4695da79ab8df0e84, type: 3}
m_Name: ExecuteProcess
m_EditorClassIdentifier:
- Active: 0
+ Active: 1
PerManifest: 0
ListType: 1
Manifests: []
- workingDirectory: C:\Program Files (x86)\Steam\steamapps\common\Risk of Rain 2
- executable: Risk of Rain 2.exe
+ workingDirectory: /home/icebrah/
+ executable: steam
arguments:
+ - -applaunch 632360
- --doorstop-enabled true
- - --doorstop-target-assembly "C:\Users\icebrah\AppData\Roaming\com.kesomannen.gale\riskofrain2\profiles\Default\BepInEx\core\BepInEx.Preloader.dll"
+ - --doorstop-target-assembly "/run/media/icebrah/buh/gale/riskofrain2/profiles/ss2debug/BepInEx/core/BepInEx.Preloader.dll"
--- !u!114 &-216652644370084839
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -108,6 +109,7 @@ MonoBehaviour:
- {fileID: -3576180096776599551}
- {fileID: -3853556619106336772}
- {fileID: -216652644370084839}
+ - {fileID: 5812675449588299462}
- {fileID: -368528284118131793}
QuickAccess: 1
manifest: {fileID: -3892906877110538616, guid: bcbdefdb47e2f8f45bdd7a2a4559b405,
@@ -126,3 +128,27 @@ MonoBehaviour:
m_EditorClassIdentifier:
Active: 1
buildMode: 0
+--- !u!114 &5812675449588299462
+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: 03063c7a6ec04cc4c82c75cf9bcc8db8, type: 3}
+ m_Name: Copy
+ m_EditorClassIdentifier:
+ Active: 1
+ PerManifest: 1
+ ListType: 1
+ Manifests:
+ - {fileID: -3892906877110538616, guid: bcbdefdb47e2f8f45bdd7a2a4559b405, type: 2}
+ - {fileID: 11400000, guid: 5ceb1d8ed3af40d4d806e9756b403649, type: 2}
+ ReplaceDirectory: 1
+ Recursive: 1
+ SourceRequired: 0
+ EstablishDestination: 1
+ Source:
+ Destination:
diff --git a/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickBuild.asset b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickBuild.asset
index 500836bdc..471c89524 100644
--- a/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickBuild.asset
+++ b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickBuild.asset
@@ -45,7 +45,6 @@ MonoBehaviour:
PerManifest: 1
ListType: 1
Manifests:
- - {fileID: 11400000, guid: 5ceb1d8ed3af40d4d806e9756b403649, type: 2}
- {fileID: -3892906877110538616, guid: bcbdefdb47e2f8f45bdd7a2a4559b405, type: 2}
ReplaceDirectory: 1
Recursive: 1
@@ -69,10 +68,34 @@ MonoBehaviour:
- {fileID: -6716489534761352844}
- {fileID: -7782781527810731362}
- {fileID: -3560350482831712343}
+ - {fileID: 2804326038416295348}
- {fileID: 8670464520431248306}
QuickAccess: 1
manifest: {fileID: -3892906877110538616, guid: bcbdefdb47e2f8f45bdd7a2a4559b405,
type: 2}
+--- !u!114 &2804326038416295348
+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: 03063c7a6ec04cc4c82c75cf9bcc8db8, type: 3}
+ m_Name: Copy
+ m_EditorClassIdentifier:
+ Active: 1
+ PerManifest: 1
+ ListType: 1
+ Manifests:
+ - {fileID: -3892906877110538616, guid: e8898db4e89ccab9a80732c5643b7eea, type: 2}
+ ReplaceDirectory: 1
+ Recursive: 1
+ SourceRequired: 0
+ EstablishDestination: 1
+ Source:
+ Destination:
--- !u!114 &8670464520431248306
MonoBehaviour:
m_ObjectHideFlags: 0
diff --git a/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickBuild.asset.meta b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickBuild.asset.meta
index c8612b2a1..c00c16aa2 100644
--- a/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickBuild.asset.meta
+++ b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickBuild.asset.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: 24daa7d8c1bf87a40b123c4c775aff1d
+guid: 528ad15c621f98726b944b6bf5267ebb
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
diff --git a/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickQuickBuild.asset b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickQuickBuild.asset
new file mode 100644
index 000000000..c1871e93c
--- /dev/null
+++ b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickQuickBuild.asset
@@ -0,0 +1,120 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-7782781527810731362
+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: 50df4f9027e15e04b931a8d460fb22c5, type: 3}
+ m_Name: ExecutePipeline
+ m_EditorClassIdentifier:
+ Active: 1
+ OverrideManifest: 1
+ targetpipeline: {fileID: 11400000, guid: aef4103e08541c748aa705db54e8b3f9, type: 2}
+--- !u!114 &-6716489534761352844
+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: dba11a23eb01c7a4aa61a8ab800c27dd, type: 3}
+ m_Name: ChangeAssemblyBuildMode
+ m_EditorClassIdentifier:
+ Active: 1
+ buildMode: 0
+--- !u!114 &-3560350482831712343
+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: 03063c7a6ec04cc4c82c75cf9bcc8db8, type: 3}
+ m_Name: Copy
+ m_EditorClassIdentifier:
+ Active: 1
+ PerManifest: 1
+ ListType: 1
+ Manifests:
+ - {fileID: -3892906877110538616, guid: e8898db4e89ccab9a80732c5643b7eea, type: 2}
+ ReplaceDirectory: 1
+ Recursive: 1
+ SourceRequired: 0
+ EstablishDestination: 1
+ Source:
+ Destination:
+--- !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: a3695521163bdd74fa2845bbd3438240, type: 3}
+ m_Name: kinaQuickQuickBuild
+ m_EditorClassIdentifier:
+ Data:
+ - {fileID: -6716489534761352844}
+ - {fileID: -7782781527810731362}
+ - {fileID: -3560350482831712343}
+ - {fileID: 8921695650931236058}
+ - {fileID: 8670464520431248306}
+ QuickAccess: 1
+ manifest: {fileID: -3892906877110538616, guid: e8898db4e89ccab9a80732c5643b7eea,
+ type: 2}
+--- !u!114 &8670464520431248306
+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: 77f65d4371163fb4695da79ab8df0e84, type: 3}
+ m_Name: ExecuteProcess
+ m_EditorClassIdentifier:
+ Active: 1
+ PerManifest: 0
+ ListType: 1
+ Manifests: []
+ workingDirectory: /home/icebrah/
+ executable: steam
+ arguments:
+ - -applaunch 632360
+ - --doorstop-enabled true
+ - --doorstop-target-assembly "/run/media/icebrah/buh/gale/riskofrain2/profiles/ss2debug/BepInEx/core/BepInEx.Preloader.dll"
+--- !u!114 &8921695650931236058
+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: 03063c7a6ec04cc4c82c75cf9bcc8db8, type: 3}
+ m_Name: Copy
+ m_EditorClassIdentifier:
+ Active: 1
+ PerManifest: 1
+ ListType: 1
+ Manifests:
+ - {fileID: -3892906877110538616, guid: e8898db4e89ccab9a80732c5643b7eea, type: 2}
+ ReplaceDirectory: 1
+ Recursive: 1
+ SourceRequired: 0
+ EstablishDestination: 1
+ Source:
+ Destination:
diff --git a/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickQuickBuild.asset.meta b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickQuickBuild.asset.meta
new file mode 100644
index 000000000..c8612b2a1
--- /dev/null
+++ b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaQuickQuickBuild.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 24daa7d8c1bf87a40b123c4c775aff1d
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaTestingPathClient.asset b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaTestingPathClient.asset
new file mode 100644
index 000000000..43034203c
--- /dev/null
+++ b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaTestingPathClient.asset
@@ -0,0 +1,42 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-6142944670686032481
+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: cebc722807299b54bb8733330087d5e3, type: 3}
+ m_Name: Constant
+ m_EditorClassIdentifier:
+ Value: /run/media/icebrah/buh/gale/riskofrain2/profiles/ss2debugclient/BepInEx/plugins/ss2/
+--- !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: b4f773cd2b7463d44aa153647e991b43, type: 3}
+ m_Name: kinaTestingPathClient
+ m_EditorClassIdentifier:
+ Data:
+ - {fileID: -6142944670686032481}
+ - {fileID: 5415110206726285799}
+--- !u!114 &5415110206726285799
+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: 2efd008a408bd8449ad573ac2d5003ce, type: 3}
+ m_Name: ManifestName
+ m_EditorClassIdentifier:
diff --git a/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaTestingPathClient.asset.meta b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaTestingPathClient.asset.meta
new file mode 100644
index 000000000..154831de5
--- /dev/null
+++ b/SS2-Project/Assets/ThunderkitRelated/Contributor/kina/kinaTestingPathClient.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e21febf10c11df9b8ad908dc8cb1bf9f
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/SS2-Project/Packages/manifest.json b/SS2-Project/Packages/manifest.json
index b2d9ab689..424ebce9b 100644
--- a/SS2-Project/Packages/manifest.json
+++ b/SS2-Project/Packages/manifest.json
@@ -6,6 +6,7 @@
"com.unity.assetbundlebrowser": "https://github.com/Unity-Technologies/AssetBundles-Browser.git",
"com.unity.burst": "1.8.18",
"com.unity.collections": "1.5.1",
+ "com.unity.ide.rider": "3.0.40",
"com.unity.ide.visualstudio": "2.0.22",
"com.unity.multiplayer-hlapi": "https://github.com/risk-of-thunder/UnityMultiplayerHLAPI.git#1.1.1",
"com.unity.postprocessing": "2.3.0",
diff --git a/SS2-Project/Packages/packages-lock.json b/SS2-Project/Packages/packages-lock.json
index 6ceb2fbfc..75440a47c 100644
--- a/SS2-Project/Packages/packages-lock.json
+++ b/SS2-Project/Packages/packages-lock.json
@@ -74,6 +74,15 @@
"dependencies": {},
"url": "https://packages.unity.com"
},
+ "com.unity.ide.rider": {
+ "version": "3.0.40",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.ext.nunit": "1.0.6"
+ },
+ "url": "https://packages.unity.com"
+ },
"com.unity.ide.visualstudio": {
"version": "2.0.22",
"depth": 0,