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