├── .github └── FUNDING.yml ├── .gitignore ├── GTFO_VR.sln ├── GTFO_VR ├── Core │ ├── ForceTube │ │ ├── ForceTube.cs │ │ └── ForceTubeVRInterface.cs │ ├── GTFO_VR_Plugin.cs │ ├── Log.cs │ ├── PlayerBehaviours │ │ ├── BodyHaptics │ │ │ ├── Bhaptics │ │ │ │ ├── BhapticsElevatorSequence.cs │ │ │ │ └── BhapticsIntegration.cs │ │ │ ├── BodyHapticAgent.cs │ │ │ ├── BodyHapticsIntegrator.cs │ │ │ ├── BodyHapticsUtils.cs │ │ │ ├── ElevatorSequenceAgent.cs │ │ │ ├── ElevatorSequenceIntegrator.cs │ │ │ ├── ElevatorState.cs │ │ │ └── Shockwave │ │ │ │ ├── Engine │ │ │ │ ├── HapticGroupInfo.cs │ │ │ │ ├── HapticGroupPattern.cs │ │ │ │ ├── HapticIndex.cs │ │ │ │ ├── HapticIndexPattern.cs │ │ │ │ └── ShockwaveEngine.cs │ │ │ │ ├── ShockwaveElevatorSequence.cs │ │ │ │ └── ShockwaveIntegration.cs │ │ ├── ColisionFade.cs │ │ ├── Haptics.cs │ │ ├── LaserPointer.cs │ │ ├── Melee │ │ │ └── VelocityTracker.cs │ │ ├── MovementVignette.cs │ │ ├── PlayerOrigin.cs │ │ ├── Snapturn.cs │ │ ├── VRMeleeWeapon.cs │ │ ├── VRPlayer.cs │ │ └── VRRendering.cs │ ├── UI │ │ ├── DividedBarShaderController.cs │ │ ├── RadialItem.cs │ │ ├── RadialMenu.cs │ │ ├── Terminal │ │ │ ├── KeyboardDefinition │ │ │ │ ├── KeyDefinition.cs │ │ │ │ ├── KeyboardLayout.cs │ │ │ │ ├── KeyboardStyle.cs │ │ │ │ ├── LayoutParameters.cs │ │ │ │ └── LinearLayout.cs │ │ │ ├── Pointer │ │ │ │ ├── MonoPointerEvent.cs │ │ │ │ ├── PhysicalButton.cs │ │ │ │ ├── PointerEvent.cs │ │ │ │ ├── PointerHistory.cs │ │ │ │ └── TerminalPointer.cs │ │ │ ├── RoundedCubeBackground.cs │ │ │ ├── TerminalKeyboardCanvas.cs │ │ │ ├── TerminalKeyboardInterface.cs │ │ │ └── TerminalReader.cs │ │ ├── VRWorldSpaceUI.cs │ │ ├── VR_UI_Overlay.cs │ │ ├── Watch.cs │ │ ├── WeaponAmmoHologram.cs │ │ └── WeaponRadialMenu.cs │ ├── VRAssets.cs │ ├── VRConfig.cs │ ├── VRSystems.cs │ ├── VR_Input │ │ ├── Controllers.cs │ │ ├── Dummy_InputHandler.cs │ │ ├── HMD.cs │ │ ├── HandType.cs │ │ ├── SteamVR_InputHandler.cs │ │ ├── TrackingType.cs │ │ └── VRKeyboard.cs │ ├── WeaponArchetypeVRData.VRWeaponData.cs │ └── WeaponArchetypeVRData.cs ├── Detours │ ├── BioscannerDetours.cs │ ├── HammerAttackCheckDetour.cs │ ├── InjectPlayerHudEventsDetour.cs │ └── TerminalInputDetours.cs ├── Events │ ├── BackpackEvents.cs │ ├── ChatMsgEvents.cs │ ├── ElevatorEvents.cs │ ├── FocusStateEvents.cs │ ├── GlueGunEvents.cs │ ├── HeldItemEvents.cs │ ├── InventoryAmmoEvents.cs │ ├── ItemEquippableEvents.cs │ ├── PlayerHudEvents.cs │ ├── PlayerInteractionEvents.cs │ ├── PlayerLocomotionEvents.cs │ ├── PlayerReceivedDamageEvents.cs │ ├── PlayerReloadEvents.cs │ ├── PlayerTriggerReloadEvents.cs │ ├── ResourceUpdatedEvents.cs │ ├── TentacleAttackEvents.cs │ ├── VRMeleeWeaponEvents.cs │ └── WeaponRecoilEvents.cs ├── GTFO_VR.csproj ├── Injections │ ├── Events │ │ ├── InjectBackpackEvents.cs │ │ ├── InjectElevatorEvents.cs │ │ ├── InjectFocusStateEvents.cs │ │ ├── InjectGlueGunEvents.cs │ │ ├── InjectHeldItemEvents.cs │ │ ├── InjectInventoryAmmoUpdateEvent.cs │ │ ├── InjectItemEquippableEvents.cs │ │ ├── InjectLadderPLOCEvent.cs │ │ ├── InjectPLOCEvents.cs │ │ ├── InjectPlayerDamageEvents.cs │ │ ├── InjectPlayerInteractionEvents.cs │ │ ├── InjectPlayerReloadEvents.cs │ │ ├── InjectPlayerTriggerReloadEvents.cs │ │ ├── InjectPlayerWeaponFireEvents.cs │ │ ├── InjectResourceGainEvent.cs │ │ └── InjectTentacleAttackEvents.cs │ ├── GameHooks │ │ ├── InjectInteractionPromptRef.cs │ │ ├── InjectPlayerAgentRef.cs │ │ ├── InjectPlayerGUIRef.cs │ │ └── InjectVRStart.cs │ ├── Gameplay │ │ ├── InjectBioscannerFixes.cs │ │ ├── InjectControllerAim.cs │ │ ├── InjectCrouchHeight.cs │ │ ├── InjectDisableHipFireAimSpreadInVR.cs │ │ ├── InjectDisablePlayerMoveTo.cs │ │ ├── InjectDisableRecoilCameraOffset.cs │ │ ├── InjectFireFromMuzzle.cs │ │ ├── InjectHMDMovement.cs │ │ ├── InjectMuzzleAlignCorrection.cs │ │ ├── InjectNoVRCamHIjack.cs │ │ ├── InjectSemanticInteractionTweaks.cs │ │ ├── InjectVRHammer.cs │ │ └── InjectWeaponAimFlashlightAggro.cs │ ├── Input │ │ ├── InjectAimCursorWithVRControllerInOverlay.cs │ │ ├── InjectFreeTheCursor.cs │ │ ├── InjectInput.cs │ │ ├── InjectKeyInput.cs │ │ └── InjectSkipButton.cs │ ├── Rendering │ │ ├── InjectClusteredRenderingResolutionTweak.cs │ │ ├── InjectDisableFPSCameraRenderUpdate.cs │ │ ├── InjectDisableFPSRenderPreCull.cs │ │ ├── InjectDisableUIRendering.cs │ │ ├── InjectEarlyTransparentRendererFix.cs │ │ ├── InjectFPRendering.cs │ │ ├── InjectForceVRResolution.cs │ │ ├── InjectPostProcessTweaks.cs │ │ ├── InjectScreenLiquidVRTweak.cs │ │ └── InjectSkipDuplicateRenderTasks.cs │ └── UI │ │ ├── InjectChatMsgEvents.cs │ │ ├── InjectCommsMenu.cs │ │ ├── InjectInteractionPromptActionNames.cs │ │ ├── InjectLocalizedVRText.cs │ │ ├── InjectMenuConfigUI.cs │ │ ├── InjectNavMarkerWorldSpace.cs │ │ ├── InjectRemoveCrosshair.cs │ │ ├── InjectSmallerMarkers.cs │ │ ├── InjectWatchObjectives.cs │ │ └── InjectWatchUpdateStatus.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ └── Resources.resx ├── Resources │ └── 78vav6fmPmGpDKiJIINK.json └── Util │ ├── ExtensionMethods.cs │ └── GTFODebugDraw3D.cs ├── LICENSE ├── README.md ├── Release_Dependencies ├── Changelog.txt ├── StreamingAssets │ ├── AssetBundles │ ├── AssetBundles.manifest │ ├── SteamVR_Standalone │ │ ├── actions.json │ │ ├── binding_holographic_hmd.json │ │ ├── binding_index_hmd.json │ │ ├── binding_rift.json │ │ ├── binding_vive.json │ │ ├── binding_vive_cosmos.json │ │ ├── binding_vive_pro.json │ │ ├── binding_vive_tracker_camera.json │ │ ├── bindings_holographic_controller.json │ │ ├── bindings_knuckles.json │ │ ├── bindings_oculus_touch.json │ │ ├── bindings_vive_controller.json │ │ └── bindings_vive_cosmos_controller.json │ ├── gtfovr_shaders │ ├── gtfovr_shaders.manifest │ ├── vrshaders │ ├── vrshaders.manifest │ ├── vrwatch │ └── vrwatch.manifest └── libs │ ├── Bhaptics.Tact.dll │ ├── ForceTubeVR_API_x64.dll │ ├── Newtonsoft.Json.dll │ ├── ShockWaveIMU.dll │ ├── ShockwaveManager.dll │ ├── SteamVR_Standalone_IL2CPP.dll │ ├── bhaptics-patterns │ ├── arms │ │ ├── change_item_l.tact │ │ ├── change_item_r.tact │ │ ├── elevator_deploying.tact │ │ ├── elevator_ride_wave.tact │ │ ├── explosion.tact │ │ ├── fire_l.tact │ │ ├── fire_r.tact │ │ ├── flashlight_toggle_l.tact │ │ ├── flashlight_toggle_r.tact │ │ ├── gain_ammo.tact │ │ ├── gain_tool_ammo.tact │ │ ├── hammer_charging_l.tact │ │ ├── hammer_charging_r.tact │ │ ├── hammer_fully_charged_l.tact │ │ ├── hammer_fully_charged_r.tact │ │ ├── hammer_smack_l.tact │ │ ├── hammer_smack_r.tact │ │ ├── interact_item_l.tact │ │ ├── interact_item_r.tact │ │ ├── landing.tact │ │ ├── out_of_ammo_l.tact │ │ ├── out_of_ammo_r.tact │ │ ├── reload_l.tact │ │ └── reload_r.tact │ ├── vest │ │ ├── body_scan.tact │ │ ├── crouch.tact │ │ ├── damage.tact │ │ ├── death.tact │ │ ├── elevator_deploying.tact │ │ ├── elevator_door_opening.tact │ │ ├── elevator_ride_noise.tact │ │ ├── elevator_ride_wave.tact │ │ ├── explosion.tact │ │ ├── fire_l.tact │ │ ├── fire_r.tact │ │ ├── gain_ammo.tact │ │ ├── gain_disinfection.tact │ │ ├── gain_health.tact │ │ ├── gain_tool_ammo.tact │ │ ├── hammer_charging_l.tact │ │ ├── hammer_charging_r.tact │ │ ├── hammer_fully_charged_l.tact │ │ ├── hammer_fully_charged_r.tact │ │ ├── hammer_smack_l.tact │ │ ├── hammer_smack_r.tact │ │ ├── landing.tact │ │ ├── landing_small.tact │ │ ├── need_health.tact │ │ ├── reload_l.tact │ │ ├── reload_r.tact │ │ ├── stand.tact │ │ └── tentacle_attack.tact │ └── visor │ │ ├── boom1_head.tact │ │ ├── boom4_head.tact │ │ ├── boom6_head.tact │ │ ├── point7_head.tact │ │ ├── point8_head.tact │ │ ├── point9_head.tact │ │ ├── rumble1_head.tact │ │ ├── rumble3_head.tact │ │ ├── rumble4_head.tact │ │ ├── rumble_headfalling.tact │ │ ├── scan8_head.tact │ │ └── splatdropping.tact │ ├── bhaptics_library.dll │ ├── openvr_api.dll │ └── protubeHaptics │ └── HapticsData.json └── create_release.py /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: ["https://ko-fi.com/gtfovr"] 13 | -------------------------------------------------------------------------------- /GTFO_VR.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.5.33627.172 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GTFO_VR", "GTFO_VR\GTFO_VR.csproj", "{A11A2774-4115-4E28-A803-8F3FC4868F01}" 7 | EndProject 8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3419052C-0A9E-4483-8002-15E59D171AF7}" 9 | ProjectSection(SolutionItems) = preProject 10 | .gitignore = .gitignore 11 | Release_Dependencies\Changelog.txt = Release_Dependencies\Changelog.txt 12 | create_release.py = create_release.py 13 | README.md = README.md 14 | EndProjectSection 15 | EndProject 16 | Global 17 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 18 | Debug|Any CPU = Debug|Any CPU 19 | Release|Any CPU = Release|Any CPU 20 | EndGlobalSection 21 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 22 | {A11A2774-4115-4E28-A803-8F3FC4868F01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {A11A2774-4115-4E28-A803-8F3FC4868F01}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {A11A2774-4115-4E28-A803-8F3FC4868F01}.Release|Any CPU.ActiveCfg = Release|Any CPU 25 | {A11A2774-4115-4E28-A803-8F3FC4868F01}.Release|Any CPU.Build.0 = Release|Any CPU 26 | EndGlobalSection 27 | GlobalSection(SolutionProperties) = preSolution 28 | HideSolutionNode = FALSE 29 | EndGlobalSection 30 | GlobalSection(ExtensibilityGlobals) = postSolution 31 | SolutionGuid = {8C99519C-6642-44AE-B0A4-3ECA5239D312} 32 | EndGlobalSection 33 | EndGlobal 34 | -------------------------------------------------------------------------------- /GTFO_VR/Core/Log.cs: -------------------------------------------------------------------------------- 1 | using BepInEx.Logging; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace GTFO_VR.Core 9 | { 10 | public static class Log 11 | { 12 | static ManualLogSource log; 13 | 14 | public static void Setup(ManualLogSource log) 15 | { 16 | Log.log = log; 17 | } 18 | 19 | public static void Warning(string msg) 20 | { 21 | log.LogWarning(msg); 22 | } 23 | 24 | public static void Error(string msg) 25 | { 26 | log.LogError(msg); 27 | } 28 | 29 | public static void Info(string msg) 30 | { 31 | log.LogInfo(msg); 32 | } 33 | 34 | public static void Debug(string msg) 35 | { 36 | log.LogDebug(msg); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /GTFO_VR/Core/PlayerBehaviours/BodyHaptics/BodyHapticAgent.cs: -------------------------------------------------------------------------------- 1 | using Player; 2 | using UnityEngine; 3 | 4 | namespace GTFO_VR.Core.PlayerBehaviours.BodyHaptics 5 | { 6 | public interface BodyHapticAgent 7 | { 8 | bool AgentActive(); 9 | void Update(); 10 | void HammerSmackHaptics(float dmg); 11 | void HammerFullyChargedHaptics(); 12 | void HammerHalfChargedHaptics(); 13 | void HammerChargingHaptics(float pressure); 14 | void PlayWeaponReloadHaptics(); 15 | void StopWeaponReloadHaptics(); 16 | void PlayWeaponFireHaptics(Weapon weapon); 17 | void PlayReceiveDamageHaptics(float dmg, Vector3 direction); 18 | void MineExplosionHaptics(OrientationSettings orientationSettings, float intensity); 19 | void TentacleAttackHaptics(float dmg, Agents.Agent sourceAgent, Vector3 position); 20 | void LandedFromElevator(eFocusState focusState); 21 | void PlayerInteractedHaptics(PlayerAgent source); 22 | void PlayBioscanHaptics(); 23 | void StopBioscanHaptics(); 24 | void FlashlightToggledHaptics(); 25 | void PlayerChangedItemHaptics(ItemEquippable item); 26 | void AmmoGainedHaptics(float ammoStandardRel, float ammoSpecialRel, float ammoClassRel); 27 | void InfectionHealed(float infection); 28 | void OnHealthUpdated(float health); 29 | void WeaponAmmoEmpty(bool leftArm); 30 | void OnPlayerLocomotionStateChanged(PlayerLocomotion.PLOC_State state); 31 | void CrouchToggleHaptics(bool isCrouched); 32 | void OnLiquidSplat(); 33 | } 34 | } -------------------------------------------------------------------------------- /GTFO_VR/Core/PlayerBehaviours/BodyHaptics/ElevatorSequenceAgent.cs: -------------------------------------------------------------------------------- 1 | namespace GTFO_VR.Core.PlayerBehaviours.BodyHaptics 2 | { 3 | public interface ElevatorSequenceAgent 4 | { 5 | bool AgentActive(); 6 | void Update(); 7 | void ElevatorStateChanged(ElevatorState elevatorState); 8 | void SetIsInElevator(bool inElevator); 9 | } 10 | } -------------------------------------------------------------------------------- /GTFO_VR/Core/PlayerBehaviours/BodyHaptics/ElevatorState.cs: -------------------------------------------------------------------------------- 1 | namespace GTFO_VR.Core.PlayerBehaviours.BodyHaptics 2 | { 3 | public enum ElevatorState 4 | { 5 | None, 6 | SceneLoaded, 7 | FirstMovement, 8 | PendingCageRotating, 9 | CageRotating, 10 | PendingDoorOpening, 11 | PendingTopDeploying, 12 | TopDeploying, 13 | Preparing, 14 | FirstDescentPattern, 15 | Descending, 16 | SlowingDown, 17 | Landed, 18 | Deploying, 19 | } 20 | } -------------------------------------------------------------------------------- /GTFO_VR/Core/PlayerBehaviours/BodyHaptics/Shockwave/Engine/HapticGroupInfo.cs: -------------------------------------------------------------------------------- 1 | namespace GTFO_VR.Core.PlayerBehaviours.BodyHaptics.Shockwave.Engine 2 | { 3 | public struct HapticGroupInfo 4 | { 5 | public ShockwaveManager.HapticGroup group; 6 | public float intensity; 7 | 8 | public HapticGroupInfo(ShockwaveManager.HapticGroup group, float intensity) 9 | { 10 | this.group = group; 11 | this.intensity = intensity; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /GTFO_VR/Core/PlayerBehaviours/BodyHaptics/Shockwave/Engine/HapticGroupPattern.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace GTFO_VR.Core.PlayerBehaviours.BodyHaptics.Shockwave.Engine 4 | { 5 | public struct HapticGroupPattern 6 | { 7 | public List groupInfos; 8 | public int delay; 9 | 10 | public HapticGroupPattern(List groupInfos, int delay) 11 | { 12 | this.groupInfos = groupInfos; 13 | this.delay = delay; 14 | } 15 | 16 | public HapticGroupPattern(ShockwaveManager.HapticGroup group, float intensity, int delay) 17 | { 18 | this.groupInfos = new List {new HapticGroupInfo(group, intensity)}; 19 | this.delay = delay; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /GTFO_VR/Core/PlayerBehaviours/BodyHaptics/Shockwave/Engine/HapticIndex.cs: -------------------------------------------------------------------------------- 1 | namespace GTFO_VR.Core.PlayerBehaviours.BodyHaptics.Shockwave.Engine 2 | { 3 | public class HapticIndex 4 | { 5 | public int index; 6 | public float intensity; 7 | 8 | public HapticIndex(int index, float intensity) 9 | { 10 | this.index = index; 11 | this.intensity = intensity; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /GTFO_VR/Core/PlayerBehaviours/BodyHaptics/Shockwave/Engine/HapticIndexPattern.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace GTFO_VR.Core.PlayerBehaviours.BodyHaptics.Shockwave.Engine 4 | { 5 | public class HapticIndexPattern 6 | { 7 | public List> indices; 8 | public int delay; 9 | 10 | public HapticIndexPattern(HapticIndexPattern other) 11 | { 12 | indices = new List>(); 13 | foreach (List otherList in other.indices) 14 | { 15 | List list = new List(); 16 | foreach (HapticIndex hapticIndex in otherList) 17 | { 18 | list.Add(new HapticIndex(hapticIndex.index, hapticIndex.intensity)); 19 | } 20 | indices.Add(list); 21 | } 22 | delay = other.delay; 23 | } 24 | 25 | /* 26 | * Runs inner-level array as a group of indices 27 | */ 28 | public HapticIndexPattern(int[,] indices, float intensity, int delay) 29 | { 30 | this.indices = new List>(); 31 | this.delay = delay; 32 | 33 | for (int x = 0; x < indices.GetLength(0); x += 1) 34 | { 35 | var hapticIndices = new List(); 36 | this.indices.Add(hapticIndices); 37 | for (int y = 0; y < indices.GetLength(1); y += 1) 38 | { 39 | hapticIndices.Add(new HapticIndex(indices[x, y], intensity)); 40 | } 41 | } 42 | } 43 | 44 | /* 45 | * Runs inner-level list as a group of indices 46 | */ 47 | public HapticIndexPattern(List> indices, float intensity, int delay) 48 | { 49 | this.indices = new List>(); 50 | this.delay = delay; 51 | 52 | foreach (List list in indices) 53 | { 54 | var hapticIndices = new List(); 55 | this.indices.Add(hapticIndices); 56 | foreach (int index in list) 57 | { 58 | hapticIndices.Add(new HapticIndex(index, intensity)); 59 | } 60 | } 61 | } 62 | 63 | /* 64 | * Runs one index after the other 65 | */ 66 | public HapticIndexPattern(int[] indices, float intensity, int delay) 67 | { 68 | this.indices = new List>(); 69 | this.delay = delay; 70 | 71 | foreach (int index in indices) 72 | { 73 | var hapticIndices = new List(); 74 | this.indices.Add(hapticIndices); 75 | hapticIndices.Add(new HapticIndex(index, intensity)); 76 | } 77 | } 78 | } 79 | } -------------------------------------------------------------------------------- /GTFO_VR/Core/PlayerBehaviours/ColisionFade.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core.VR_Input; 2 | using Player; 3 | using System; 4 | using UnityEngine; 5 | using Valve.VR; 6 | 7 | namespace GTFO_VR.Core.PlayerBehaviours 8 | { 9 | /// 10 | /// Fades player's screen if he is within collision or trying to walk behind doors/walls in roomspace 11 | /// 12 | public class CollisionFade : MonoBehaviour 13 | { 14 | public CollisionFade(IntPtr value) : base(value) 15 | { 16 | } 17 | 18 | private bool m_fpsCameraInCollision; 19 | private bool m_playerAgentToHMDPositionBlocked; 20 | private bool m_wasFadedLastFrame; 21 | 22 | private LocalPlayerAgent m_agent; 23 | 24 | public void Setup(LocalPlayerAgent agent) 25 | { 26 | m_agent = agent; 27 | } 28 | 29 | private void FixedUpdate() 30 | { 31 | HandleCameraInCollision(); 32 | } 33 | 34 | /// 35 | /// If the player head is colliding with something or if an object like a door is between the camera and the true player agent position then 36 | /// we fade the screen. No cheating! 37 | /// 38 | public void HandleCameraInCollision() 39 | { 40 | m_fpsCameraInCollision = Physics.OverlapBox(HMD.GetWorldPosition() + HMD.GetWorldForward() * 0.05f, new Vector3(0.03f, 0.03f, 0.03f), HMD.Hmd.transform.rotation, LayerManager.MASK_TENTACLE_BLOCKERS).Length > 0; 41 | 42 | Vector3 centerPlayerHeadPos = VRPlayer.FpsCamera.GetCamerposForPlayerPos(m_agent.PlayerCharacterController.SmoothPosition); 43 | m_playerAgentToHMDPositionBlocked = Physics.Linecast(centerPlayerHeadPos, HMD.GetWorldPosition(), LayerManager.MASK_TENTACLE_BLOCKERS); 44 | 45 | if (m_playerAgentToHMDPositionBlocked || m_fpsCameraInCollision) 46 | { 47 | m_wasFadedLastFrame = true; 48 | SteamVR_Fade.Start(Color.black, 0.2f, true); 49 | return; 50 | } 51 | else if (m_wasFadedLastFrame) 52 | { 53 | SteamVR_Fade.Start(Color.clear, 0.2f, true); 54 | m_wasFadedLastFrame = false; 55 | } 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /GTFO_VR/Core/PlayerBehaviours/MovementVignette.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using Player; 3 | using System; 4 | using UnityEngine; 5 | using UnityEngine.PostProcessing; 6 | using GTFO_VR.Util; 7 | using Valve.VR.InteractionSystem; 8 | using UnityEngine.Rendering.PostProcessing; 9 | 10 | namespace GTFO_VR.Core.PlayerBehaviours 11 | { 12 | public class MovementVignette : MonoBehaviour 13 | { 14 | public MovementVignette(IntPtr value) 15 | : base(value) { } 16 | 17 | private FPSCamera m_fpsCamera; 18 | 19 | private PlayerLocomotion m_playerLocomotion; 20 | 21 | private Vignette m_vignettePost; 22 | 23 | private float m_targetIntensity = 0.25f; 24 | 25 | float m_currentIntensity = 0f; 26 | 27 | bool m_setup = false; 28 | 29 | private void Update() 30 | { 31 | if(m_vignettePost == null) 32 | { 33 | if(m_fpsCamera.m_postProcessing != null) 34 | { 35 | m_vignettePost = m_fpsCamera.m_postProcessing.m_vignette; 36 | } 37 | return; 38 | } 39 | 40 | if (!m_setup) 41 | { 42 | m_vignettePost.color.Override(Color.black); 43 | m_vignettePost.mode.Override(VignetteMode.Classic); 44 | m_vignettePost.opacity.Override(1f); 45 | m_vignettePost.rounded.Override(true); 46 | m_vignettePost.roundness.Override(1f); 47 | m_setup = true; 48 | } 49 | 50 | bool shouldBeActive = VRConfig.configPostVignette.Value || VRConfig.configUseVignetteWhenMoving.Value; 51 | m_vignettePost.enabled.Override(shouldBeActive); 52 | 53 | m_targetIntensity = GetVignetteIntensityForVelocityPerGamestate(); 54 | 55 | // Lerp to vignette intensity. Ramp up faster and ramp down slower. 56 | float lerpSpeed = m_vignettePost.intensity < m_targetIntensity ? 20f : 8f; 57 | m_currentIntensity = Mathf.Lerp(m_currentIntensity, m_targetIntensity, lerpSpeed * Time.deltaTime); 58 | 59 | m_vignettePost.intensity.Override(m_currentIntensity); 60 | } 61 | 62 | private float GetVignetteIntensityForVelocityPerGamestate() 63 | { 64 | float intensity = .25f; 65 | 66 | if (FocusStateEvents.currentState == eFocusState.InElevator || !VRConfig.configUseVignetteWhenMoving.Value) 67 | { 68 | return VRConfig.configMovementVignetteIntensity.Value / 2f; ; 69 | } 70 | 71 | if (FocusStateEvents.currentState == eFocusState.FPS) 72 | { 73 | intensity = Mathf.Clamp(m_playerLocomotion.HorizontalVelocity.magnitude, 0.25f, 2f); 74 | intensity = intensity.RemapClamped(0, 3f, 0, VRConfig.configMovementVignetteIntensity.Value); 75 | } 76 | 77 | return intensity; 78 | } 79 | 80 | public void Setup(PlayerLocomotion agentLocomotion, FPSCamera cam) 81 | { 82 | m_playerLocomotion = agentLocomotion; 83 | m_fpsCamera = cam; 84 | } 85 | } 86 | } -------------------------------------------------------------------------------- /GTFO_VR/Core/UI/Terminal/KeyboardDefinition/KeyboardLayout.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | 4 | namespace GTFO_VR.Core.UI.Terminal.KeyboardDefinition 5 | { 6 | /// 7 | /// Interface for anything that can be inflated into a LinearLayout 8 | /// Layout is defined by LinearLayout and KeyDefinition objects. 9 | /// 10 | public interface KeyboardLayout 11 | { 12 | /// 13 | /// Generates actual GameObjects with Vertical/HorizontalLayoutGroups and PhyscialButtons 14 | /// 15 | GameObject GenerateLayout(TerminalKeyboardInterface keyboardRoot, KeyboardStyle style); 16 | 17 | /// 18 | /// Children layout definitions that this object should inflate and add to itself 19 | /// 20 | void AddChild(KeyboardLayout layout); 21 | String GetName(); 22 | 23 | void SetStyle(KeyboardStyle style); 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /GTFO_VR/Core/UI/Terminal/KeyboardDefinition/LayoutParameters.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine.UI; 2 | 3 | namespace GTFO_VR.Core.UI.Terminal.KeyboardDefinition 4 | { 5 | /// 6 | /// Used to populate the settings of LayoutElement and Vertical/HorizontalLayoutGroup. 7 | /// 8 | public class LayoutParameters 9 | { 10 | public static readonly float FILL_PARENT = -1; 11 | public static readonly float WRAP_CONTENT = -2; 12 | 13 | public static LayoutParameters FillParent() 14 | { 15 | return new LayoutParameters(FILL_PARENT, FILL_PARENT); 16 | } 17 | 18 | public static LayoutParameters WrapContent() 19 | { 20 | return new LayoutParameters(WRAP_CONTENT, WRAP_CONTENT); 21 | } 22 | 23 | public float Width = 1; // Size of element multiplied by tile size defined in KeyboardStyle. 24 | public float Height = 1; 25 | 26 | public float Weight = 1; 27 | 28 | public LayoutParameters() : this(1, 1, 1) { } 29 | public LayoutParameters(float width) : this(width, 1, 1) { } 30 | public LayoutParameters(float width, float height) : this(width, height, 1) { } 31 | 32 | public LayoutParameters( float width, float height, float weight) 33 | { 34 | this.Width = width; 35 | this.Height = height; 36 | this.Weight = weight; 37 | } 38 | 39 | /// 40 | /// Fills Unity's LayoutElement with values that correspond to the layout parameters configured by this object. 41 | /// 42 | public LayoutElement PopulateLayoutElement(LayoutElement element, KeyboardStyle style) 43 | { 44 | if ( Width == FILL_PARENT ) 45 | { 46 | element.preferredWidth = -1; 47 | element.flexibleWidth = Weight; 48 | } 49 | else if (Width == WRAP_CONTENT) 50 | { 51 | element.preferredWidth = -1; 52 | element.flexibleWidth = -1; 53 | } 54 | else 55 | { 56 | element.preferredWidth = style.TileSize * this.Width; 57 | element.flexibleWidth = -1; 58 | } 59 | 60 | if (Height == FILL_PARENT) 61 | { 62 | element.preferredHeight = -1; 63 | element.flexibleHeight = Weight; 64 | } 65 | else if (Width == WRAP_CONTENT) 66 | { 67 | element.preferredHeight = -1; 68 | element.flexibleHeight = -1; 69 | } 70 | else 71 | { 72 | element.preferredHeight = style.TileSize * this.Height; 73 | element.flexibleHeight = -1; 74 | } 75 | 76 | return element; 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /GTFO_VR/Core/UI/Terminal/Pointer/MonoPointerEvent.cs: -------------------------------------------------------------------------------- 1 | using Il2CppInterop.Runtime.Attributes; 2 | using System; 3 | using UnityEngine; 4 | 5 | namespace GTFO_VR.Core.UI.Terminal.Pointer 6 | { 7 | /// 8 | /// We don't get to implement our own interfaces, 9 | /// so our terminal keyboard interactables ( buttons, reader ) all inherit from this instead 10 | /// 11 | public class MonoPointerEvent : MonoBehaviour 12 | { 13 | 14 | public MonoPointerEvent(IntPtr value) : base(value) { } 15 | 16 | [HideFromIl2Cpp] 17 | public virtual void OnPointerEnter(PointerEvent ev) 18 | { 19 | 20 | } 21 | 22 | [HideFromIl2Cpp] 23 | public virtual void OnPointerExit(PointerEvent ev) 24 | { 25 | 26 | } 27 | 28 | /// 29 | /// Move position called after OnPointer Enter. 30 | /// Implementation may return a different position to be used to display the pointer location. 31 | /// 32 | [HideFromIl2Cpp] 33 | public virtual Vector3 OnPointerMove(PointerEvent ev) 34 | { 35 | return ev.Position; 36 | } 37 | 38 | [HideFromIl2Cpp] 39 | public virtual void OnPointerDown(PointerEvent ev) 40 | { 41 | 42 | } 43 | 44 | [HideFromIl2Cpp] 45 | public virtual void OnPointerUp(PointerEvent ev) 46 | { 47 | 48 | } 49 | 50 | /// 51 | /// The event was cancelled. Target should revert to its default state. 52 | /// 53 | [HideFromIl2Cpp] 54 | public virtual void OnPointerCancel(PointerEvent ev) 55 | { 56 | 57 | } 58 | 59 | /// 60 | /// The event was cancelled. Target should revert to its default state. 61 | /// 62 | [HideFromIl2Cpp] 63 | public virtual void OnFocusLost(PointerEvent ev) 64 | { 65 | 66 | } 67 | 68 | /// 69 | /// Implementation may provide a different pointer size 70 | /// 71 | [HideFromIl2Cpp] 72 | public virtual float GetPointerSize( float defaultSize ) 73 | { 74 | return defaultSize; 75 | } 76 | 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /GTFO_VR/Core/UI/Terminal/Pointer/PointerEvent.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace GTFO_VR.Core.UI.Terminal.Pointer 4 | { 5 | /// 6 | /// Our equivalent of EventSystem.PointerEventData 7 | /// 8 | public struct PointerEvent 9 | { 10 | public Vector3 Position; 11 | public int PointerId; 12 | 13 | public PointerEvent( Vector3 position ) 14 | { 15 | this.Position = position; 16 | PointerId = -1; 17 | } 18 | 19 | /* 20 | public interface IPointerEvent 21 | { 22 | void OnPointerEnter(PointerEvent ev); 23 | void OnPointerExit(PointerEvent ev); 24 | void onPointerMove(PointerEvent ev); 25 | void onPointerDown(PointerEvent ev); 26 | void onPointerUp(PointerEvent ev); 27 | } 28 | */ 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /GTFO_VR/Core/UI/Terminal/Pointer/PointerHistory.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | 4 | namespace GTFO_VR.Core.UI.Terminal.Pointer 5 | { 6 | 7 | /// 8 | /// Keeps track of a pointer position for a few frames in order to smoothen its position 9 | /// 10 | public class PointerHistory 11 | { 12 | private static readonly int POINTER_SMOOTHING_COUNT = 5; 13 | private Queue m_pointerHistory = new Queue(); 14 | 15 | public void AddPointerHistory(Vector3 position) 16 | { 17 | m_pointerHistory.Enqueue(position); 18 | if (m_pointerHistory.Count >= POINTER_SMOOTHING_COUNT) 19 | { 20 | m_pointerHistory.Dequeue(); 21 | } 22 | } 23 | 24 | public Vector3 GetSmoothenedPointerPosition() 25 | { 26 | Vector3 smoothed = Vector3.zero; 27 | int count = 0; 28 | foreach (Vector3 position in m_pointerHistory) 29 | { 30 | smoothed += position; 31 | count++; 32 | } 33 | 34 | if (count <= 0) // Just incase 35 | return smoothed; 36 | 37 | return smoothed / count; 38 | } 39 | 40 | public void ClearPointerHistory() 41 | { 42 | m_pointerHistory.Clear(); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /GTFO_VR/Core/UI/Terminal/TerminalKeyboardCanvas.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core.UI.Terminal.KeyboardDefinition; 2 | using Il2CppInterop.Runtime.Attributes; 3 | using System; 4 | using UnityEngine; 5 | using UnityEngine.UI; 6 | 7 | namespace GTFO_VR.Core.UI.Terminal 8 | { 9 | 10 | 11 | /// 12 | /// Holder canvas for each section of the terminal keyboard 13 | /// 14 | public class TerminalKeyboardCanvas : MonoBehaviour 15 | { 16 | private UnityEngine.Canvas m_canvas; 17 | 18 | public TerminalKeyboardCanvas(IntPtr value) : base(value) { } 19 | 20 | public static TerminalKeyboardCanvas Instantiate(GameObject go, float width, float height, TextAnchor gravity) 21 | { 22 | TerminalKeyboardCanvas canvas = go.AddComponent(); 23 | 24 | canvas.transform.localPosition = new Vector3(); 25 | canvas.transform.localRotation = new Quaternion(); 26 | canvas.transform.localScale = new Vector3(TerminalKeyboardInterface.CANVAS_SCALE, 27 | TerminalKeyboardInterface.CANVAS_SCALE, 28 | TerminalKeyboardInterface.CANVAS_SCALE); 29 | 30 | canvas.m_canvas = go.AddComponent(); 31 | canvas.m_canvas.renderMode = RenderMode.WorldSpace; 32 | 33 | RectTransform rect = go.GetComponent(); 34 | rect.sizeDelta = new Vector2(width, height); 35 | 36 | // Needed to make the child respect its own layout element 37 | VerticalLayoutGroup layoutGroup = go.AddComponent(); 38 | layoutGroup.childAlignment = gravity; 39 | layoutGroup.childForceExpandHeight = false; 40 | layoutGroup.childForceExpandWidth = false; 41 | 42 | return canvas; 43 | } 44 | 45 | [HideFromIl2Cpp] 46 | public void InflateLayout(TerminalKeyboardInterface keyboardRoot, KeyboardLayout layout, KeyboardStyle style) 47 | { 48 | GameObject child = layout.GenerateLayout(keyboardRoot, style); 49 | 50 | // Canvas should only have a single child 51 | child.transform.SetParent(this.transform, false); 52 | child.GetComponent().sizeDelta = this.gameObject.GetComponent().sizeDelta; 53 | } 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /GTFO_VR/Core/VR_Input/HandType.cs: -------------------------------------------------------------------------------- 1 | namespace GTFO_VR.Core.VR_Input 2 | { 3 | public enum HandType 4 | { 5 | Left, 6 | Right 7 | } 8 | 9 | public enum InteractionHand 10 | { 11 | Offhand, 12 | MainHand 13 | } 14 | } -------------------------------------------------------------------------------- /GTFO_VR/Core/VR_Input/TrackingType.cs: -------------------------------------------------------------------------------- 1 | namespace GTFO_VR.Core.VR_Input 2 | { 3 | public enum TrackingType 4 | { 5 | Rotation, 6 | PositionAndRotation 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /GTFO_VR/Core/WeaponArchetypeVRData.VRWeaponData.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using Newtonsoft.Json; 3 | using System.Collections.Generic; 4 | 5 | namespace GTFO_VR.Core 6 | { 7 | public static partial class WeaponArchetypeVRData 8 | { 9 | 10 | public class ProtubeHapticsData 11 | { 12 | [JsonProperty("KickPower")] 13 | public byte kickPower; 14 | [JsonProperty("RumblePower")] 15 | public byte rumblePower; 16 | [JsonProperty("RumbleDuration")] 17 | public float rumbleDuration; 18 | 19 | public ProtubeHapticsData(byte kickPower, byte rumblePower, float rumbleDuration) 20 | { 21 | this.kickPower = kickPower; 22 | this.rumblePower = rumblePower; 23 | this.rumbleDuration = rumbleDuration; 24 | } 25 | } 26 | 27 | public struct VRWeaponData 28 | { 29 | public Vector3 positonOffset; 30 | public bool allowsDoubleHanded; 31 | public Quaternion rotationOffset; 32 | public float scaleMultiplier; 33 | 34 | public VRWeaponData(Vector3 transformToGrip, bool doubleHandedAim) 35 | { 36 | positonOffset = transformToGrip; 37 | allowsDoubleHanded = doubleHandedAim; 38 | rotationOffset = Quaternion.identity; 39 | scaleMultiplier = 1.1f; 40 | } 41 | 42 | public VRWeaponData(Vector3 posToGripOffset, Quaternion rotationOffset, bool doubleHandedAim) 43 | { 44 | positonOffset = posToGripOffset; 45 | allowsDoubleHanded = doubleHandedAim; 46 | this.rotationOffset = rotationOffset; 47 | scaleMultiplier = 1.1f; 48 | } 49 | 50 | public VRWeaponData(Vector3 posToGripOffset,bool doubleHandedAim, float scaleMult) 51 | { 52 | positonOffset = posToGripOffset; 53 | allowsDoubleHanded = doubleHandedAim; 54 | this.rotationOffset = Quaternion.identity; 55 | scaleMultiplier = scaleMult; 56 | } 57 | 58 | public VRWeaponData(Vector3 posToGripOffset, Quaternion rotationOffset, bool doubleHandedAim, float scaleMult) 59 | { 60 | positonOffset = posToGripOffset; 61 | allowsDoubleHanded = doubleHandedAim; 62 | this.rotationOffset = rotationOffset; 63 | scaleMultiplier = scaleMult; 64 | } 65 | } 66 | 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /GTFO_VR/Detours/BioscannerDetours.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.InteropServices; 3 | using Gear; 4 | using UnityEngine; 5 | using GTFO_VR.Core.VR_Input; 6 | using GTFO_VR.Core; 7 | using Il2CppInterop.Runtime; 8 | using BepInEx.Unity.IL2CPP.Hook; 9 | using Il2CppInterop.Common; 10 | 11 | namespace GTFO_VR.Detours 12 | { 13 | 14 | /// 15 | /// Patches the bioscanner so the scanning works off of the gun's position instead of the camera's. 16 | /// 17 | public static class BioscannerDetours 18 | { 19 | public static Quaternion cachedControllerRotation = Quaternion.identity; 20 | public static bool inBioScannerFunction; 21 | 22 | // Will be garbage collected and cause hard crash unless referenced 23 | private static INativeDetour tryGetTaggableEnemiesDetour; 24 | private static INativeDetour get_rotation_InjectedDetour; 25 | 26 | public unsafe static void HookAll() 27 | { 28 | Log.Info("Patching bioscanner functions..."); 29 | 30 | var tryGetTaggableEnemiesPointer = *(IntPtr*)(IntPtr)Il2CppInteropUtils 31 | .GetIl2CppMethodInfoPointerFieldForGeneratedMethod(typeof(EnemyScanner).GetMethod(nameof(EnemyScanner.TryGetTaggableEnemies))) 32 | .GetValue(null); 33 | 34 | tryGetTaggableEnemiesDetour = INativeDetour.CreateAndApply(tryGetTaggableEnemiesPointer, 35 | OurScannerMethod, 36 | out OriginalScannerMethod); 37 | 38 | 39 | get_rotation_InjectedDetour = INativeDetour.CreateAndApply( 40 | IL2CPP.il2cpp_resolve_icall("UnityEngine.Transform::" + nameof(Transform.get_rotation_Injected)), 41 | OurGetRotation, out ourOriginalRotationGetter); 42 | 43 | } 44 | 45 | private unsafe static void OurGetRotation(IntPtr thisPtr, out Quaternion quat) 46 | { 47 | ourOriginalRotationGetter(thisPtr, out quat); 48 | if (inBioScannerFunction) 49 | { 50 | quat = cachedControllerRotation; 51 | } 52 | } 53 | 54 | private unsafe static bool OurScannerMethod(IntPtr thisPtr, int maxTags, bool onAim, out IntPtr enemies) 55 | { 56 | cachedControllerRotation = Controllers.GetControllerAimRotation(); 57 | inBioScannerFunction = true; 58 | // Always behave as if aiming or we will tag only single enemies 59 | bool result = OriginalScannerMethod(thisPtr, maxTags, false, out enemies); 60 | inBioScannerFunction = false; 61 | return result; 62 | } 63 | 64 | [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 65 | private unsafe delegate bool EnemyScannerDelegate(IntPtr thisPtr, int maxTaggable, bool onAim, out IntPtr enemies); 66 | 67 | private static EnemyScannerDelegate OriginalScannerMethod; 68 | 69 | 70 | [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 71 | private unsafe delegate void RotOutDelegate(IntPtr thisPtr, out Quaternion quat); 72 | 73 | private static RotOutDelegate ourOriginalRotationGetter; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /GTFO_VR/Detours/InjectPlayerHudEventsDetour.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.InteropServices; 3 | using Gear; 4 | using UnityEngine; 5 | using GTFO_VR.Core.VR_Input; 6 | using GTFO_VR.Core; 7 | using GTFO_VR.Events; 8 | using System.Reflection; 9 | using Unity.Jobs.LowLevel.Unsafe; 10 | using System.Linq; 11 | using BepInEx.Unity.IL2CPP.Hook; 12 | using Il2CppInterop.Common; 13 | 14 | namespace GTFO_VR.Detours 15 | { 16 | 17 | /// 18 | /// Patches the InjectPlayerHudEvents 19 | /// 20 | public static class InjectPlayerHudEventsDetour 21 | { 22 | private static ScreenLiquidSettingName[] splatTypes = { 23 | ScreenLiquidSettingName.enemyBlood_BigBloodBomb, 24 | ScreenLiquidSettingName.enemyBlood_SmallRandomStreak, 25 | ScreenLiquidSettingName.enemyBlood_Squirt, 26 | ScreenLiquidSettingName.spitterJizz, 27 | ScreenLiquidSettingName.shooterGoo, 28 | ScreenLiquidSettingName.anemoneGoo 29 | }; 30 | 31 | private static INativeDetour checkForOurSplatMethod; 32 | 33 | public unsafe static void HookAll() 34 | { 35 | Log.Info("Patching InjectPlayerHudEvents functions..."); 36 | 37 | // Couldn't get methodinfo via getMethod(), using getMethods() worked 38 | Type objType = typeof(GlassLiquidSystem); 39 | MethodInfo method = null; 40 | MethodInfo[] info = objType.GetMethods(BindingFlags.Public | BindingFlags.Instance); 41 | for (int i = 0; i < info.Length; i++) 42 | { 43 | if (info[i].Name == "Splat" && method is null) 44 | { 45 | method = info[i]; 46 | } 47 | } 48 | 49 | var tryGetSplatPointer = *(IntPtr*)(IntPtr)Il2CppInteropUtils 50 | .GetIl2CppMethodInfoPointerFieldForGeneratedMethod(method) 51 | .GetValue(null); 52 | 53 | checkForOurSplatMethod = INativeDetour.CreateAndApply(tryGetSplatPointer, 54 | OurSplatMethod, 55 | out OriginalSplatMethod); 56 | } 57 | 58 | private unsafe static void OurSplatMethod(IntPtr thisPtr, ref ScreenLiquidJob job, ref ScreenLiquidSetting setting) 59 | { 60 | OriginalSplatMethod(thisPtr, ref job, ref setting); 61 | if (splatTypes.Contains(job.setting)) 62 | { 63 | PlayerHudEvents.LiquidSplat(); 64 | } 65 | } 66 | 67 | [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 68 | private unsafe delegate void SplatDelegate(IntPtr thisPtr, ref ScreenLiquidJob job, ref ScreenLiquidSetting setting); 69 | 70 | private static SplatDelegate OriginalSplatMethod; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /GTFO_VR/Detours/TerminalInputDetours.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.InteropServices; 3 | using GTFO_VR.Core; 4 | using GTFO_VR.Core.VR_Input; 5 | using GTFO_VR.Core.UI.Terminal; 6 | using Il2CppInterop.Runtime; 7 | using BepInEx.Unity.IL2CPP.Hook; 8 | using MonoMod.RuntimeDetour; 9 | 10 | namespace GTFO_VR.Detours 11 | { 12 | /// 13 | /// Patches the terminal input so it also works with the VR keyboard. 14 | /// 15 | public static class TerminalInputDetours 16 | { 17 | // Will be garbage collected and cause hard crash unless referenced 18 | private static INativeDetour inputStringDetour; 19 | private static INativeDetour anyKeyDownDetour; 20 | 21 | public static void HookAll() 22 | { 23 | Log.Info($"Patching all terminal functions..."); 24 | 25 | inputStringDetour = INativeDetour.CreateAndApply(IL2CPP.il2cpp_resolve_icall("UnityEngine.Input::" + "get_inputString"), 26 | OurGetInputString, out originalInputStringGetter); 27 | 28 | anyKeyDownDetour = INativeDetour.CreateAndApply(IL2CPP.il2cpp_resolve_icall("UnityEngine.Input::" + "get_anyKeyDown"), 29 | OurGetAnyInput, out originalAnyInputDownGetter); 30 | 31 | } 32 | 33 | private unsafe static IntPtr OurGetInputString() 34 | { 35 | string input = IL2CPP.Il2CppStringToManaged(originalInputStringGetter()); 36 | IntPtr vr_input = IL2CPP.ManagedStringToIl2Cpp(VRKeyboard.GetKeyboardInput() + TerminalKeyboardInterface.GetKeyboardInput() + input); 37 | 38 | return vr_input; 39 | } 40 | 41 | private unsafe static bool OurGetAnyInput() 42 | { 43 | bool vr_input = VRKeyboard.GetKeyboardInput() != ""; 44 | return vr_input || TerminalKeyboardInterface.HasKeyboardInput() || originalAnyInputDownGetter(); 45 | } 46 | 47 | [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 48 | private unsafe delegate IntPtr StringGetter(); 49 | 50 | [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 51 | private unsafe delegate bool BoolGetter(); 52 | 53 | private static StringGetter originalInputStringGetter; 54 | 55 | private static BoolGetter originalAnyInputDownGetter; 56 | 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /GTFO_VR/Events/BackpackEvents.cs: -------------------------------------------------------------------------------- 1 | using Player; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace GTFO_VR.Events 9 | { 10 | public static class BackpackEvents 11 | { 12 | public static Action OnNewItemStatus; 13 | public static void SlotStatusChanged(InventorySlot slot, eInventoryItemStatus status) 14 | { 15 | OnNewItemStatus?.Invoke(slot, status); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /GTFO_VR/Events/ChatMsgEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace GTFO_VR.Events 8 | { 9 | public static class ChatMsgEvents 10 | { 11 | public static Action OnChatMsgReceived; 12 | public static void ChatMsgReceived(string msg) 13 | { 14 | OnChatMsgReceived?.Invoke(msg); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /GTFO_VR/Events/ElevatorEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | 4 | namespace GTFO_VR.Events 5 | { 6 | public static class ElevatorEvents 7 | { 8 | public static event Action OnElevatorPositionChanged; 9 | public static event Action OnElevatorStateChanged; 10 | public static event Action OnPreReleaseSequenceStarted; 11 | public static event Action OnPreReleaseSequenceSkipped; 12 | 13 | public static void ElevatorPositionChanged(Vector3 position) 14 | { 15 | OnElevatorPositionChanged?.Invoke(position); 16 | } 17 | 18 | public static void ElevatorStateChanged(ElevatorRideState state) 19 | { 20 | OnElevatorStateChanged?.Invoke(state); 21 | } 22 | 23 | public static void PreReleaseSequenceStarted() 24 | { 25 | OnPreReleaseSequenceStarted?.Invoke(); 26 | } 27 | 28 | public static void PreReleaseSequenceSkipped() 29 | { 30 | OnPreReleaseSequenceSkipped?.Invoke(); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /GTFO_VR/Events/FocusStateEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | 3 | namespace GTFO_VR.Events 4 | { 5 | /// 6 | /// Add event calls for focus state updates 7 | /// Focus states describe the current 'focus' context of the game --- InTerminal, Elevator, MainMenu etc. 8 | /// 9 | public static class FocusStateEvents 10 | { 11 | public static event FocusStateChange OnFocusStateChange; 12 | 13 | public delegate void FocusStateChange(eFocusState newState); 14 | 15 | public static eFocusState lastState = eFocusState.MainMenu; 16 | 17 | public static eFocusState currentState = eFocusState.MainMenu; 18 | 19 | public static void FocusChanged(eFocusState state) 20 | { 21 | if (OnFocusStateChange != null) 22 | { 23 | Log.Debug($"Switching to state {state}"); 24 | currentState = state; 25 | OnFocusStateChange.Invoke(state); 26 | lastState = state; 27 | } 28 | } 29 | 30 | public static bool IsInGame() 31 | { 32 | if (currentState.Equals(eFocusState.FPS) || currentState.Equals(eFocusState.InElevator)) 33 | { 34 | return true; 35 | } 36 | return false; 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /GTFO_VR/Events/GlueGunEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using UnityEngine; 7 | 8 | namespace GTFO_VR.Events 9 | { 10 | 11 | public static class GlueGunEvents 12 | { 13 | public static event Action OnPressureUpdate; 14 | 15 | public static void PressureBuilding(float pressure) 16 | { 17 | OnPressureUpdate?.Invoke(pressure); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /GTFO_VR/Events/HeldItemEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | using UnityEngine; 8 | 9 | namespace GTFO_VR.Events 10 | { 11 | public static class HeldItemEvents 12 | { 13 | public static event Action OnItemCharging; 14 | 15 | public static void ItemCharging(float progress) 16 | { 17 | OnItemCharging?.Invoke(progress); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /GTFO_VR/Events/InventoryAmmoEvents.cs: -------------------------------------------------------------------------------- 1 | using Player; 2 | 3 | namespace GTFO_VR.Events 4 | { 5 | /// 6 | /// Add event calls for ammo updates 7 | /// This is mainly used to update the VR watch UI. 8 | /// 9 | public static class InventoryAmmoEvents 10 | { 11 | public static event InventoryAmmoUpdate OnInventoryAmmoUpdate; 12 | 13 | public delegate void InventoryAmmoUpdate(InventorySlotAmmo item, int clipLeft); 14 | 15 | public static void AmmoUpdate(InventorySlotAmmo item, int clipleft) 16 | { 17 | if (OnInventoryAmmoUpdate != null) 18 | { 19 | OnInventoryAmmoUpdate.Invoke(item, clipleft); 20 | } 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /GTFO_VR/Events/ItemEquippableEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using UnityEngine; 3 | 4 | namespace GTFO_VR.Events 5 | { 6 | /// 7 | /// Add event calls for the player changing weapons/equipment. 8 | /// 9 | public static class ItemEquippableEvents 10 | { 11 | public static ItemEquippable currentItem; 12 | public static ItemEquippable lastWielded; 13 | 14 | public static event PlayerWieldItem OnPlayerWieldItem; 15 | 16 | public delegate void PlayerWieldItem(ItemEquippable item); 17 | 18 | public static void ItemEquipped(ItemEquippable item) 19 | { 20 | if (OnPlayerWieldItem != null && item.Owner.IsLocallyOwned) 21 | { 22 | lastWielded = currentItem; 23 | currentItem = item; 24 | Log.Debug("Item equip changed---"); 25 | Log.Debug(item.ArchetypeName); 26 | Log.Debug(item.PublicName); 27 | OnPlayerWieldItem.Invoke(item); 28 | 29 | if(currentItem.LeftHandGripTrans) 30 | { 31 | Log.Debug($"Distance from left hand align to origin = {Vector3.Distance(currentItem.LeftHandGripTrans.position, currentItem.transform.position)}"); 32 | } 33 | } 34 | } 35 | 36 | public static bool IsCurrentItemShootableWeapon() 37 | { 38 | return IsItemShootableWeapon(currentItem); 39 | 40 | } 41 | 42 | public static bool IsItemShootableWeapon(ItemEquippable item) 43 | { 44 | return item != null && item.IsWeapon && item.AmmoType != Player.AmmoType.None && item.HasFlashlight; 45 | } 46 | 47 | public static bool CurrentItemHasFlashlight() 48 | { 49 | return currentItem != null && currentItem.HasFlashlight; 50 | } 51 | 52 | public static Vector3 GetCorrectedGripPosition() 53 | { 54 | if (!currentItem) 55 | { 56 | Log.Warning("Trying to get grip position for null item!"); 57 | return Vector3.zero; 58 | } 59 | return GetCorrectedGripPosition(currentItem); 60 | } 61 | 62 | public static Vector3 GetCorrectedGripPosition(ItemEquippable item) 63 | { 64 | if (!currentItem.LeftHandGripTrans || !currentItem.MuzzleAlign) 65 | { 66 | Log.Warning("Trying to get grip position for null leftHandGripTrans or Muzzle!"); 67 | return Vector3.zero; 68 | } 69 | Vector3 offsetToGrip = item.LeftHandGripTrans.position - item.transform.position; 70 | Vector3 normalToMuzzle = (item.MuzzleAlign.transform.position - item.transform.position).normalized; 71 | 72 | return item.transform.position + Vector3.Project(offsetToGrip, normalToMuzzle) + normalToMuzzle * .1f; 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /GTFO_VR/Events/PlayerHudEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace GTFO_VR.Events 4 | { 5 | public static class PlayerHudEvents 6 | { 7 | public static event Action OnLiquidSplat; 8 | 9 | public static void LiquidSplat() 10 | { 11 | OnLiquidSplat?.Invoke(); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /GTFO_VR/Events/PlayerInteractionEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Player; 3 | using ChainedPuzzles; 4 | using Il2CppSystem.Collections.Generic; 5 | 6 | namespace GTFO_VR.Events 7 | { 8 | public static class PlayerInteractionEvents 9 | { 10 | public static event Action OnPlayerInteracted; 11 | public static event Action> OnBioscanSetState; 12 | 13 | public static void PlayerInteracted(LocalPlayerAgent source = null) 14 | { 15 | OnPlayerInteracted?.Invoke(source); 16 | } 17 | 18 | public static void SetBioscanState(eBioscanStatus status, float progress, List playersInScan) 19 | { 20 | OnBioscanSetState?.Invoke(status, progress, playersInScan); 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /GTFO_VR/Events/PlayerLocomotionEvents.cs: -------------------------------------------------------------------------------- 1 | using Player; 2 | using System; 3 | 4 | namespace GTFO_VR.Events 5 | { 6 | /// 7 | /// Add event calls for locomotion events 8 | /// This currently only needs to describe the player entering the ladder but might be expanded later depending on the game's needs. 9 | /// 10 | public static class PlayerLocomotionEvents 11 | { 12 | public static event Action OnPlayerEnterLadder; 13 | public static event Action OnStateChange; 14 | 15 | 16 | public static PlayerLocomotion.PLOC_State Current; 17 | 18 | public static void StateChanged(PlayerLocomotion.PLOC_State newState) 19 | { 20 | Current = newState; 21 | OnStateChange?.Invoke(newState); 22 | } 23 | 24 | public static void LadderEntered(LocalPlayerAgent owner) 25 | { 26 | if (OnPlayerEnterLadder != null && owner.IsLocallyOwned) 27 | { 28 | OnPlayerEnterLadder.Invoke(owner.Locomotion.CurrentLadder); 29 | } 30 | } 31 | 32 | internal static bool InControllablePLOCState() 33 | { 34 | return Current != PlayerLocomotion.PLOC_State.ClimbLadder && Current != PlayerLocomotion.PLOC_State.Downed && Current != PlayerLocomotion.PLOC_State.InElevator; 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /GTFO_VR/Events/PlayerReceivedDamageEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | 4 | namespace GTFO_VR.Events 5 | { 6 | 7 | public static class PlayerReceivedDamageEvents 8 | { 9 | public static event Action OnPlayerTakeDamage; 10 | public static event Action OnMineExplosion; 11 | 12 | public static void DamageTaken(float amount, Vector3 direction) 13 | { 14 | OnPlayerTakeDamage?.Invoke(amount, direction); 15 | } 16 | 17 | public static void MineExplosion(Vector3 position) 18 | { 19 | OnMineExplosion?.Invoke(position); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GTFO_VR/Events/PlayerReloadEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using UnityEngine; 7 | 8 | namespace GTFO_VR.Events 9 | { 10 | 11 | public static class PlayerReloadEvents 12 | { 13 | public static event Action OnPlayerReloaded; 14 | 15 | public static void WeaponReloaded() 16 | { 17 | OnPlayerReloaded?.Invoke(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /GTFO_VR/Events/PlayerTriggerReloadEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace GTFO_VR.Events 4 | { 5 | public static class PlayerTriggerReloadEvents 6 | { 7 | public static event Action OnTriggerWeaponReloaded; 8 | 9 | public static void TriggerWeaponReloaded() 10 | { 11 | OnTriggerWeaponReloaded?.Invoke(); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /GTFO_VR/Events/ResourceUpdatedEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace GTFO_VR.Events 4 | { 5 | public static class ResourceUpdatedEvents 6 | { 7 | public static event Action OnAmmoGained; 8 | public static event Action OnInfectionUpdated; 9 | public static event Action OnHealthUpdated; 10 | 11 | public static void AmmoGained(float ammoStandardRel, float ammoSpecialRel, float ammoClassRel) 12 | { 13 | OnAmmoGained?.Invoke(ammoStandardRel, ammoSpecialRel, ammoClassRel); 14 | } 15 | 16 | public static void InfectionUpdated(float infection) 17 | { 18 | OnInfectionUpdated?.Invoke(infection); 19 | } 20 | 21 | public static void HealthUpdated(float health) 22 | { 23 | OnHealthUpdated?.Invoke(health); 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /GTFO_VR/Events/TentacleAttackEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | using Agents; 4 | 5 | namespace GTFO_VR.Events 6 | { 7 | public static class TentacleAttackEvents 8 | { 9 | public static event Action OnTentacleAttack; 10 | 11 | public static void TentacleAttack(float amount, Agent sourceAgent, Vector3 position) 12 | { 13 | OnTentacleAttack?.Invoke(amount, sourceAgent, position); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /GTFO_VR/Events/VRMeleeWeaponEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace GTFO_VR.Events 9 | { 10 | class VRMeleeWeaponEvents 11 | { 12 | public static event Action OnHammerSmack; 13 | public static event Action OnHammerFullyCharged; 14 | public static event Action OnHammerHalfCharged; 15 | 16 | 17 | public static void HammerSmacked(float damage) 18 | { 19 | OnHammerSmack?.Invoke(damage); 20 | } 21 | 22 | public static void HammerFullyCharged() 23 | { 24 | OnHammerFullyCharged?.Invoke(); 25 | } 26 | 27 | public static void HammerHalfCharged() 28 | { 29 | OnHammerHalfCharged?.Invoke(); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /GTFO_VR/Events/WeaponRecoilEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using UnityEngine; 7 | 8 | namespace GTFO_VR.Events 9 | { 10 | 11 | public static class PlayerFireWeaponEvents 12 | { 13 | public static event Action OnPlayerFireWeapon; 14 | 15 | public static void WeaponFired(Weapon weapon) 16 | { 17 | OnPlayerFireWeapon?.Invoke(weapon); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectBackpackEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | using Player; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | 10 | namespace GTFO_VR.Injections.Events 11 | { 12 | [HarmonyPatch(typeof(PlayerBackpack), nameof(PlayerBackpack.UpdateItemStatus))] 13 | internal class InjectBackpackEvents 14 | { 15 | private static void Postfix(PlayerBackpack __instance, InventorySlot slot, eInventoryItemStatus status) 16 | { 17 | if(__instance.IsLocal) 18 | { 19 | BackpackEvents.SlotStatusChanged(slot, status); 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectElevatorEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | using UnityEngine; 4 | 5 | namespace GTFO_VR.Injections.Events 6 | { 7 | /// 8 | /// Add event calls for elevator sequence 9 | /// 10 | 11 | [HarmonyPatch(typeof(ElevatorRide), nameof(ElevatorRide.Update))] 12 | internal class InjectElevatorRideUpdateEvents 13 | { 14 | private static ElevatorRideState m_previousElevatorRideState; 15 | 16 | private static void Postfix(ElevatorRide __instance) 17 | { 18 | ElevatorRideState currentState = __instance.m_currentState; 19 | if (m_previousElevatorRideState != currentState) 20 | { 21 | m_previousElevatorRideState = currentState; 22 | ElevatorEvents.ElevatorStateChanged(currentState); 23 | } 24 | } 25 | } 26 | 27 | [HarmonyPatch(typeof(ElevatorCable), nameof(ElevatorCable.UpdateElevatorPos))] 28 | internal class InjectUpdateElevatorPosEvents 29 | { 30 | private static Vector3 m_previousPos; 31 | 32 | private static void Postfix(Vector3 pos) 33 | { 34 | if (pos != m_previousPos) 35 | { 36 | ElevatorEvents.ElevatorPositionChanged(pos); 37 | m_previousPos = pos; 38 | } 39 | } 40 | } 41 | 42 | [HarmonyPatch(typeof(ElevatorCage), nameof(ElevatorCage.StartPreReleaseSequence))] 43 | internal class InjectElevator2StartPreReleaseEvents 44 | { 45 | private static void Postfix() 46 | { 47 | ElevatorEvents.PreReleaseSequenceStarted(); 48 | } 49 | } 50 | 51 | [HarmonyPatch(typeof(ElevatorCage), nameof(ElevatorCage.SkipPreReleaseSequence))] 52 | internal class InjectElevator2SkipPreReleaseEvents 53 | { 54 | private static void Postfix() 55 | { 56 | ElevatorEvents.PreReleaseSequenceSkipped(); 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectFocusStateEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | 4 | namespace GTFO_VR.Injections.Events 5 | { 6 | /// 7 | /// Inject event calls for focus state updates 8 | /// Focus states describe the current 'focus' context of the game --- InTerminal, Elevator, MainMenu etc. 9 | /// 10 | 11 | [HarmonyPatch(typeof(InputMapper), nameof(InputMapper.OnFocusStateChanged))] 12 | internal class InjectFocusStateEvents 13 | { 14 | private static void Prefix(eFocusState state) 15 | { 16 | FocusStateEvents.FocusChanged(state); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectGlueGunEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | using UnityEngine; 4 | 5 | namespace GTFO_VR.Injections.Events 6 | { 7 | /// 8 | /// Add event calls for Cfoam launcher for haptics 9 | /// 10 | 11 | [HarmonyPatch(typeof(GlueGun), nameof(GlueGun.UpdateLocal))] 12 | internal class InjectGlueGunPressureEvents 13 | { 14 | private static void Postfix(GlueGun __instance) 15 | { 16 | if(__instance.Owner.IsLocallyOwned) 17 | { 18 | if(__instance.m_pressure > 0.01f) 19 | { 20 | GlueGunEvents.PressureBuilding(__instance.m_pressure); 21 | } 22 | } 23 | } 24 | } 25 | 26 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectHeldItemEvents.cs: -------------------------------------------------------------------------------- 1 | using Gear; 2 | using GTFO_VR.Events; 3 | using HarmonyLib; 4 | using UnityEngine; 5 | 6 | namespace GTFO_VR.Injections.Events 7 | { 8 | /// 9 | /// Add misc. event calls for held items 10 | /// 11 | 12 | [HarmonyPatch(typeof(CrosshairGuiLayer), nameof(CrosshairGuiLayer.SetChargeUpVisibleAndProgress))] 13 | internal class InjectHeldItemEvents 14 | { 15 | private static void Postfix(bool visible, float progress) 16 | { 17 | if(visible) 18 | { 19 | HeldItemEvents.ItemCharging(progress); 20 | } 21 | } 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectInventoryAmmoUpdateEvent.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | using Player; 4 | 5 | namespace GTFO_VR.Injections.Events 6 | { 7 | /// 8 | /// Add event calls for changes in ammo 9 | /// 10 | 11 | [HarmonyPatch(typeof(PlayerAmmoStorage), nameof(PlayerAmmoStorage.UpdateSlotAmmoUI), new[] { typeof(InventorySlotAmmo), typeof(int) })] 12 | internal class InjectInventoryAmmoUpdateEvent 13 | { 14 | private static void Postfix(PlayerAmmoStorage __instance, InventorySlotAmmo ammo, int clip) 15 | { 16 | if (__instance.m_playerBackpack.IsLocal) 17 | { 18 | InventoryAmmoEvents.AmmoUpdate(ammo, clip); 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectItemEquippableEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | 4 | namespace GTFO_VR.Injections.Events 5 | { 6 | /// 7 | /// Add event calls for item equips 8 | /// 9 | 10 | [HarmonyPatch(typeof(ItemEquippable), nameof(ItemEquippable.OnWield))] 11 | internal class InjectItemEquippableEvents 12 | { 13 | private static void Postfix(ItemEquippable __instance) 14 | { 15 | ItemEquippableEvents.ItemEquipped(__instance); 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectLadderPLOCEvent.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | using Player; 4 | 5 | namespace GTFO_VR.Injections.Events 6 | { 7 | /// 8 | /// Add event calls for entering ladders (need to re-orient the player and playspace, etc.) 9 | /// 10 | 11 | [HarmonyPatch(typeof(PLOC_ClimbLadder), nameof(PLOC_ClimbLadder.Enter))] 12 | internal class InjectLadderPLOCEvent 13 | { 14 | private static void Postfix(PLOC_ClimbLadder __instance) 15 | { 16 | if(__instance.m_owner.IsLocallyOwned) 17 | { 18 | PlayerLocomotionEvents.LadderEntered(__instance.m_owner.Cast()); 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectPLOCEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | using Player; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | 10 | namespace GTFO_VR.Injections.Events 11 | { 12 | [HarmonyPatch(typeof(PlayerLocomotion), nameof(PlayerLocomotion.ChangeState))] 13 | internal class InjectPLOCEvents 14 | { 15 | private static void Postfix(PlayerLocomotion __instance, PlayerLocomotion.PLOC_State state, bool wasWarpedIntoState = false) 16 | { 17 | if(!__instance.m_owner.IsLocallyOwned) 18 | { 19 | return; 20 | } 21 | PlayerLocomotionEvents.StateChanged(state); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectPlayerDamageEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | using UnityEngine; 4 | 5 | namespace GTFO_VR.Injections.Events 6 | { 7 | /// 8 | /// Add event calls for the player taking damage 9 | /// 10 | 11 | [HarmonyPatch(typeof(Dam_PlayerDamageLocal), nameof(Dam_PlayerDamageLocal.Hitreact))] 12 | internal class InjectPlayerDamageEvents 13 | { 14 | private static void Postfix(float damage, Vector3 direction) 15 | { 16 | PlayerReceivedDamageEvents.DamageTaken(damage, direction); 17 | } 18 | } 19 | 20 | [HarmonyPatch(typeof(MineDeployerInstance_Detonate_Explosive), nameof(MineDeployerInstance_Detonate_Explosive.DoExplode))] 21 | internal class InjectMineExplosionEvents 22 | { 23 | private static void Postfix(MineDeployerInstance_Detonate_Explosive __instance) 24 | { 25 | PlayerReceivedDamageEvents.MineExplosion(__instance.transform.position); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectPlayerInteractionEvents.cs: -------------------------------------------------------------------------------- 1 | using HarmonyLib; 2 | using LevelGeneration; 3 | using GTFO_VR.Events; 4 | using Player; 5 | using ChainedPuzzles; 6 | using Il2CppSystem.Collections.Generic; 7 | 8 | namespace GTFO_VR.Injections.Events 9 | { 10 | /// 11 | /// Add event calls for player interactions 12 | /// 13 | 14 | [HarmonyPatch(typeof(LG_DoorButton), nameof(LG_DoorButton.Interact))] 15 | internal class InjectDoorButtonInteract 16 | { 17 | private static void Postfix(LocalPlayerAgent source) 18 | { 19 | PlayerInteractionEvents.PlayerInteracted(source); 20 | } 21 | } 22 | 23 | [HarmonyPatch(typeof(PUI_InteractionPrompt), nameof(PUI_InteractionPrompt.SetTimerFill))] 24 | internal class InjectTimerFilledInteract 25 | { 26 | private static void Postfix(float fill) 27 | { 28 | if (fill >= 1.0f) 29 | { 30 | PlayerInteractionEvents.PlayerInteracted(); 31 | } 32 | } 33 | } 34 | 35 | [HarmonyPatch(typeof(CP_Bioscan_Sync), nameof(CP_Bioscan_Sync.SetStateData))] 36 | internal class InjectBioscanStateInteract 37 | { 38 | private static void Postfix(eBioscanStatus status, float progress, List playersInScan) 39 | { 40 | PlayerInteractionEvents.SetBioscanState(status, progress, playersInScan); 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectPlayerReloadEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | using UnityEngine; 4 | 5 | namespace GTFO_VR.Injections.Events 6 | { 7 | /// 8 | /// Add event calls for the player reloading weapons 9 | /// 10 | 11 | [HarmonyPatch(typeof(PlayerInventoryLocal), nameof(PlayerInventoryLocal.DoReload))] 12 | internal class InjectPlayerReloadEvents 13 | { 14 | private static void Postfix(PlayerInventoryLocal __instance) 15 | { 16 | if(__instance.m_wieldedItem != null) 17 | { 18 | PlayerReloadEvents.WeaponReloaded(); 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectPlayerTriggerReloadEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | 4 | namespace GTFO_VR.Injections.Events 5 | { 6 | /// 7 | /// Add event calls for the player starting to reload weapons 8 | /// 9 | 10 | [HarmonyPatch(typeof(PlayerInventoryLocal), nameof(PlayerInventoryLocal.TriggerReload))] 11 | internal class InjectPlayerTriggerReloadEvents 12 | { 13 | private static void Postfix(PlayerInventoryLocal __instance) 14 | { 15 | if (__instance.m_wieldedItem != null) 16 | { 17 | PlayerTriggerReloadEvents.TriggerWeaponReloaded(); 18 | } 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectPlayerWeaponFireEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | using UnityEngine; 4 | 5 | namespace GTFO_VR.Injections.Events 6 | { 7 | /// 8 | /// Add event calls for the player shooting weapons 9 | /// 10 | 11 | [HarmonyPatch(typeof(Weapon), nameof(Weapon.ApplyRecoil))] 12 | internal class InjectPlayerWeaponFireEvents 13 | { 14 | private static void Postfix(Weapon __instance) 15 | { 16 | if(__instance.Owner.IsLocallyOwned) 17 | { 18 | PlayerFireWeaponEvents.WeaponFired(__instance); 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectResourceGainEvent.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | using Player; 4 | 5 | namespace GTFO_VR.Injections.Events 6 | { 7 | /// 8 | /// Add event calls for player resource gains 9 | /// 10 | 11 | [HarmonyPatch(typeof(PlayerBackpackManager), nameof(PlayerBackpackManager.ReceiveAmmoGive))] 12 | internal class InjectGiveAmmoEvent 13 | { 14 | private static void Postfix(pAmmoGive data) 15 | { 16 | if (!data.targetPlayer.TryGetPlayer(out var player) || player.IsLocal) 17 | { 18 | ResourceUpdatedEvents.AmmoGained(data.ammoStandardRel, data.ammoSpecialRel, data.ammoClassRel); 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Events/InjectTentacleAttackEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | using UnityEngine; 4 | using Agents; 5 | 6 | namespace GTFO_VR.Injections.Events 7 | { 8 | /// 9 | /// Add event calls for player receiving damage from a tentacle attack 10 | /// 11 | 12 | [HarmonyPatch(typeof(Dam_SyncedDamageBase), nameof(Dam_SyncedDamageBase.TentacleAttackDamage))] 13 | internal class InjectTentacleAttackEvents 14 | { 15 | private static void Postfix(float dam, Agent sourceAgent, Vector3 position) 16 | { 17 | TentacleAttackEvents.TentacleAttack(dam, sourceAgent, position); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/GameHooks/InjectInteractionPromptRef.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.UI; 2 | using HarmonyLib; 3 | 4 | namespace GTFO_VR.Injections.GameHooks 5 | { 6 | /// 7 | /// Get references for 8 | /// 9 | [HarmonyPatch(typeof(InteractionGuiLayer), nameof(InteractionGuiLayer.Setup))] 10 | internal class InjectInteractionPromptRef 11 | { 12 | private static void Postfix(InteractionGuiLayer __instance) 13 | { 14 | VRWorldSpaceUI.SetInteractionPromptRef(__instance.m_message, __instance.m_interactPrompt, __instance); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/GameHooks/InjectPlayerAgentRef.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using HarmonyLib; 3 | using Player; 4 | using System; 5 | 6 | namespace GTFO_VR.Injections.GameHooks 7 | { 8 | /// 9 | /// Get local player reference 10 | /// 11 | 12 | [HarmonyPatch(typeof(FPSCamera), nameof(FPSCamera.Setup))] 13 | [HarmonyPatch(new Type[] { typeof(LocalPlayerAgent) })] 14 | internal class InjectGetLocalPlayerAgentRef 15 | { 16 | private static void Postfix(FPSCamera __instance, LocalPlayerAgent owner) 17 | { 18 | VRSystems.OnPlayerSpawned(__instance, owner); 19 | } 20 | } 21 | 22 | /// 23 | /// Some events like checkpoints are hard to properly handle in events. That's why we use this hack to reset the VR player if necessary. 24 | /// 25 | [HarmonyPatch(typeof(LocalPlayerAgent), nameof(LocalPlayerAgent.Update))] 26 | internal class InjectLocalPlayerAgentHeartbeat 27 | { 28 | private static void Postfix(LocalPlayerAgent __instance) 29 | { 30 | VRSystems.Heartbeat(__instance); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/GameHooks/InjectPlayerGUIRef.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.UI; 2 | using HarmonyLib; 3 | 4 | namespace GTFO_VR.Injections.GameHooks 5 | { 6 | /// 7 | /// Get references to UI components we want to put into world space 8 | /// 9 | [HarmonyPatch(typeof(PlayerGuiLayer), nameof(PlayerGuiLayer.Setup))] 10 | internal class InjectPlayerGUIRef 11 | { 12 | private static void Postfix(PlayerGuiLayer __instance) 13 | { 14 | VRWorldSpaceUI.SetPlayerGUIRef(__instance, __instance.m_compass, __instance.m_wardenIntel, __instance.m_objectiveTimer, __instance.m_subtitles); 15 | __instance.m_compass.transform.localScale *= .75f; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/GameHooks/InjectVRStart.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using HarmonyLib; 3 | using UnityEngine; 4 | 5 | namespace GTFO_VR.Injections.GameHooks 6 | { 7 | /// 8 | /// Injection point for all things VR 9 | /// 10 | /// 11 | [HarmonyPatch(typeof(GuiManager), nameof(GuiManager.Setup))] 12 | internal class InjectVRStart 13 | { 14 | private static void Postfix(GuiManager __instance) 15 | { 16 | __instance.m_resolutionCheckActive = false; 17 | if (!VRSystems.Current) 18 | { 19 | new GameObject("VR_Globals").AddComponent(); 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /GTFO_VR/Injections/Gameplay/InjectBioscannerFixes.cs: -------------------------------------------------------------------------------- 1 | using Gear; 2 | using GTFO_VR.Core.VR_Input; 3 | using HarmonyLib; 4 | using UnityEngine; 5 | 6 | namespace GTFO_VR.Injections.Gameplay 7 | { 8 | /// 9 | /// Makes Bioscanner render camera work off of gun pos/rot instead of player pos/rot 10 | /// 11 | [HarmonyPatch(typeof(EnemyScannerGraphics), nameof(EnemyScannerGraphics.UpdateCameraOrientation))] 12 | internal class InjectRenderBioScannerOffAimDir 13 | { 14 | private static void Prefix(ref Vector3 position, ref Vector3 forward) 15 | { 16 | position = Controllers.GetAimFromPos(); 17 | forward = Controllers.GetAimForward(); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Gameplay/InjectCrouchHeight.cs: -------------------------------------------------------------------------------- 1 | using HarmonyLib; 2 | using Player; 3 | using UnityEngine; 4 | 5 | namespace GTFO_VR.Injections.Gameplay 6 | { 7 | /// 8 | /// Makes the first person items follow the position and aim direction of the main controller(s) of the player 9 | /// 10 | [HarmonyPatch(typeof(PlayerCharacterController), nameof(PlayerCharacterController.SetColliderCrouched))] 11 | internal class InjectCrouchPopFix 12 | { 13 | private static bool Prefix(PlayerCharacterController __instance, bool crouched) 14 | { 15 | if (__instance.m_characterController == null || __instance.m_owner == null || __instance.m_owner.IsBeingDespawned) 16 | return false; 17 | if (crouched) 18 | { 19 | __instance.m_characterController.height = __instance.m_collCrouchHeight; 20 | __instance.m_characterController.center = new Vector3(0.0f, __instance.m_collCrouchHeight * 0.5f, 0.0f); 21 | } 22 | else 23 | { 24 | __instance.m_characterController.height = __instance.m_collStandHeight; 25 | __instance.m_characterController.center = new Vector3(0.0f, __instance.m_collStandHeight * 0.5f, 0.0f); 26 | } 27 | 28 | return false; 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Gameplay/InjectDisableHipFireAimSpreadInVR.cs: -------------------------------------------------------------------------------- 1 | using Gear; 2 | using GTFO_VR.Core; 3 | using GTFO_VR.Core.VR_Input; 4 | using HarmonyLib; 5 | 6 | namespace GTFO_VR.Injections.Gameplay 7 | { 8 | /// 9 | /// Handle weapon accuracy for double handed aiming/firing 'from the hip'. 10 | /// If a weapon is fired from the hip it will have greater spread unless double handed aiming is disabled. 11 | /// 12 | 13 | [HarmonyPatch(typeof(BulletWeapon), nameof(BulletWeapon.Fire))] 14 | internal class InjectAimSpreadInVR 15 | { 16 | private static void Prefix(BulletWeapon __instance) 17 | { 18 | if (Controllers.IsFiringFromADS()) 19 | { 20 | __instance.FPItemHolder.ItemAimTrigger = true; 21 | } 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Gameplay/InjectDisablePlayerMoveTo.cs: -------------------------------------------------------------------------------- 1 | using HarmonyLib; 2 | using Player; 3 | 4 | namespace GTFO_VR.Injections.Gameplay 5 | { 6 | /// 7 | /// Game will attempt to move player closer to terminal, but uses camera forward and sends you sliding off to the side. Disable when in terminal. 8 | /// 9 | /// 10 | [HarmonyPatch(typeof(PlayerCharacterController), nameof(PlayerCharacterController.MoveTo))] 11 | internal class InjectExternalForce 12 | { 13 | private static bool Prefix(PlayerCharacterController __instance) 14 | { 15 | 16 | if (__instance.m_owner.IsLocallyOwned && FocusStateManager.CurrentState == eFocusState.ComputerTerminal) 17 | { 18 | return false; 19 | } 20 | return true; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Gameplay/InjectDisableRecoilCameraOffset.cs: -------------------------------------------------------------------------------- 1 | using HarmonyLib; 2 | using UnityEngine; 3 | 4 | namespace GTFO_VR.Injections.Gameplay 5 | { 6 | /// 7 | /// Disables weapon recoil impacting the camera. 8 | /// 9 | 10 | [HarmonyPatch(typeof(FPSCamera), nameof(FPSCamera.RotationUpdate))] 11 | internal class InjectDisableRecoilOnCameraApply 12 | { 13 | private static void Prefix(FPSCamera __instance) 14 | { 15 | __instance.m_recoilSystem.m_hasOverrideParentRotation = false; 16 | } 17 | } 18 | 19 | [HarmonyPatch(typeof(FPS_RecoilSystem), nameof(FPS_RecoilSystem.FPS_Update))] 20 | internal class InjectDisableRecoilOnCamera 21 | { 22 | private static void Postfix(FPS_RecoilSystem __instance) 23 | { 24 | __instance.transform.localEulerAngles = Vector3.zero; 25 | Shader.SetGlobalVector(__instance.m_FPS_SightOffset_PropertyID, Vector4.zero); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Gameplay/InjectFireFromMuzzle.cs: -------------------------------------------------------------------------------- 1 | using Gear; 2 | using HarmonyLib; 3 | using UnityEngine; 4 | 5 | namespace GTFO_VR.Injections.Gameplay 6 | { 7 | /// 8 | /// Makes weapons fire from the muzzle of the weapon instead of the camera. 9 | /// TODO: Remove. Base-game logic already does this now, probably reundant. 10 | /// 11 | [HarmonyPatch(typeof(BulletWeapon), nameof(BulletWeapon.Fire))] 12 | internal class InjectFireFromWeaponMuzzle 13 | { 14 | private static Vector3 cachedPosition = Vector3.zero; 15 | private static Vector3 cachedLookPosition = Vector3.zero; 16 | 17 | private static void Prefix(BulletWeapon __instance) 18 | { 19 | cachedPosition = __instance.Owner.FPSCamera.Position; 20 | cachedLookPosition = __instance.Owner.FPSCamera.CameraRayPos; 21 | __instance.Owner.FPSCamera.Position = __instance.MuzzleAlign.position; 22 | __instance.Owner.FPSCamera.CameraRayPos = __instance.MuzzleAlign.position + __instance.MuzzleAlign.forward * 50f; 23 | } 24 | 25 | private static void Postfix(BulletWeapon __instance) 26 | { 27 | __instance.Owner.FPSCamera.Position = cachedPosition; 28 | __instance.Owner.FPSCamera.CameraRayPos = cachedLookPosition; 29 | } 30 | } 31 | 32 | /// 33 | /// Makes shotgun-typw weapons fire from the muzzle of the weapon instead of the camera. 34 | /// FPSCamera itself has an empty transform, and is moved by its parent transforms. 35 | /// The transform of FPSCameraRotation sandwiched between the holder and the camera is used for Shotgun pewpew. 36 | /// 37 | [HarmonyPatch(typeof(Shotgun), nameof(Shotgun.Fire))] 38 | internal class InjectFireFromShotgunWeaponMuzzle 39 | { 40 | private static Vector3 cachedCamRotPosition = Vector3.zero; 41 | private static Quaternion cachedCamRotRotation = Quaternion.identity; 42 | 43 | private static void Prefix(Shotgun __instance) 44 | { 45 | Transform camRotation = __instance.Owner.FPSCamera.transform.parent; 46 | 47 | cachedCamRotPosition = camRotation.transform.position; 48 | cachedCamRotRotation = camRotation.transform.rotation; 49 | camRotation.transform.position = __instance.MuzzleAlign.position; 50 | camRotation.transform.rotation = __instance.MuzzleAlign.rotation; 51 | } 52 | 53 | private static void Postfix(Shotgun __instance) 54 | { 55 | Transform camRotation = __instance.Owner.FPSCamera.transform.parent; 56 | 57 | camRotation.position = cachedCamRotPosition; 58 | camRotation.rotation = cachedCamRotRotation; 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /GTFO_VR/Injections/Gameplay/InjectHMDMovement.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using GTFO_VR.Core.VR_Input; 3 | using HarmonyLib; 4 | using UnityEngine; 5 | 6 | /// 7 | /// Patch methods responsible for handling camera rotation and position and sync them to the HMD input 8 | /// Note: This does sync correctly in multiplayer because we use (more or less) the same pathways as mouse and gamepad input. 9 | /// The exception being lookDir while holding a weapon with a flashlight, which needs to be synced differently. 10 | /// 11 | 12 | namespace GTFO_VR.Injections.Gameplay 13 | { 14 | // Patch position as raw HMD pos + player body position offset, everything is kept in world coords where possible 15 | [HarmonyPatch(typeof(FPSCamera), nameof(FPSCamera.RotationUpdate))] 16 | internal class InjectHMDPosition 17 | { 18 | private static void Prefix(FPSCamera __instance) 19 | { 20 | Vector3 euler = HMD.GetVRCameraEulerRelativeToFPSCameraParent(); 21 | __instance.m_pitch = euler.x; 22 | __instance.m_yaw = euler.y; 23 | } 24 | } 25 | 26 | // We inject pitch and yaw rotation data into the same method where mouse and gamepad input is being handled 27 | // This way lookDirection gets synced correctly to other players in multiplayer 28 | 29 | [HarmonyPatch(typeof(FPSCamera), nameof(FPSCamera.UpdatePosOffset))] 30 | internal class InjectHMDRotationPitchYaw 31 | { 32 | private static void Postfix(FPSCamera __instance) 33 | { 34 | // Repeat position inject or the transforms will get out of sync (Unity transform handling mumbo jumbo ensues, frame later or frame behind tracking) 35 | if (!FocusStateManager.CurrentState.Equals(eFocusState.InElevator)) 36 | { 37 | __instance.Position = HMD.GetWorldPosition(); 38 | } 39 | 40 | Vector3 euler = HMD.GetVRCameraEulerRelativeToFPSCameraParent(); 41 | __instance.m_pitch = euler.x; 42 | __instance.m_yaw = euler.y; 43 | } 44 | } 45 | 46 | [HarmonyPatch(typeof(FPSCamera), nameof(FPSCamera.RotationUpdate))] 47 | internal class InjectHMDRotationRoll 48 | { 49 | private static void Postfix(FPSCamera __instance) 50 | { 51 | if (!FocusStateManager.CurrentState.Equals(eFocusState.InElevator)) 52 | { 53 | __instance.Position = HMD.GetWorldPosition(); 54 | } 55 | 56 | Vector3 euler = __instance.m_camera.transform.parent.localEulerAngles; 57 | euler.z = HMD.GetVRCameraEulerRelativeToFPSCameraParent().z; 58 | __instance.m_camera.transform.parent.localRotation = Quaternion.Euler(euler); 59 | __instance.UpdateFlatTransform(); 60 | } 61 | } 62 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Gameplay/InjectMuzzleAlignCorrection.cs: -------------------------------------------------------------------------------- 1 | using HarmonyLib; 2 | using UnityEngine; 3 | using Gear; 4 | 5 | 6 | namespace GTFO_VR.Injections.Gameplay 7 | { 8 | /// 9 | /// Adjust the muzzle align to be where it should be on certain broken weapons 10 | /// 11 | [HarmonyPatch(typeof(BulletWeapon), nameof(BulletWeapon.SetupArchetype))] 12 | internal class InjectMuzzleAlignCorrection 13 | { 14 | private static void Postfix(BulletWeapon __instance) 15 | { 16 | // Accrat ND6 Heavy SMG 17 | if ("ACCRAT ND6".Equals(__instance.PublicName.ToUpper()) || "DREKKER CLR".Equals(__instance.PublicName.ToUpper())) 18 | { 19 | Transform muzzleAlign = __instance.MuzzleAlign; 20 | Transform animationRef = muzzleAlign.parent; // This is keyframed with an incorrect rotation, 21 | // so we can't just adjust it directly 22 | 23 | // Put muzzle align in a container positioned at origin of parent 24 | GameObject muzzleContainer = new GameObject("muzzleContainer"); 25 | muzzleContainer.transform.SetParentAtZero(animationRef); 26 | muzzleAlign.transform.SetParent(muzzleContainer.transform); 27 | 28 | // Apply inverse rotation of parent to align muzzle 29 | muzzleContainer.transform.localRotation = Quaternion.Inverse(animationRef.transform.localRotation); 30 | 31 | // Move container to parent so it doesn't get moved by animations 32 | muzzleContainer.transform.SetParent(animationRef.transform.parent); 33 | } 34 | 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Gameplay/InjectNoVRCamHIjack.cs: -------------------------------------------------------------------------------- 1 | using HarmonyLib; 2 | using System; 3 | using UnityEngine; 4 | 5 | namespace GTFO_VR.Injections.Gameplay 6 | { 7 | /// 8 | /// Make all camera transitions end instantly, we never want the player's control of the camera to be taken away 9 | /// 10 | /// 11 | [HarmonyPatch(typeof(FPSCamera), nameof(FPSCamera.StartTransition), new[] { typeof(Vector3), typeof(Quaternion), typeof(float), typeof(DelEasingFunction), typeof(DelEasingFunction), typeof(Il2CppSystem.Action) })] 12 | internal class InjectTransitionKill 13 | { 14 | private static void Prefix(FPSCamera __instance, Vector3 endPos, Quaternion endRot, ref float duration, DelEasingFunction easingPos, DelEasingFunction easingRot, Action onTransitionDone) 15 | { 16 | duration = 0f; 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Gameplay/InjectWeaponAimFlashlightAggro.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using GTFO_VR.Core.PlayerBehaviours; 3 | using GTFO_VR.Core.VR_Input; 4 | using GTFO_VR.Events; 5 | using HarmonyLib; 6 | using Player; 7 | using UnityEngine; 8 | 9 | namespace GTFO_VR.Injections.Gameplay 10 | { 11 | /// 12 | /// Change detection to use weapon flashlight direction (when you're the host or playing solo) 13 | /// 14 | [HarmonyPatch(typeof(PlayerAgent), nameof(PlayerAgent.GetDetectionMod))] 15 | internal class InjectWeaponAimFlashlightAggro 16 | { 17 | private static void Postfix(PlayerAgent __instance, Vector3 dir, float distance, ref float __result) 18 | { 19 | if(!VRConfig.configUseControllers.Value || !__instance.IsLocallyOwned) 20 | { 21 | return; 22 | } 23 | __result = VRDetectionMod(dir, distance, __instance.Inventory.m_flashlight.range, __instance.Inventory.m_flashlight.spotAngle); 24 | } 25 | 26 | // ToDO - Replace this with patch, hopefully 27 | public static float VRDetectionMod(Vector3 dir, float distance, float m_flashLightRange, float m_flashlight_spotAngle) 28 | { 29 | if (distance > m_flashLightRange) 30 | { 31 | return 0.0f; 32 | } 33 | Vector3 VRLookDir = HMD.GetWorldForward(); 34 | if (ItemEquippableEvents.CurrentItemHasFlashlight() && VRConfig.configUseControllers.Value) 35 | { 36 | VRLookDir = Controllers.GetAimForward(); 37 | } 38 | float angleDiff = Vector3.Angle(dir, -VRLookDir); 39 | float spotlightAngleSize = m_flashlight_spotAngle * 0.5f; 40 | if (angleDiff > spotlightAngleSize) 41 | return 0.0f; 42 | float distanceMultiplier = 1.0f - distance / m_flashLightRange; 43 | return Mathf.Min((1.0f - angleDiff / spotlightAngleSize) * distanceMultiplier, 0.2f); 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Input/InjectAimCursorWithVRControllerInOverlay.cs: -------------------------------------------------------------------------------- 1 | using CellMenu; 2 | using GTFO_VR.Core; 3 | using GTFO_VR.Core.UI; 4 | using HarmonyLib; 5 | using UnityEngine; 6 | 7 | namespace GTFO_VR.Injections.Input 8 | { 9 | /// 10 | /// Handles updating the cursor position based on the player's VR controllers within the overlay. 11 | /// 12 | 13 | [HarmonyPatch(typeof(CM_PageBase), nameof(CM_PageBase.UpdateCursorPosition))] 14 | internal class InjectAimCursorWithVRControllerInOverlay 15 | { 16 | private static void Prefix(CM_PageBase __instance) 17 | { 18 | if (VR_UI_Overlay.Current && VR_UI_Overlay.Current.GetPlayerPointingAtPositionOnScreen(out Vector2 newCursorPos) && VRConfig.configUseControllers.Value) 19 | { 20 | Vector2 res = __instance.m_screenResVec2; 21 | newCursorPos -= new Vector2(0.5f, 0.5f); 22 | newCursorPos.y *= -1f; 23 | newCursorPos *= res; 24 | CM_PageBase.m_cursorPos = newCursorPos; 25 | } 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Input/InjectFreeTheCursor.cs: -------------------------------------------------------------------------------- 1 | using CellMenu; 2 | using GTFO_VR.Core; 3 | using HarmonyLib; 4 | using UnityEngine; 5 | 6 | namespace GTFO_VR.Injections.Input 7 | { 8 | /// 9 | /// Unlocks cursor so steamVR desktop can be used freely 10 | /// 11 | 12 | [HarmonyPatch(typeof(InputMapper), nameof(InputMapper.OnFocusStateChanged))] 13 | internal class InjectFreeTheCursor 14 | { 15 | private static void Postfix() 16 | { 17 | if (!VRConfig.configUseControllers.Value) 18 | { 19 | return; 20 | } 21 | Cursor.lockState = CursorLockMode.None; 22 | } 23 | } 24 | 25 | [HarmonyPatch(typeof(InputMapper), nameof(InputMapper.CheckLockMouse))] 26 | internal class InjectFreeTheCursorMouseCheck 27 | { 28 | private static void Postfix() 29 | { 30 | if (!VRConfig.configUseControllers.Value) 31 | { 32 | return; 33 | } 34 | Cursor.lockState = CursorLockMode.None; 35 | } 36 | } 37 | 38 | [HarmonyPatch(typeof(CM_PageBase), nameof(CM_PageBase.Update))] 39 | internal class InjectFreeTheCursorMenu 40 | { 41 | private static void Postfix() 42 | { 43 | if (!VRConfig.configUseControllers.Value) 44 | { 45 | return; 46 | } 47 | Cursor.lockState = CursorLockMode.None; 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Input/InjectInput.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using GTFO_VR.Core.UI; 3 | using GTFO_VR.Core.VR_Input; 4 | using HarmonyLib; 5 | using UnityEngine; 6 | 7 | namespace GTFO_VR.Injections.Input 8 | { 9 | /// 10 | /// Handles input for all VR peripherals supported by SteamVR 11 | /// Input is handled within SteamVR, in SteamVR_Input, to modify bindings and add new input actions have a look at my 12 | /// SteamVR_Standalone repo to start with. Once you create new action bindings you can link them to GTFO actions in VRInput. 13 | /// 14 | /// 15 | 16 | [HarmonyPatch(typeof(InputMapper), nameof(InputMapper.DoGetAxis))] 17 | internal class InjectInputAxis 18 | { 19 | private static void Postfix(InputAction action, ref float __result) 20 | { 21 | __result += SteamVR_InputHandler.GetAxis(action); 22 | } 23 | } 24 | 25 | [HarmonyPatch(typeof(InputMapper), nameof(InputMapper.DoGetButtonUp))] 26 | internal class InjectInputBooleanUp 27 | { 28 | private static void Postfix(InputAction action, ref bool __result) 29 | { 30 | __result = __result || SteamVR_InputHandler.GetActionUp(action) || Dummy_InputHandler.GetActionUp(action); 31 | } 32 | } 33 | 34 | [HarmonyPatch(typeof(InputMapper), nameof(InputMapper.DoGetButtonDown))] 35 | internal class InjectInputBooleanDown 36 | { 37 | private static void Postfix(InputAction action, ref bool __result) 38 | { 39 | __result = __result || SteamVR_InputHandler.GetActionDown(action) || Dummy_InputHandler.GetActionDown(action) || WeaponRadialMenu.GetSpecialActionMappingDown(action); 40 | } 41 | } 42 | 43 | [HarmonyPatch(typeof(InputMapper), nameof(InputMapper.DoGetButton))] 44 | internal class InjectInputBoolean 45 | { 46 | private static void Postfix(InputAction action, ref bool __result) 47 | { 48 | __result = __result || SteamVR_InputHandler.GetAction(action) || Dummy_InputHandler.GetAction(action) || WeaponRadialMenu.GetSpecialActionMappingDown(action); 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Input/InjectKeyInput.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using GTFO_VR.Core.UI; 3 | using GTFO_VR.Core.UI.Terminal; 4 | using HarmonyLib; 5 | using UnityEngine; 6 | 7 | namespace GTFO_VR.Injections.Input 8 | { 9 | /// 10 | /// Handles rare occasions of GTFO checking input for a specific keycode. 11 | /// Used when the terminal plays an audio log and requests Y / N input to play/cancel, and Z to stop. 12 | /// 13 | /// 14 | 15 | [HarmonyPatch(typeof(UnityEngine.Input), nameof(UnityEngine.Input.GetKeyDown), typeof(UnityEngine.KeyCode))] 16 | internal class InjectKeyDown 17 | { 18 | private static void Postfix(KeyCode key, ref bool __result) 19 | { 20 | __result = __result || TerminalKeyboardInterface.GetKeycodeDown(key); 21 | } 22 | } 23 | 24 | /// 25 | /// When checking for modifiers such as ctrl ( ctrl-c to cancel ping repeat ), GetKey() is queried instead 26 | /// 27 | /// 28 | [HarmonyPatch(typeof(UnityEngine.Input), nameof(UnityEngine.Input.GetKey), typeof(UnityEngine.KeyCode))] 29 | internal class InjectKey 30 | { 31 | private static void Postfix(KeyCode key, ref bool __result) 32 | { 33 | __result = __result || TerminalKeyboardInterface.GetKeycodeDown(key); 34 | } 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Input/InjectSkipButton.cs: -------------------------------------------------------------------------------- 1 | using BepInEx; 2 | using GTFO_VR.Core.VR_Input; 3 | using HarmonyLib; 4 | using Il2CppSystem; 5 | using Il2CppSystem.Diagnostics; 6 | using System.Diagnostics; 7 | 8 | namespace GTFO_VR.Injections.Input 9 | { 10 | /// 11 | /// Skip button uses a part of input mapper which doesn't handle gamepad or vr input, so we inject our own bypass 12 | /// 13 | 14 | [HarmonyPatch(typeof(PUI_SkipText), nameof(PUI_SkipText.UpdateSkipTimer))] 15 | internal class InjectMenuSkipInput 16 | { 17 | private static bool Prefix(PUI_SkipText __instance, Action onSkip) 18 | { 19 | if (SteamVR_InputHandler.GetActionDown(InputAction.Fire) || !UnityEngine.Input.inputString.IsNullOrWhiteSpace()) 20 | { 21 | onSkip?.Invoke(); 22 | } 23 | 24 | return false; 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Rendering/InjectClusteredRenderingResolutionTweak.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using HarmonyLib; 3 | using System; 4 | using UnityEngine; 5 | using Valve.VR; 6 | 7 | namespace GTFO_VR.Injections.Rendering 8 | { 9 | /// 10 | /// [Deprecated] - Gives more artifacts than performance now, instead this corrects the HMD 11 | /// Experimental performance tweak - changes light rendering resolution (with none to little visual difference, but a pretty good performance increase!) 12 | /// 13 | /// 14 | 15 | [HarmonyPatch(typeof(ClusteredRendering), nameof(ClusteredRendering.OnResolutionChange))] 16 | [HarmonyPatch(new Type[] { typeof(Resolution) })] 17 | internal class InjectClusteredRenderingResolutionTweak 18 | { 19 | private static void Prefix(ref Resolution res) 20 | { 21 | res = SteamVR_Camera.GetSceneResolution(); 22 | } 23 | } 24 | 25 | [HarmonyPatch(typeof(PreLitVolume), nameof(PreLitVolume.OnResolutionChange))] 26 | internal class InjectPreLitVolumeResolutionTweak 27 | { 28 | private static void Prefix(ref int width, ref int height) 29 | { 30 | Resolution res = SteamVR_Camera.GetSceneResolution(); 31 | 32 | width = res.width; 33 | height = res.height; 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Rendering/InjectDisableFPSCameraRenderUpdate.cs: -------------------------------------------------------------------------------- 1 | using HarmonyLib; 2 | using UnityEngine; 3 | 4 | namespace GTFO_VR.Injections.Rendering 5 | { 6 | /// 7 | /// Remove command calls from FPSCamera and move them to PlayerVR instead to use them after poses have been updated for better reprojection and a smoother experience 8 | /// 9 | /// 10 | 11 | [HarmonyPatch(typeof(FPSCamera), nameof(FPSCamera.OnPreCull))] 12 | internal class InjectDisableFPSCameraRenderUpdate 13 | { 14 | private static bool Prefix(FPSCamera __instance) 15 | { 16 | return false; 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Rendering/InjectDisableFPSRenderPreCull.cs: -------------------------------------------------------------------------------- 1 | using HarmonyLib; 2 | using UnityEngine; 3 | 4 | namespace GTFO_VR.Injections.Rendering 5 | { 6 | /// 7 | /// Remove command calls from FPSCamera and move them to PlayerVR instead to use them after poses have been updated for better reprojection and a smoother experience 8 | /// 9 | /// 10 | 11 | [HarmonyPatch(typeof(FPS_Render), nameof(FPS_Render.OnPreCull))] 12 | internal class InjectDisableFPSRenderPreCull 13 | { 14 | private static bool Prefix(FPS_Render __instance) 15 | { 16 | return false; 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Rendering/InjectDisableUIRendering.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using HarmonyLib; 3 | using System; 4 | 5 | namespace GTFO_VR.Injections.Rendering 6 | { 7 | /// 8 | /// Disables UI rendering while not in the map or main menu 9 | /// 10 | [HarmonyPatch(typeof(UI_Core), nameof(UI_Core.RenderUI), new Type[0])] 11 | internal class InjectDisableUIRendering 12 | { 13 | private static bool Prefix() 14 | { 15 | if (!FocusStateManager.CurrentState.Equals(eFocusState.Map) && !FocusStateManager.CurrentState.Equals(eFocusState.MainMenu) && !FocusStateManager.Current.Equals(eFocusState.GlobalPopupMessage)) 16 | { 17 | return false; 18 | } 19 | return true; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Rendering/InjectEarlyTransparentRendererFix.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using HarmonyLib; 3 | using Il2CppSystem.Collections.Generic; 4 | using System; 5 | using UnityEngine; 6 | using UnityEngine.Rendering; 7 | 8 | namespace GTFO_VR.Injections.GameHooks 9 | { 10 | /// 11 | /// EarlyTransparentRenderer objects are duplicate-rendered an increasing number of times for every cull/uncull. This makes it render normally at the cost of not rendering through transparent objects. 12 | /// 13 | [HarmonyPatch(typeof(EarlyTransparentRenderer), nameof(EarlyTransparentRenderer.OnWillRenderObject))] 14 | internal class InjectEarlyTransparentRendererFix 15 | { 16 | private static bool Prefix(EarlyTransparentRenderer __instance) 17 | { 18 | // The role of EarlyTransparentRenderer is to make certain transparent objects visible when viewed through other transparent objects ( glass ). 19 | // 20 | // OnWillRenderObject() adds this instance, if enabled, to the static VisibleInstances HashSet, which is processed in ClusteredRenderer.OnPreRender(). 21 | // That calls InjectDrawCommand() which hides the MeshRendere on the parent GameObject while also submitting it to ClusteredRendering.m_earlyTransparentCmd. 22 | // m_earlyTransparentCmd is added to the camera command buffer in ClusteredRendering.SetupDeferredCmd(). 23 | // ClusteredRendering.OnPostRender() calls Restore() to re-enable the MeshRenderer disabled earlier, and we've come full circle. 24 | // 25 | // In VR, OnWillRenderObject() will be called multiple times for the same instance, increasing for every time the object is culled and unculled. Something is 26 | // rendering it multiple times, tanking performance. The actual problem appears to be toggling the MeshRenderer. If we enable m_drawTwice, the only difference 27 | // is that the MeshRenderer will not be disabled ( Sentry laser beam does this ) and the problem does not occur. However, all the problematic objects use the 28 | // GTFO/TankGlass shader, which is very expensive, and rendering it twice also makes affected objects less transparent than they should be. 29 | // If we skip OnWillRenderObject() completely, it will simply render once, as a normal object, with no performance issues. 30 | // The downside to this is that it will not render when viewed through other transparent surfaces ( glass ). This isn't somethin that happens very often. 31 | if (VRConfig.configEarlyTransparentRendererFix.Value) 32 | { 33 | // Anything that already has m_drawTwice enabled will not cause problems, so skip them as to not needlessly break things. 34 | // This probably only applies to rain effects in the elevator and the sentry laser beam. 35 | return __instance.m_drawTwice; 36 | } 37 | 38 | return true; 39 | } 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /GTFO_VR/Injections/Rendering/InjectForceVRResolution.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using GTFO_VR.Core.UI; 3 | using HarmonyLib; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using UnityEngine; 10 | using Valve.VR; 11 | 12 | namespace GTFO_VR.Injections.Rendering 13 | { 14 | /// 15 | /// Resolution tweaks for UI etc. 16 | /// 17 | /// 18 | [HarmonyPatch(typeof(GuiManager), nameof(GuiManager.OnResolutionChange))] 19 | internal class InjectForceVRResolution 20 | { 21 | private static void Prefix(ref Resolution res) 22 | { 23 | Log.Info("Updating global resolution to 16:9 HMD res..."); 24 | // We use a scaled 16:9 resolution because that's the best aspect for rendering the UI of GTFO 25 | Resolution scaledHMDRes = SteamVR_Camera.GetResolutionForAspect(16, 9, VR_UI_Overlay.MAX_GUI_RESOLUTION); 26 | res.width = scaledHMDRes.width; 27 | res.height = scaledHMDRes.height; 28 | } 29 | } 30 | 31 | [HarmonyPatch(typeof(GuiManager), nameof(GuiManager.UpdateResolution))] 32 | internal class InjectForceVRResolutionFixScreenRes 33 | { 34 | private static void Postfix(GuiManager __instance) 35 | { 36 | Log.Info("Updating menu page resolution to HMD res..."); 37 | Resolution scaledHMDResolution = SteamVR_Camera.GetResolutionForAspect(16, 9, VR_UI_Overlay.MAX_GUI_RESOLUTION); 38 | GuiManager.ScreenRes = scaledHMDResolution; 39 | GuiManager.ScreenCenter = new Vector2(GuiManager.ScreenRes.width / 2, GuiManager.ScreenRes.height / 2); 40 | __instance.CalcSafeArea(); 41 | } 42 | } 43 | 44 | 45 | /// 46 | /// Patches the screen liquid system to use the proper VR aspect 47 | /// 48 | [HarmonyPatch(typeof(GlassLiquidSystem), nameof(GlassLiquidSystem.OnResolutionChange))] 49 | internal class InjectScreenLiquidResolutionTweak 50 | { 51 | private static void Prefix(ref Resolution res) 52 | { 53 | // We use the unscaled resolution for screen liquid effects to prevent the effects from being scaled or going off-screen 54 | Resolution scaledHMDRes = SteamVR_Camera.GetResolutionForAspect(16, 9); 55 | res.width = scaledHMDRes.width; 56 | res.height = scaledHMDRes.height; 57 | } 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /GTFO_VR/Injections/Rendering/InjectPostProcessTweaks.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using GTFO_VR.Core.PlayerBehaviours; 3 | using GTFO_VR.Core.UI; 4 | using GTFO_VR.Events; 5 | using HarmonyLib; 6 | using UnityEngine; 7 | using UnityEngine.PostProcessing; 8 | 9 | namespace GTFO_VR.Injections.Rendering 10 | { 11 | 12 | [HarmonyPatch(typeof(FPSCamera), nameof(FPSCamera.RefreshPostEffectsEnabled))] 13 | internal class InjectPostProcessTweaks 14 | { 15 | private static void Postfix(FPSCamera __instance) 16 | { 17 | __instance.m_postProcessing.m_bloom.intensity.Override(.275f); 18 | __instance.m_postProcessing.m_bloom.threshold.Override(1.1f); 19 | __instance.m_postProcessing.m_motionBlur.active = false; 20 | } 21 | } 22 | 23 | 24 | } 25 | -------------------------------------------------------------------------------- /GTFO_VR/Injections/Rendering/InjectScreenLiquidVRTweak.cs: -------------------------------------------------------------------------------- 1 | using HarmonyLib; 2 | using Player; 3 | 4 | namespace GTFO_VR.Injections.Rendering 5 | { 6 | 7 | /// 8 | /// Patches the screen liquid system to use the VR camera's properties 9 | /// 10 | [HarmonyPatch(typeof(PlayerAgent), nameof(PlayerAgent.UpdateGoodNodeAndArea))] 11 | internal class InjectScreenLiquidVRTweak 12 | { 13 | private static void Postfix(LocalPlayerAgent __instance) 14 | { 15 | if(__instance.IsLocallyOwned) 16 | { 17 | ScreenLiquidManager.cameraDir = __instance.FPSCamera.transform.forward; 18 | ScreenLiquidManager.cameraPosition = __instance.FPSCamera.transform.position; 19 | } 20 | } 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/Rendering/InjectSkipDuplicateRenderTasks.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core.PlayerBehaviours; 2 | using HarmonyLib; 3 | using UnityEngine.Rendering.PostProcessing; 4 | using WindVolume; 5 | 6 | namespace GTFO_VR.Injections.Rendering 7 | { 8 | /// 9 | /// Only calls UpdateVolume() responsible for fog turbine and repellers punching holes in fog 10 | /// 11 | [HarmonyPatch(typeof(WindVolumeCamera), nameof(WindVolumeCamera.OnPreCull))] 12 | internal class InjectWindVolumeUpdateSkip 13 | { 14 | private static bool Prefix() 15 | { 16 | return VRRendering.renderingFirstEye(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /GTFO_VR/Injections/UI/InjectChatMsgEvents.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Events; 2 | using HarmonyLib; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | 9 | namespace GTFO_VR.Injections.UI 10 | { 11 | [HarmonyPatch(typeof(PUI_GameEventLog), nameof(PUI_GameEventLog.AddLogItem))] 12 | internal class InjectChatMsgEvents 13 | { 14 | private static void Prefix(string log, eGameEventChatLogType type) 15 | { 16 | ChatMsgEvents.ChatMsgReceived(log); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /GTFO_VR/Injections/UI/InjectCommsMenu.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.UI; 2 | using GTFO_VR.Events; 3 | using HarmonyLib; 4 | using GTFO_VR.Core; 5 | using GTFO_VR.Core.VR_Input; 6 | 7 | namespace GTFO_VR.Injections.UI 8 | { 9 | [HarmonyPatch(typeof(PUI_CommunicationMenu), nameof(PUI_CommunicationMenu.Setup))] 10 | internal class InjectCommsSetupTrace 11 | { 12 | private static void Postfix( PUI_CommunicationMenu __instance ) 13 | { 14 | VRWorldSpaceUI.SetCommsGUIRef(__instance); 15 | } 16 | } 17 | 18 | [HarmonyPatch(typeof(PUI_CommunicationMenu), nameof(PUI_CommunicationMenu.Update))] 19 | internal class InjectCommsSelectAction 20 | { 21 | private static bool Prefix(PUI_CommunicationMenu __instance) 22 | { 23 | // Check input and perform the action, like the original update() should be doing. 24 | if (SteamVR_InputHandler.GetActionDown(InputAction.SelectCommunicationMenu)) 25 | { 26 | if (__instance.m_active) 27 | { 28 | // MoveNext refers to the next node i.e. the child node, so it's actually "select highlighted". 29 | VRWorldSpaceUI.comms.MoveNext(__instance.m_highlightedButtonIndex); 30 | 31 | // Skip the original update function so this doesn't get triggered twice if the base game ever fixes their inputs. 32 | return false; 33 | } 34 | } 35 | 36 | return true; 37 | } 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/UI/InjectInteractionPromptActionNames.cs: -------------------------------------------------------------------------------- 1 | using Enemies; 2 | using GTFO_VR.Core; 3 | using GTFO_VR.Core.VR_Input; 4 | using HarmonyLib; 5 | 6 | namespace GTFO_VR.Injections.UI 7 | { 8 | [HarmonyPatch(typeof(InputMapper), nameof(InputMapper.GetBindingName))] 9 | internal class InjectInteractionPromptActionNames 10 | { 11 | private static bool Prefix(InputAction action, ref string __result) 12 | { 13 | string res = ""; 14 | if (SteamVR_InputHandler.TryGetActionNameFromInputAction(action, ref res)) 15 | { 16 | Log.Debug($"Got action name from SteamVR_Input - {res}"); 17 | __result = res; 18 | return false; 19 | } 20 | return true; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/UI/InjectLocalizedVRText.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.Core; 2 | using HarmonyLib; 3 | using Localization; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | 10 | namespace GTFO_VR.Injections.UI 11 | { 12 | 13 | [HarmonyPatch(typeof(GameDataTextLocalizationService), nameof(GameDataTextLocalizationService.GetString))] 14 | internal class InjectLocalizedVRText 15 | { 16 | private static bool Prefix(uint id, ref string __result) 17 | { 18 | if(VRConfig.VRTextMappings.ContainsKey(id)) { 19 | __result = VRConfig.VRTextMappings[id]; 20 | return false; 21 | } 22 | return true; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /GTFO_VR/Injections/UI/InjectRemoveCrosshair.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | using GTFO_VR; 5 | using HarmonyLib; 6 | using Player; 7 | using UnityEngine; 8 | 9 | 10 | namespace GTFO_VR_BepInEx.Core 11 | { 12 | /// 13 | /// Disable crosshair GUI layer, if this is not done the crosshair would be visible in the 2D game view on screen 14 | /// 15 | [HarmonyPatch(typeof(GuiManager), nameof(GuiManager.OnFocusStateChanged))] 16 | class InjectRemoveCrosshairHit 17 | { 18 | static void Postfix() 19 | { 20 | GuiManager.CrosshairLayer.SetVisible(false); 21 | } 22 | } 23 | 24 | /// 25 | /// Disable chargeup coroutines because they throw annoying errors 26 | /// 27 | [HarmonyPatch(typeof(CrosshairGuiLayer), nameof(CrosshairGuiLayer.TriggerChargeUpBlink))] 28 | class InjectRemoveCrosshairChargeupCoroutineErrors 29 | { 30 | static bool Prefix() 31 | { 32 | return false; 33 | } 34 | } 35 | 36 | /// 37 | /// Disable chargeup coroutines because they throw annoying errors 38 | /// 39 | [HarmonyPatch(typeof(CrosshairGuiLayer), nameof(CrosshairGuiLayer.TriggerBlink))] 40 | class InjectRemoveCrosshairChargeupCoroutineErrorTwo 41 | { 42 | static bool Prefix() 43 | { 44 | return false; 45 | } 46 | } 47 | 48 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/UI/InjectSmallerMarkers.cs: -------------------------------------------------------------------------------- 1 | using Enemies; 2 | using HarmonyLib; 3 | 4 | namespace GTFO_VR.Injections.UI 5 | { 6 | [HarmonyPatch(typeof(EnemyAgent), nameof(EnemyAgent.SyncPlaceNavMarkerTag))] 7 | internal class InjectSmallerEnemyMarkers 8 | { 9 | private static void Postfix(EnemyAgent __instance) 10 | { 11 | __instance.m_tagMarker.m_initScale *= .7f; 12 | } 13 | } 14 | 15 | [HarmonyPatch(typeof(NavMarkerLayer), nameof(NavMarkerLayer.PlacePlayerMarker))] 16 | internal class InjectSmallerPlayerInfoMarkers 17 | { 18 | private static void Postfix(ref NavMarker __result) 19 | { 20 | __result.m_initScale *= 0.6f; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/UI/InjectWatchObjectives.cs: -------------------------------------------------------------------------------- 1 | using GameData; 2 | using GTFO_VR.Core; 3 | using GTFO_VR.UI; 4 | using HarmonyLib; 5 | using LevelGeneration; 6 | using Localization; 7 | 8 | namespace GTFO_VR.Injections.UI 9 | { 10 | /// 11 | /// Replicate new objectives on the VR watch. 12 | /// 13 | 14 | [HarmonyPatch(typeof(PlayerGuiLayer), nameof(PlayerGuiLayer.UpdateObjectives))] 15 | internal class InjectWatchObjectives 16 | { 17 | public static PUI_GameObjectives PlayerGuiLayer_PUI_GameObjectives_Instance = null; 18 | 19 | private static void Prefix(PlayerGuiLayer __instance) 20 | { 21 | // Keep track of the instance so we can skip the PUI_GameObjectives.SetProgressionObjective() patch 22 | // when called on any other instance. Unfortunately patching that method is the only way. 23 | PlayerGuiLayer_PUI_GameObjectives_Instance = __instance.WardenObjectives; 24 | } 25 | 26 | private static void Postfix(PlayerGuiLayer __instance) 27 | { 28 | Watch.Current?.UpdateObjective(__instance.m_wardenObjective); 29 | Log.Debug($"Got new objectives!"); 30 | } 31 | } 32 | 33 | [HarmonyPatch(typeof(PUI_GameObjectives), nameof(PUI_GameObjectives.SetProgressionObjective))] 34 | internal class InjectWatchObjectivesProgression 35 | { 36 | private static void Postfix(PUI_GameObjectives __instance) 37 | { 38 | if ( __instance == InjectWatchObjectives.PlayerGuiLayer_PUI_GameObjectives_Instance) 39 | { 40 | Watch.Current?.UpdateObjective(__instance); 41 | Log.Debug($"Got new progression!"); 42 | } 43 | } 44 | } 45 | 46 | [HarmonyPatch(typeof(PUI_GameObjectives), nameof(PUI_GameObjectives.RemoveProgressionObjective))] 47 | internal class InjectWatchObjectivesProgressionRemove 48 | { 49 | private static void Postfix(PUI_GameObjectives __instance) 50 | { 51 | if (__instance == InjectWatchObjectives.PlayerGuiLayer_PUI_GameObjectives_Instance) 52 | { 53 | Watch.Current?.UpdateObjective(__instance); 54 | Log.Debug($"Got progression removal!"); 55 | } 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /GTFO_VR/Injections/UI/InjectWatchUpdateStatus.cs: -------------------------------------------------------------------------------- 1 | using GTFO_VR.UI; 2 | using GTFO_VR.Events; 3 | using HarmonyLib; 4 | 5 | namespace GTFO_VR.Injections.UI 6 | { 7 | /// 8 | /// Replicate HP, oxygen and infection on the VR watch 9 | /// 10 | 11 | [HarmonyPatch(typeof(PlayerGuiLayer), nameof(PlayerGuiLayer.UpdateHealth))] 12 | internal class InjectWatchHP 13 | { 14 | private static void Postfix(float health) 15 | { 16 | Watch.Current?.UpdateHealth(health); 17 | 18 | ResourceUpdatedEvents.HealthUpdated(health); 19 | } 20 | } 21 | 22 | [HarmonyPatch(typeof(PlayerGuiLayer), nameof(PlayerGuiLayer.UpdateAir))] 23 | internal class InjectWatchAir 24 | { 25 | private static void Postfix(float val) 26 | { 27 | Watch.Current?.UpdateAir(val); 28 | } 29 | } 30 | 31 | [HarmonyPatch(typeof(PlayerGuiLayer), nameof(PlayerGuiLayer.UpdateInfection))] 32 | internal class InjectWatchInfection 33 | { 34 | private static void Postfix(float infection, float infectionHealthRel) 35 | { 36 | Watch.Current?.UpdateInfection(infection); 37 | 38 | ResourceUpdatedEvents.InfectionUpdated(infection); 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /GTFO_VR/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("GTFO_VR")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("GTFO_VR")] 13 | [assembly: AssemblyCopyright("Copyright © Spartan 2020")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("a11a2774-4115-4e28-a803-8f3fc4868f01")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Paul Górniak 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Release_Dependencies/Changelog.txt: -------------------------------------------------------------------------------- 1 | Total changelog (1.3.4b2): 2 | 3 | - (Roughy) Fixed various issues with melee weapons, melee weapon position offsets, pistols, misaligned sights and sight textures. 4 | 5 | Total changelog (1.3.4b1): 6 | 7 | - (Roughy) Added pose prediction. Should improve head/weapon movement, especially on wireless HMDs. 8 | 9 | 10 | Total changelog (1.3.3): 11 | 12 | !!! IMPORTANT !!! 13 | 14 | The mod has been upgraded to BepInEx 670 (now compatible with other GTFO mods!) 15 | ... This does mean you will need to upgrade. A new BepInEx version has been linked in the readme. The mod will NOT work without upgrading! 16 | ... Other mods might overwrite your BepInEx version. This will break things! 17 | The BepInEx version shipped with other mods will NOT work at this time! 18 | 19 | - Fix laser disappearing in thermal sights when starting multiple missions without restarting 20 | - Fixed shotguns firing at look direction 21 | - Made shockwave integration disabled by default, as it has been known to cause issues. If you run into any, let us know! 22 | - Improved efficiency of rendering by improving the hidden area mesh and skipping some work that is the same for both eyes. 23 | - Made hidden area mesh toggleable, as it might cause artifacting on some setups (edges of screen not rendering) 24 | - Removed an outdated config option (skip damage feedback) 25 | - Added TactVisor bhaptics support 26 | - Ported bhaptics to the new bhaptics SDK, which should resolve any leftover crashing 27 | - Fixed drop-in sequence auto-skipping 28 | - Total melee hit detection overhaul by Roughy! Melee weapons should feel much better now. 29 | - Added FPS limit in menu. This is a possible fix for the menu stutter issue. Let us know if it still happens! 30 | - Made Bhaptics and shockwave integrations optional. You can now disable/enable these whenever. 31 | - Fixed and improved Accrat ND6 heavy SMG sight 32 | - Fixed menu issues where high HMD resolutions would prevent UI at the edges of the screen from being accessible. 33 | - Fixed BHaptics related issues. 34 | - Added Shockwave suit integration 35 | - Added ProtubeVR Haptics support 36 | - Tweaked every weapon in the game to have its own haptics 'identity' 37 | - Fixed the following weapon sights: 38 | * Drekker Pres MOD 556 Rifle 39 | * Techman Arbalist machine gun 40 | * Techman Klust 6 Burst Cannon 41 | 42 | 43 | Known issues: 44 | - GTFO is very VRAM hungry! If your texture or render resolution settings are too high and you're using too much VRAM your game will be very unstable! 45 | Changing resolution in-game or even playing some maps might cause crashes depending on your resolution and/or texture resolution settings! 46 | 47 | - For Quest headsets: Link/airlink are very crash-prone. Playing using VD is recommended. -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/AssetBundles: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSprtn/GTFO_VR_Plugin/1f81eca31c51652cbc2a8ce654639e4b0f24a9d2/Release_Dependencies/StreamingAssets/AssetBundles -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/AssetBundles.manifest: -------------------------------------------------------------------------------- 1 | ManifestFileVersion: 0 2 | CRC: 58828386 3 | AssetBundleManifest: 4 | AssetBundleInfos: 5 | Info_0: 6 | Name: vrshaders 7 | Dependencies: {} 8 | Info_1: 9 | Name: vrwatch 10 | Dependencies: {} 11 | Info_2: 12 | Name: nuts 13 | Dependencies: {} 14 | -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/SteamVR_Standalone/binding_holographic_hmd.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": { 3 | "/actions/default": { 4 | "chords": [], 5 | "poses": [], 6 | "haptics": [], 7 | "sources": [], 8 | "skeleton": [] 9 | } 10 | }, 11 | "controller_type": "holographic_hmd", 12 | "description": "", 13 | "name": "holographic_hmd defaults" 14 | } -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/SteamVR_Standalone/binding_index_hmd.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": { 3 | "/actions/default": { 4 | "chords": [], 5 | "poses": [], 6 | "haptics": [], 7 | "sources": [], 8 | "skeleton": [] 9 | } 10 | }, 11 | "controller_type": "indexhmd", 12 | "description": "", 13 | "name": "index hmd defaults" 14 | } -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/SteamVR_Standalone/binding_rift.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": { 3 | "/actions/default": { 4 | "chords": [], 5 | "poses": [], 6 | "haptics": [], 7 | "sources": [], 8 | "skeleton": [] 9 | } 10 | }, 11 | "controller_type": "rift", 12 | "description": "", 13 | "name": "rift defaults" 14 | } -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/SteamVR_Standalone/binding_vive.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": { 3 | "/actions/default": { 4 | "chords": [], 5 | "poses": [], 6 | "haptics": [], 7 | "sources": [], 8 | "skeleton": [] 9 | } 10 | }, 11 | "controller_type": "vive", 12 | "description": "", 13 | "name": "vive defaults" 14 | } -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/SteamVR_Standalone/binding_vive_cosmos.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": { 3 | "/actions/default": { 4 | "chords": [], 5 | "poses": [], 6 | "haptics": [], 7 | "sources": [], 8 | "skeleton": [] 9 | } 10 | }, 11 | "controller_type": "vive_cosmos", 12 | "description": "", 13 | "name": "vive cosmos hmd defaults" 14 | } -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/SteamVR_Standalone/binding_vive_pro.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": { 3 | "/actions/default": { 4 | "chords": [], 5 | "poses": [], 6 | "haptics": [], 7 | "sources": [], 8 | "skeleton": [] 9 | } 10 | }, 11 | "controller_type": "vive_pro", 12 | "description": "", 13 | "name": "vive_pro defaults" 14 | } -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/SteamVR_Standalone/binding_vive_tracker_camera.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": { 3 | "/actions/mixedreality": { 4 | "chords": [], 5 | "poses": [], 6 | "haptics": [], 7 | "sources": [], 8 | "skeleton": [] 9 | } 10 | }, 11 | "controller_type": "vive_tracker_camera", 12 | "description": "", 13 | "name": "tracker_forcamera" 14 | } -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/SteamVR_Standalone/bindings_holographic_controller.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": { 3 | "/actions/buggy": { 4 | "chords": [], 5 | "poses": [], 6 | "haptics": [], 7 | "sources": [], 8 | "skeleton": [] 9 | }, 10 | "/actions/default": { 11 | "chords": [], 12 | "poses": [], 13 | "haptics": [], 14 | "sources": [], 15 | "skeleton": [] 16 | }, 17 | "/actions/platformer": { 18 | "chords": [], 19 | "poses": [], 20 | "haptics": [], 21 | "sources": [], 22 | "skeleton": [] 23 | } 24 | }, 25 | "controller_type": "holographic_controller", 26 | "description": "", 27 | "name": "Default bindings for Windows Mixed Reality Controllers" 28 | } -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/SteamVR_Standalone/bindings_vive_controller.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": { 3 | "/actions/buggy": { 4 | "chords": [], 5 | "poses": [], 6 | "haptics": [], 7 | "sources": [], 8 | "skeleton": [] 9 | }, 10 | "/actions/default": { 11 | "chords": [], 12 | "poses": [], 13 | "haptics": [], 14 | "sources": [], 15 | "skeleton": [] 16 | }, 17 | "/actions/platformer": { 18 | "chords": [], 19 | "poses": [], 20 | "haptics": [], 21 | "sources": [], 22 | "skeleton": [] 23 | } 24 | }, 25 | "controller_type": "vive_controller", 26 | "description": "", 27 | "name": "vive_controller" 28 | } -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/SteamVR_Standalone/bindings_vive_cosmos_controller.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": { 3 | "/actions/buggy": { 4 | "chords": [], 5 | "poses": [], 6 | "haptics": [], 7 | "sources": [], 8 | "skeleton": [] 9 | }, 10 | "/actions/default": { 11 | "chords": [], 12 | "poses": [], 13 | "haptics": [], 14 | "sources": [], 15 | "skeleton": [] 16 | }, 17 | "/actions/platformer": { 18 | "chords": [], 19 | "poses": [], 20 | "haptics": [], 21 | "sources": [], 22 | "skeleton": [] 23 | } 24 | }, 25 | "controller_type": "vive_cosmos_controller", 26 | "description": "", 27 | "name": "vive_cosmos_controller" 28 | } -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/gtfovr_shaders: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSprtn/GTFO_VR_Plugin/1f81eca31c51652cbc2a8ce654639e4b0f24a9d2/Release_Dependencies/StreamingAssets/gtfovr_shaders -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/gtfovr_shaders.manifest: -------------------------------------------------------------------------------- 1 | ManifestFileVersion: 0 2 | CRC: 3984332181 3 | Hashes: 4 | AssetFileHash: 5 | serializedVersion: 2 6 | Hash: 3c1eede69ac269e880bc3a236b3ab023 7 | TypeTreeHash: 8 | serializedVersion: 2 9 | Hash: 7e9ee104d6bb707fb2602b751e6f78b1 10 | HashAppended: 0 11 | ClassTypes: 12 | - Class: 48 13 | Script: {instanceID: 0} 14 | Assets: 15 | - Assets/GTFOVR_HiddenArea.shader 16 | - Assets/GTFOVR_Thermal_Glow.shader 17 | Dependencies: [] 18 | -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/vrshaders: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSprtn/GTFO_VR_Plugin/1f81eca31c51652cbc2a8ce654639e4b0f24a9d2/Release_Dependencies/StreamingAssets/vrshaders -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/vrshaders.manifest: -------------------------------------------------------------------------------- 1 | ManifestFileVersion: 0 2 | CRC: 4031417680 3 | Hashes: 4 | AssetFileHash: 5 | serializedVersion: 2 6 | Hash: e717c7c4cf933b98559f3d620fbfead7 7 | TypeTreeHash: 8 | serializedVersion: 2 9 | Hash: 7e9ee104d6bb707fb2602b751e6f78b1 10 | HashAppended: 0 11 | ClassTypes: 12 | - Class: 48 13 | Script: {instanceID: 0} 14 | Assets: 15 | - Assets/SteamVR/Resources/SteamVR_Blit.shader 16 | - Assets/SteamVR/Resources/SteamVR_Fade.shader 17 | - Assets/SteamVR/Resources/SteamVR_BlitFlip.shader 18 | - Assets/SteamVR/Resources/SteamVR_Overlay.shader 19 | - Assets/SteamVR/Resources/SteamVR_HiddenArea.shader 20 | Dependencies: [] 21 | -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/vrwatch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSprtn/GTFO_VR_Plugin/1f81eca31c51652cbc2a8ce654639e4b0f24a9d2/Release_Dependencies/StreamingAssets/vrwatch -------------------------------------------------------------------------------- /Release_Dependencies/StreamingAssets/vrwatch.manifest: -------------------------------------------------------------------------------- 1 | ManifestFileVersion: 0 2 | CRC: 4022278629 3 | Hashes: 4 | AssetFileHash: 5 | serializedVersion: 2 6 | Hash: ef4d6493b968c7090fe6f4a342162c34 7 | TypeTreeHash: 8 | serializedVersion: 2 9 | Hash: 136bdbfb2fc6f34ff509ce379a45d812 10 | HashAppended: 0 11 | ClassTypes: 12 | - Class: 1 13 | Script: {instanceID: 0} 14 | - Class: 4 15 | Script: {instanceID: 0} 16 | - Class: 21 17 | Script: {instanceID: 0} 18 | - Class: 23 19 | Script: {instanceID: 0} 20 | - Class: 28 21 | Script: {instanceID: 0} 22 | - Class: 33 23 | Script: {instanceID: 0} 24 | - Class: 43 25 | Script: {instanceID: 0} 26 | - Class: 48 27 | Script: {instanceID: 0} 28 | - Class: 114 29 | Script: {fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04, type: 3} 30 | - Class: 115 31 | Script: {instanceID: 0} 32 | - Class: 213 33 | Script: {instanceID: 0} 34 | - Class: 222 35 | Script: {instanceID: 0} 36 | - Class: 224 37 | Script: {instanceID: 0} 38 | Assets: 39 | - Assets/RadialIcons/ChatType.png 40 | - Assets/RadialIcons/PackFallback.png 41 | - Assets/RadialIcons/Objective.png 42 | - Assets/RadialIcons/Throwable.png 43 | - Assets/RadialIcons/Melee.png 44 | - Assets/P_VRWatch.prefab 45 | - Assets/RadialIcons/Tool.png 46 | - Assets/RadialIcons/Primary.png 47 | - Assets/TextMesh Pro/Resources/Shaders/TMP_ClipSphere.shader 48 | - Assets/RadialIcons/HackingTool.png 49 | - Assets/blob.png 50 | - Assets/RadialIcons/Chat.png 51 | - Assets/RadialIcons/BG.png 52 | - Assets/HoloText/Share-TechMono.asset 53 | - Assets/RadialIcons/Secondary.png 54 | - Assets/SpriteNoZTestAndClip.shader 55 | - Assets/TextMesh Pro/Resources/Shaders/TMP_NoZTest.shader 56 | - Assets/SpriteNoZTest.shader 57 | Dependencies: [] 58 | -------------------------------------------------------------------------------- /Release_Dependencies/libs/Bhaptics.Tact.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSprtn/GTFO_VR_Plugin/1f81eca31c51652cbc2a8ce654639e4b0f24a9d2/Release_Dependencies/libs/Bhaptics.Tact.dll -------------------------------------------------------------------------------- /Release_Dependencies/libs/ForceTubeVR_API_x64.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSprtn/GTFO_VR_Plugin/1f81eca31c51652cbc2a8ce654639e4b0f24a9d2/Release_Dependencies/libs/ForceTubeVR_API_x64.dll -------------------------------------------------------------------------------- /Release_Dependencies/libs/Newtonsoft.Json.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSprtn/GTFO_VR_Plugin/1f81eca31c51652cbc2a8ce654639e4b0f24a9d2/Release_Dependencies/libs/Newtonsoft.Json.dll -------------------------------------------------------------------------------- /Release_Dependencies/libs/ShockWaveIMU.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSprtn/GTFO_VR_Plugin/1f81eca31c51652cbc2a8ce654639e4b0f24a9d2/Release_Dependencies/libs/ShockWaveIMU.dll -------------------------------------------------------------------------------- /Release_Dependencies/libs/ShockwaveManager.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSprtn/GTFO_VR_Plugin/1f81eca31c51652cbc2a8ce654639e4b0f24a9d2/Release_Dependencies/libs/ShockwaveManager.dll -------------------------------------------------------------------------------- /Release_Dependencies/libs/SteamVR_Standalone_IL2CPP.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSprtn/GTFO_VR_Plugin/1f81eca31c51652cbc2a8ce654639e4b0f24a9d2/Release_Dependencies/libs/SteamVR_Standalone_IL2CPP.dll -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/change_item_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629619811500,"description":"","id":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"change_item_l","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":0,"intensity":0.3},{"index":2,"intensity":0.3},{"index":4,"intensity":0.3}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":100,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629619908587},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/change_item_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629573452810,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"change_item_r","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":0,"intensity":0.3},{"index":2,"intensity":0.3},{"index":4,"intensity":0.3}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":100,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629573542809},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/elevator_deploying.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1630140248506,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"elevator_deploying","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","pointList":[{"index":3,"intensity":0.2},{"index":1,"intensity":0.2},{"index":5,"intensity":0.2}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","pointList":[{"index":3,"intensity":0.2},{"index":1,"intensity":0.2},{"index":5,"intensity":0.2}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":1000,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1630140296682},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/explosion.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1631969426758,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"explosion","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":true,"feedback":[{"endTime":150,"playbackType":"NONE","pointList":[{"index":1,"intensity":0.4}],"startTime":0},{"endTime":300,"playbackType":"NONE","pointList":[{"index":0,"intensity":0.3},{"index":2,"intensity":0.3},{"index":4,"intensity":0.3}],"startTime":150},{"endTime":300,"playbackType":"NONE","pointList":[{"index":3,"intensity":0.2},{"index":5,"intensity":0.2}],"startTime":300}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":150,"playbackType":"NONE","pointList":[{"index":1,"intensity":0.4}],"startTime":0},{"endTime":300,"playbackType":"NONE","pointList":[{"index":0,"intensity":0.3},{"index":2,"intensity":0.3},{"index":4,"intensity":0.3}],"startTime":150},{"endTime":300,"playbackType":"NONE","pointList":[{"index":3,"intensity":0.2},{"index":5,"intensity":0.2}],"startTime":300}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":300,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1632078129870},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/fire_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629620062262,"description":"","id":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"fire_l","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":0,"intensity":1},{"index":1,"intensity":1},{"index":2,"intensity":1},{"index":5,"intensity":1},{"index":4,"intensity":1},{"index":3,"intensity":1}],"startTime":0},{"endTime":200,"playbackType":"FADE_OUT","pointList":[{"index":0,"intensity":1},{"index":1,"intensity":1},{"index":2,"intensity":1},{"index":5,"intensity":1},{"index":4,"intensity":1},{"index":3,"intensity":1}],"startTime":100}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":200,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629620077861},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/fire_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629538417096,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"fire_r","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":0,"intensity":1},{"index":1,"intensity":1},{"index":2,"intensity":1},{"index":5,"intensity":1},{"index":4,"intensity":1},{"index":3,"intensity":1}],"startTime":0},{"endTime":200,"playbackType":"FADE_OUT","pointList":[{"index":0,"intensity":1},{"index":1,"intensity":1},{"index":2,"intensity":1},{"index":5,"intensity":1},{"index":4,"intensity":1},{"index":3,"intensity":1}],"startTime":100}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":200,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629538454249},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/flashlight_toggle_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629619968795,"description":"","id":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"flashlight_toggle_l","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":1,"intensity":0.3}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":100,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629619989182},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/flashlight_toggle_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629568556160,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"flashlight_toggle_r","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":1,"intensity":0.3}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":100,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629568613876},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/gain_ammo.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1630144185067,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"gain_ammo","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":416,"playbackType":"NONE","pointList":[{"index":5,"intensity":0.5},{"index":2,"intensity":0.5}],"startTime":0},{"endTime":833,"playbackType":"NONE","pointList":[{"index":1,"intensity":0.5},{"index":4,"intensity":0.5}],"startTime":416},{"endTime":1250,"playbackType":"NONE","pointList":[{"index":3,"intensity":0.5},{"index":0,"intensity":0.5}],"startTime":833}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":416,"playbackType":"NONE","pointList":[{"index":0,"intensity":0.5},{"index":3,"intensity":0.5}],"startTime":0},{"endTime":833,"playbackType":"NONE","pointList":[{"index":1,"intensity":0.5},{"index":4,"intensity":0.5}],"startTime":416},{"endTime":1250,"playbackType":"NONE","pointList":[{"index":2,"intensity":0.5},{"index":5,"intensity":0.5}],"startTime":833}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":1250,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1630144324806},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/gain_tool_ammo.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1630860311850,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"gain_tool_ammo","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"FADE_IN_OUT","pointList":[{"index":0,"intensity":0.7},{"index":2,"intensity":0.7}],"startTime":0},{"endTime":400,"playbackType":"FADE_IN_OUT","pointList":[{"index":0,"intensity":0.7},{"index":2,"intensity":0.7}],"startTime":200}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"FADE_IN_OUT","pointList":[{"index":0,"intensity":0.7},{"index":2,"intensity":0.7}],"startTime":0},{"endTime":400,"playbackType":"FADE_IN_OUT","pointList":[{"index":0,"intensity":0.7},{"index":2,"intensity":0.7}],"startTime":200}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":400,"startTime":0},{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"FADE_IN_OUT","pointList":[{"index":3,"intensity":0.7},{"index":5,"intensity":0.7}],"startTime":0},{"endTime":400,"playbackType":"FADE_IN_OUT","pointList":[{"index":3,"intensity":0.7},{"index":5,"intensity":0.7}],"startTime":200}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"FADE_IN_OUT","pointList":[{"index":3,"intensity":0.7},{"index":5,"intensity":0.7}],"startTime":0},{"endTime":400,"playbackType":"FADE_IN_OUT","pointList":[{"index":3,"intensity":0.7},{"index":5,"intensity":0.7}],"startTime":200}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 2","offsetTime":400,"startTime":601}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1630860510140},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/hammer_charging_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629620088661,"description":"","id":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"hammer_charging_l","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","pointList":[{"index":1,"intensity":0.3},{"index":3,"intensity":0.3},{"index":4,"intensity":0.3},{"index":5,"intensity":0.3}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[]}}},"name":"Effect 1","offsetTime":200,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629620134392},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/hammer_charging_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629384688763,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"hammer_charging_r","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","pointList":[{"index":1,"intensity":0.3},{"index":3,"intensity":0.3},{"index":4,"intensity":0.3},{"index":5,"intensity":0.3}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":200,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629384703363},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/hammer_fully_charged_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629620006776,"description":"","id":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"hammer_fully_charged_l","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.5,"time":0,"x":0.5,"y":0},{"intensity":0.5,"time":200,"x":0,"y":1}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.5,"time":0,"x":0.5,"y":0},{"intensity":0.5,"time":200,"x":1,"y":1}],"visible":true}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[]}}},"name":"Effect 1","offsetTime":200,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629620028093},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/hammer_fully_charged_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629567975566,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"hammer_fully_charged_r","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.5,"time":0,"x":0.5,"y":0},{"intensity":0.5,"time":200,"x":0,"y":1}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.5,"time":0,"x":0.5,"y":0},{"intensity":0.5,"time":200,"x":1,"y":1}],"visible":true}]}}},"name":"Effect 1","offsetTime":200,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629568361161},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/hammer_smack_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629620162617,"description":"","id":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":1,"name":"hammer_smack_l","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":0,"intensity":1},{"index":1,"intensity":1},{"index":2,"intensity":1},{"index":5,"intensity":1},{"index":4,"intensity":1},{"index":3,"intensity":1}],"startTime":0},{"endTime":200,"playbackType":"FADE_OUT","pointList":[{"index":4,"intensity":1},{"index":1,"intensity":1},{"index":5,"intensity":1},{"index":2,"intensity":1},{"index":0,"intensity":1},{"index":3,"intensity":1}],"startTime":100}]},"mode":"DOT_MODE","pathMode":{"feedback":[]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[]}}},"name":"Effect 1","offsetTime":200,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629620177276},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/hammer_smack_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629369685616,"description":"","id":"-MhT-2mnvTjkJXZ112Jh","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":1,"name":"hammer_smack_r","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":0,"intensity":1},{"index":1,"intensity":1},{"index":2,"intensity":1},{"index":5,"intensity":1},{"index":4,"intensity":1},{"index":3,"intensity":1}],"startTime":0},{"endTime":200,"playbackType":"FADE_OUT","pointList":[{"index":4,"intensity":1},{"index":1,"intensity":1},{"index":5,"intensity":1},{"index":2,"intensity":1},{"index":0,"intensity":1},{"index":3,"intensity":1}],"startTime":100}]},"mode":"DOT_MODE","pathMode":{"feedback":[]}}},"name":"Effect 1","offsetTime":200,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629369702443},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/interact_item_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629620038278,"description":"","id":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"interact_item_l","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":250,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.5,"time":0,"x":0,"y":0},{"intensity":0.5,"time":250,"x":0,"y":1}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.5,"time":0,"x":0.5,"y":0},{"intensity":0.5,"time":250,"x":0.5,"y":1}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.5,"time":0,"x":1,"y":0},{"intensity":0.5,"time":250,"x":1,"y":1}],"visible":true}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":250,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[]}}},"name":"Effect 1","offsetTime":250,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1630139365191},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/interact_item_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629553508485,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"interact_item_r","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":250,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":250,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.5,"time":0,"x":0,"y":0},{"intensity":0.5,"time":250,"x":0,"y":1}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.5,"time":0,"x":0.5,"y":0},{"intensity":0.5,"time":250,"x":0.5,"y":1}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.5,"time":0,"x":1,"y":0},{"intensity":0.5,"time":250,"x":1,"y":1}],"visible":true}]}}},"name":"Effect 1","offsetTime":250,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1630139312853},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/landing.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1630143774604,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"landing","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":300,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.6,"time":0,"x":0.5,"y":0},{"intensity":0.6,"time":300,"x":0,"y":1}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.6,"time":0,"x":1,"y":0.01},{"intensity":0.6,"time":300,"x":0.5,"y":1}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.6,"time":0,"x":0,"y":0},{"intensity":0.6,"time":300,"x":0.5,"y":1}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.6,"time":0,"x":0.5,"y":0},{"intensity":0.6,"time":300,"x":1,"y":1}],"visible":true}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":300,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.6,"time":0,"x":0.5,"y":0},{"intensity":0.6,"time":300,"x":0,"y":1}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.6,"time":0,"x":1,"y":0.01},{"intensity":0.6,"time":300,"x":0.5,"y":1}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.6,"time":0,"x":0,"y":0},{"intensity":0.6,"time":300,"x":0.5,"y":1}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.6,"time":0,"x":0.5,"y":0},{"intensity":0.6,"time":300,"x":1,"y":1}],"visible":true}]}}},"name":"Effect 1","offsetTime":300,"startTime":549}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1630144011417},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/out_of_ammo_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1630139249490,"description":"","id":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"need_ammo_l","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":3,"intensity":0.6},{"index":5,"intensity":0.6},{"index":0,"intensity":0.6},{"index":2,"intensity":0.6}],"startTime":0},{"endTime":200,"playbackType":"FADE_OUT","pointList":[{"index":0,"intensity":0.6},{"index":3,"intensity":0.6},{"index":5,"intensity":0.6},{"index":2,"intensity":0.6}],"startTime":100}]},"mode":"DOT_MODE","pathMode":{"feedback":[]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[]}}},"name":"Effect 1","offsetTime":200,"startTime":200}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1630139268296},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/out_of_ammo_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1630138969975,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"out_of_ammo_r","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":3,"intensity":0.6},{"index":5,"intensity":0.6},{"index":0,"intensity":0.6},{"index":2,"intensity":0.6}],"startTime":0},{"endTime":200,"playbackType":"FADE_OUT","pointList":[{"index":0,"intensity":0.6},{"index":3,"intensity":0.6},{"index":5,"intensity":0.6},{"index":2,"intensity":0.6}],"startTime":100}]},"mode":"DOT_MODE","pathMode":{"feedback":[]}}},"name":"Effect 1","offsetTime":200,"startTime":504}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1630172391442},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/reload_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629620143740,"description":"","id":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"reload_l","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.6,"time":0,"x":0,"y":0},{"intensity":0.6,"time":250,"x":1,"y":0},{"intensity":0.6,"time":500,"x":1,"y":1},{"intensity":0.6,"time":750,"x":0,"y":1},{"intensity":0.6,"time":1000,"x":0,"y":0}],"visible":true}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[]}}},"name":"Effect 1","offsetTime":1000,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629620155170},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/arms/reload_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629369769874,"description":"","layout":{"layouts":{"ForearmL":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}],"ForearmR":[{"index":0,"x":0,"y":0},{"index":1,"x":0.5,"y":0},{"index":2,"x":1,"y":0},{"index":3,"x":0,"y":1},{"index":4,"x":0.5,"y":1},{"index":5,"x":1,"y":1}]},"name":"Tactosy2","type":"Tactosy2"},"mediaFileDuration":3,"name":"reload_r","tracks":[{"effects":[{"modes":{"ForearmL":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"ForearmR":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.6,"time":0,"x":0,"y":0},{"intensity":0.6,"time":250,"x":1,"y":0},{"intensity":0.6,"time":500,"x":1,"y":1},{"intensity":0.6,"time":750,"x":0,"y":1},{"intensity":0.6,"time":1000,"x":0,"y":0}],"visible":true}]}}},"name":"Effect 1","offsetTime":1000,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629386064631},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/damage.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629047022336,"description":"","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":0.2,"name":"damage","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0.499,"y":0.494}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0.571,"y":0.5}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0.426,"y":0.5}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0.498,"y":0.435}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0.49,"y":0.555}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0.58,"y":0.45}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0.42,"y":0.57}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0.55,"y":0.59}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0.42,"y":0.44}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0.48,"y":0.51}],"visible":true}]}}},"name":"path","offsetTime":200,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629554346425},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/elevator_deploying.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1630051650579,"description":"","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":3,"name":"elevator_deploying","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","pointList":[{"index":12,"intensity":0.3},{"index":15,"intensity":0.3},{"index":9,"intensity":0.3},{"index":10,"intensity":0.3},{"index":17,"intensity":0.3},{"index":18,"intensity":0.3},{"index":4,"intensity":0.3},{"index":7,"intensity":0.3}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","pointList":[{"index":0,"intensity":0.3},{"index":6,"intensity":0.3},{"index":5,"intensity":0.3},{"index":3,"intensity":0.3},{"index":8,"intensity":0.3},{"index":11,"intensity":0.3}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":1000,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1630051838199},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/explosion.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1631957252624,"description":"","id":"-MjsDrJM-J59EzH_o5pz","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":1,"name":"explosion","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[]}},"VestFront":{"dotMode":{"dotConnected":true,"feedback":[{"endTime":133,"playbackType":"NONE","pointList":[{"index":9,"intensity":1},{"index":10,"intensity":1}],"startTime":0},{"endTime":266,"playbackType":"NONE","pointList":[{"index":5,"intensity":0.9},{"index":8,"intensity":0.9},{"index":13,"intensity":0.9},{"index":14,"intensity":0.9},{"index":6,"intensity":0.9},{"index":11,"intensity":0.9}],"startTime":133},{"endTime":400,"playbackType":"NONE","pointList":[{"index":4,"intensity":0.6},{"index":12,"intensity":0.6},{"index":15,"intensity":0.6},{"index":7,"intensity":0.6},{"index":17,"intensity":0.6},{"index":18,"intensity":0.6},{"index":1,"intensity":0.6},{"index":2,"intensity":0.6}],"startTime":266},{"endTime":400,"playbackType":"NONE","pointList":[{"index":19,"intensity":0.4},{"index":16,"intensity":0.4},{"index":0,"intensity":0.4},{"index":3,"intensity":0.4},{"index":8,"intensity":0.4},{"index":11,"intensity":0.4}],"startTime":400}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 1","offsetTime":400,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1631969320664},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/fire_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629619615586,"description":"","id":"","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":3,"name":"fire_l","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":0,"intensity":0.8}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":0,"intensity":0.9},{"index":4,"intensity":0.9},{"index":1,"intensity":0.9},{"index":2,"intensity":0.9},{"index":8,"intensity":0.9},{"index":5,"intensity":0.9}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 2","offsetTime":100,"startTime":2}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629632464119},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/fire_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629047097728,"description":"","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":3,"name":"fire_r","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":3,"intensity":0.8}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":100,"playbackType":"NONE","pointList":[{"index":3,"intensity":0.9},{"index":7,"intensity":0.9},{"index":2,"intensity":0.9},{"index":1,"intensity":0.9},{"index":11,"intensity":0.9},{"index":6,"intensity":0.9}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 2","offsetTime":100,"startTime":2}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629632442072},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/gain_disinfection.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1630089503726,"description":"","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":3,"name":"gain_disinfection","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0,"y":1},{"intensity":1,"time":200,"x":0,"y":0},{"intensity":1,"time":266,"x":0.33,"y":0},{"intensity":1,"time":466,"x":0.33,"y":1},{"intensity":1,"time":532,"x":0.66,"y":1},{"intensity":1,"time":732,"x":0.67,"y":0},{"intensity":1,"time":798,"x":1,"y":0},{"intensity":1,"time":1000,"x":1,"y":1}],"visible":true}]}}},"name":"Effect 1","offsetTime":1000,"startTime":0},{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":800,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":1,"y":1},{"intensity":1,"time":160,"x":1,"y":0},{"intensity":1,"time":214,"x":0.66,"y":0},{"intensity":1,"time":374,"x":0.66,"y":1},{"intensity":1,"time":426,"x":0.33,"y":1},{"intensity":1,"time":586,"x":0.33,"y":0},{"intensity":1,"time":638,"x":0,"y":0},{"intensity":1,"time":800,"x":0,"y":1}],"visible":true}]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":800,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"Effect 2","offsetTime":800,"startTime":999}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1631345968289},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/hammer_charging_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629619565459,"description":"","id":"","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":3,"name":"hammer_charging_l","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","pointList":[{"index":1,"intensity":0.3},{"index":0,"intensity":0.3},{"index":4,"intensity":0.3}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[]}}},"name":"Effect 2","offsetTime":200,"startTime":0}],"enable":true},{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","pointList":[{"index":1,"intensity":0.3},{"index":0,"intensity":0.3},{"index":4,"intensity":0.3}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[]}}},"name":"Effect 1","offsetTime":200,"startTime":7}],"enable":true}],"updatedAt":1629619575954},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/hammer_charging_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629047597097,"description":"","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":3,"name":"hammer_charging_r","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","pointList":[{"index":2,"intensity":0.3},{"index":3,"intensity":0.3},{"index":7,"intensity":0.3}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[]}}},"name":"Effect 2","offsetTime":200,"startTime":0}],"enable":true},{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":200,"playbackType":"NONE","pointList":[{"index":2,"intensity":0.3},{"index":3,"intensity":0.3},{"index":7,"intensity":0.3}],"startTime":0}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[]}}},"name":"Effect 1","offsetTime":200,"startTime":7}],"enable":true}],"updatedAt":1629384898983},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/hammer_fully_charged_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629619373278,"description":"","id":"","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":3,"name":"hammer_fully_charged_l","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":250,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.7,"time":0,"x":0.33999999999999997,"y":0},{"intensity":0.7,"time":250,"x":1,"y":0.75}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.7,"time":0,"x":0,"y":0.26},{"intensity":0.7,"time":250,"x":0.6599999999999999,"y":1}],"visible":true}]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":250,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0.33999999999999997,"y":0},{"intensity":1,"time":250,"x":1,"y":0.74}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0,"y":0.25},{"intensity":1,"time":250,"x":0.6699999999999999,"y":1}],"visible":true}]}}},"name":"Effect 1","offsetTime":250,"startTime":50}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629619396528},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/hammer_fully_charged_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629567569403,"description":"","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":3,"name":"hammer_fully_charged_r","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":250,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.7,"time":0,"x":0.66,"y":0},{"intensity":0.7,"time":250,"x":0,"y":0.75}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.7,"time":0,"x":1,"y":0.26},{"intensity":0.7,"time":250,"x":0.34,"y":1}],"visible":true}]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":250,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":0.66,"y":0},{"intensity":1,"time":250,"x":0,"y":0.74}],"visible":true},{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":1,"time":0,"x":1,"y":0.25},{"intensity":1,"time":250,"x":0.33,"y":1}],"visible":true}]}}},"name":"Effect 1","offsetTime":250,"startTime":50}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629568317574},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/need_health.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1630138787339,"description":"","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":1,"name":"LowHealth","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":true,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":88,"playbackType":"NONE","startTime":0,"pointList":[]},{"endTime":176,"playbackType":"NONE","pointList":[{"index":1,"intensity":0.4},{"index":5,"intensity":0.4},{"index":0,"intensity":0.4}],"startTime":88},{"endTime":265,"playbackType":"NONE","startTime":176,"pointList":[]}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"dot","offsetTime":265,"startTime":0}],"enable":true},{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":true,"feedback":[]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":82,"playbackType":"NONE","startTime":0,"pointList":[]},{"endTime":164,"playbackType":"NONE","pointList":[{"index":1,"intensity":0.4},{"index":5,"intensity":0.4}],"startTime":82},{"endTime":246,"playbackType":"NONE","startTime":164,"pointList":[]}]},"mode":"DOT_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]}}},"name":"dot","offsetTime":246,"startTime":189}],"enable":true}],"updatedAt":1630138799737},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/reload_l.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629619593546,"description":"","id":"","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":3,"name":"reload_l","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.5,"time":0,"x":0.27,"y":0},{"intensity":0.5,"time":170,"x":0.38,"y":0.15},{"intensity":0.5,"time":321,"x":0.33999999999999997,"y":0.31},{"intensity":0.5,"time":501,"x":0.16000000000000003,"y":0.39},{"intensity":0.5,"time":665,"x":0,"y":0.31},{"intensity":0.5,"time":867,"x":0,"y":0.09},{"intensity":0.5,"time":1000,"x":0.10999999999999999,"y":0}],"visible":true}]}}},"name":"Effect 1","offsetTime":1000,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629619602263},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/vest/reload_r.tact: -------------------------------------------------------------------------------- 1 | {"project":{"createdAt":1629047485545,"description":"","layout":{"layouts":{"VestBack":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}],"VestFront":[{"index":0,"x":0,"y":0},{"index":1,"x":0.333,"y":0},{"index":2,"x":0.667,"y":0},{"index":3,"x":1,"y":0},{"index":4,"x":0,"y":0.25},{"index":5,"x":0.333,"y":0.25},{"index":6,"x":0.667,"y":0.25},{"index":7,"x":1,"y":0.25},{"index":8,"x":0,"y":0.5},{"index":9,"x":0.333,"y":0.5},{"index":10,"x":0.667,"y":0.5},{"index":11,"x":1,"y":0.5},{"index":12,"x":0,"y":0.75},{"index":13,"x":0.333,"y":0.75},{"index":14,"x":0.667,"y":0.75},{"index":15,"x":1,"y":0.75},{"index":16,"x":0,"y":1},{"index":17,"x":0.333,"y":1},{"index":18,"x":0.667,"y":1},{"index":19,"x":1,"y":1}]},"name":"Tactot","type":"Tactot"},"mediaFileDuration":3,"name":"reload_r","tracks":[{"effects":[{"modes":{"VestBack":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[]}},"VestFront":{"dotMode":{"dotConnected":false,"feedback":[{"endTime":1000,"playbackType":"NONE","startTime":0,"pointList":[]}]},"mode":"PATH_MODE","pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","pointList":[{"intensity":0.5,"time":0,"x":0.73,"y":0},{"intensity":0.5,"time":170,"x":0.62,"y":0.15},{"intensity":0.5,"time":321,"x":0.66,"y":0.31},{"intensity":0.5,"time":501,"x":0.84,"y":0.39},{"intensity":0.5,"time":665,"x":1,"y":0.31},{"intensity":0.5,"time":867,"x":1,"y":0.09},{"intensity":0.5,"time":1000,"x":0.89,"y":0}],"visible":true}]}}},"name":"Effect 1","offsetTime":1000,"startTime":0}],"enable":true},{"enable":true,"effects":[]}],"updatedAt":1629537874642},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/visor/boom1_head.tact: -------------------------------------------------------------------------------- 1 | {"project":{"category":"Default","tags":["strong","attacked","explosion"],"uploader":"z9bOgSGZNvMXxvhdbg4Fwi6UeCM2","mediaFileDuration":1,"name":"Boom1_Head","id":"upoba0QRLxoROocIky27","media":{"name":"","mediaType":"None","description":"","link":"","updateTime":0,"duration":0},"description":"A relatively long, non-dynamic haptic with strong intensity\nMostly used for attacked explosion","tracks":[{"enable":true,"effects":[{"name":"Effect 1","offsetTime":500,"startTime":0,"modes":{"Head":{"dotMode":{"dotConnected":false,"feedback":[{"startTime":0,"endTime":500,"playbackType":"FADE_OUT","pointList":[{"intensity":1,"index":0},{"intensity":1,"index":1},{"intensity":1,"index":2},{"intensity":1,"index":3}]}]},"pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]},"mode":"DOT_MODE"}}}]},{"enable":true,"effects":[]}],"layout":{"name":"TactVisor","type":"TactVisor","layouts":{"Head":[{"index":0,"y":0.5,"x":0},{"index":1,"y":0.5,"x":0.3},{"index":2,"y":0.5,"x":0.7},{"index":3,"y":0.5,"x":1}]}},"createdAt":1662365903996,"updatedAt":1662365903996},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/visor/boom4_head.tact: -------------------------------------------------------------------------------- 1 | {"project":{"category":"Default","tags":["normal","attacked","explosion"],"uploader":"z9bOgSGZNvMXxvhdbg4Fwi6UeCM2","mediaFileDuration":1,"name":"Boom4_Head","id":"m7g5vcSt9F8RsLp3ZmEr","media":{"name":"","mediaType":"None","description":"","link":"","updateTime":0,"duration":0},"description":"A relatively long, non-dynamic haptic with normal intensity\nMostly used for attacked explosion","tracks":[{"enable":true,"effects":[{"name":"Effect 1","offsetTime":450,"startTime":0,"modes":{"Head":{"dotMode":{"dotConnected":false,"feedback":[{"startTime":0,"endTime":450,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":0,"index":1},{"intensity":0,"index":2},{"intensity":0,"index":3}]}]},"pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"FADE_OUT","visible":true,"pointList":[{"intensity":1,"time":0,"x":0.56,"y":0.5},{"intensity":1,"time":450,"x":1,"y":0.5}]},{"movingPattern":"CONST_SPEED","playbackType":"FADE_OUT","visible":true,"pointList":[{"intensity":1,"time":0,"x":0.43,"y":0.5},{"intensity":1,"time":450,"x":0,"y":0.5}]}]},"mode":"PATH_MODE"}}}]},{"enable":true,"effects":[{"name":"Effect 1 copy 1","offsetTime":300,"startTime":200,"modes":{"Head":{"dotMode":{"dotConnected":false,"feedback":[{"startTime":0,"endTime":300,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":0,"index":1},{"intensity":0,"index":2},{"intensity":0,"index":3}]}]},"pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"FADE_OUT","visible":true,"pointList":[{"intensity":1,"time":0,"x":0.56,"y":0.5},{"intensity":1,"time":300,"x":1,"y":0.5}]},{"movingPattern":"CONST_SPEED","playbackType":"FADE_OUT","visible":true,"pointList":[{"intensity":1,"time":0,"x":0.43,"y":0.5},{"intensity":1,"time":300,"x":0,"y":0.5}]}]},"mode":"PATH_MODE"}}}]}],"layout":{"name":"TactVisor","type":"TactVisor","layouts":{"Head":[{"index":0,"y":0.5,"x":0},{"index":1,"y":0.5,"x":0.3},{"index":2,"y":0.5,"x":0.7},{"index":3,"y":0.5,"x":1}]}},"createdAt":1662365922557,"updatedAt":1662365922557},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/visor/boom6_head.tact: -------------------------------------------------------------------------------- 1 | {"project":{"category":"Default","tags":["strong","attacked","explosion"],"uploader":"z9bOgSGZNvMXxvhdbg4Fwi6UeCM2","mediaFileDuration":1,"name":"Boom6_Head","id":"A4wLGorljv5NxALVbh1T","media":{"name":"","mediaType":"None","description":"","link":"","updateTime":0,"duration":0},"description":"A relatively long, non-dynamic haptic with strong intensity\nMostly used for attacked explosion","tracks":[{"enable":true,"effects":[{"name":"Effect 1","offsetTime":600,"startTime":0,"modes":{"Head":{"dotMode":{"dotConnected":false,"feedback":[{"startTime":0,"endTime":600,"playbackType":"FADE_OUT","pointList":[{"intensity":0,"index":0},{"intensity":1,"index":1},{"intensity":1,"index":2},{"intensity":0,"index":3}]}]},"pathMode":{"feedback":[]},"mode":"DOT_MODE"}}},{"name":"Effect 2","offsetTime":400,"startTime":599,"modes":{"Head":{"dotMode":{"dotConnected":false,"feedback":[{"startTime":0,"endTime":400,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":0,"index":1},{"intensity":0,"index":2},{"intensity":0,"index":3}]}]},"pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"FADE_OUT","visible":true,"pointList":[{"intensity":1,"time":0,"x":0.5,"y":0.5},{"intensity":1,"time":400,"x":0,"y":0.5}]},{"movingPattern":"CONST_SPEED","playbackType":"FADE_OUT","visible":true,"pointList":[{"intensity":1,"time":0,"x":0.5,"y":0.5},{"intensity":1,"time":400,"x":1,"y":0.49}]}]},"mode":"PATH_MODE"}}}]},{"enable":true,"effects":[{"name":"Effect 3","offsetTime":300,"startTime":132,"modes":{"Head":{"dotMode":{"dotConnected":false,"feedback":[{"startTime":0,"endTime":300,"playbackType":"NONE","pointList":[{"intensity":1,"index":0},{"intensity":1,"index":1},{"intensity":1,"index":2},{"intensity":1,"index":3}]}]},"pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]},"mode":"DOT_MODE"}}}]}],"layout":{"name":"TactVisor","type":"TactVisor","layouts":{"Head":[{"index":0,"y":0.5,"x":0},{"index":1,"y":0.5,"x":0.3},{"index":2,"y":0.5,"x":0.7},{"index":3,"y":0.5,"x":1}]}},"createdAt":1662365949267,"updatedAt":1662365949267},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/visor/point7_head.tact: -------------------------------------------------------------------------------- 1 | {"project":{"category":"Default","tags":["normal","alert","equip"],"uploader":"z9bOgSGZNvMXxvhdbg4Fwi6UeCM2","mediaFileDuration":1,"name":"Point7_Head","id":"PJYseIuAPBjuqYbPOHia","media":{"name":"","mediaType":"None","description":"","link":"","updateTime":0,"duration":0},"description":"A relatively short, non-dynamic haptic with normal intensity\nMostly used for alert equip","tracks":[{"enable":true,"effects":[{"name":"Effect 1","offsetTime":300,"startTime":0,"modes":{"Head":{"dotMode":{"dotConnected":false,"feedback":[{"startTime":0,"endTime":100,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":1,"index":1},{"intensity":1,"index":2},{"intensity":0,"index":3}]},{"startTime":100,"endTime":200,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":0,"index":1},{"intensity":0,"index":2},{"intensity":0,"index":3}]},{"startTime":200,"endTime":300,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":1,"index":1},{"intensity":1,"index":2},{"intensity":0,"index":3}]}]},"pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]},"mode":"DOT_MODE"}}}]},{"enable":true,"effects":[]}],"layout":{"name":"TactVisor","type":"TactVisor","layouts":{"Head":[{"index":0,"y":0.5,"x":0},{"index":1,"y":0.5,"x":0.3},{"index":2,"y":0.5,"x":0.7},{"index":3,"y":0.5,"x":1}]}},"createdAt":1662365996320,"updatedAt":1662365996320},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/visor/point8_head.tact: -------------------------------------------------------------------------------- 1 | {"project":{"category":"Default","tags":["normal","alert","equip"],"uploader":"z9bOgSGZNvMXxvhdbg4Fwi6UeCM2","mediaFileDuration":1,"name":"Point8_Head","id":"JyJ01KxHM8Uq0slBqhNo","media":{"name":"","mediaType":"None","description":"","link":"","updateTime":0,"duration":0},"description":"A relatively short, non-dynamic haptic with normal intensity\nMostly used for alert equip","tracks":[{"enable":true,"effects":[{"name":"Effect 1","offsetTime":300,"startTime":0,"modes":{"Head":{"dotMode":{"dotConnected":false,"feedback":[{"startTime":0,"endTime":100,"playbackType":"NONE","pointList":[{"intensity":1,"index":0},{"intensity":0,"index":1},{"intensity":0,"index":2},{"intensity":1,"index":3}]},{"startTime":100,"endTime":200,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":0,"index":1},{"intensity":0,"index":2},{"intensity":0,"index":3}]},{"startTime":200,"endTime":300,"playbackType":"NONE","pointList":[{"intensity":1,"index":0},{"intensity":0,"index":1},{"intensity":0,"index":2},{"intensity":1,"index":3}]}]},"pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]},"mode":"DOT_MODE"}}}]},{"enable":true,"effects":[]}],"layout":{"name":"TactVisor","type":"TactVisor","layouts":{"Head":[{"index":0,"y":0.5,"x":0},{"index":1,"y":0.5,"x":0.3},{"index":2,"y":0.5,"x":0.7},{"index":3,"y":0.5,"x":1}]}},"createdAt":1662366001492,"updatedAt":1662366001492},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/visor/point9_head.tact: -------------------------------------------------------------------------------- 1 | {"project":{"category":"Default","tags":["normal","alert","equip"],"uploader":"z9bOgSGZNvMXxvhdbg4Fwi6UeCM2","mediaFileDuration":1,"name":"Point9_Head","id":"qnvdbdmYwb9Tojx5tWQc","media":{"name":"","mediaType":"None","description":"","link":"","updateTime":0,"duration":0},"description":"A relatively short, non-dynamic haptic with normal intensity\nMostly used for alert equip","tracks":[{"enable":true,"effects":[{"name":"Effect 1","offsetTime":400,"startTime":0,"modes":{"Head":{"dotMode":{"dotConnected":false,"feedback":[{"startTime":0,"endTime":133,"playbackType":"FADE_OUT","pointList":[{"intensity":1,"index":0},{"intensity":1,"index":1},{"intensity":1,"index":2},{"intensity":1,"index":3}]},{"startTime":133,"endTime":266,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":0,"index":1},{"intensity":0,"index":2},{"intensity":0,"index":3}]},{"startTime":266,"endTime":400,"playbackType":"FADE_OUT","pointList":[{"intensity":1,"index":0},{"intensity":1,"index":1},{"intensity":1,"index":2},{"intensity":1,"index":3}]}]},"pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]},"mode":"DOT_MODE"}}}]},{"enable":true,"effects":[]}],"layout":{"name":"TactVisor","type":"TactVisor","layouts":{"Head":[{"index":0,"y":0.5,"x":0},{"index":1,"y":0.5,"x":0.3},{"index":2,"y":0.5,"x":0.7},{"index":3,"y":0.5,"x":1}]}},"createdAt":1662366007517,"updatedAt":1662366007517},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/visor/rumble1_head.tact: -------------------------------------------------------------------------------- 1 | {"project":{"category":"Default","tags":["medium","electric","flame","earthquake","hurricane"],"uploader":"z9bOgSGZNvMXxvhdbg4Fwi6UeCM2","mediaFileDuration":1,"name":"Rumble1_Head","id":"HZlkbVgj68UZLf1B9DWP","media":{"name":"","mediaType":"None","description":"","link":"","updateTime":0,"duration":0},"description":"A relatively dynamic haptic with medium duration\nMostly used for electric flame earthquake hurricane","tracks":[{"enable":true,"effects":[{"name":"Effect 1","offsetTime":1000,"startTime":0,"modes":{"Head":{"dotMode":{"dotConnected":true,"feedback":[{"startTime":0,"endTime":200,"playbackType":"NONE","pointList":[{"intensity":1,"index":0},{"intensity":1,"index":1},{"intensity":0,"index":2},{"intensity":0,"index":3}]},{"startTime":200,"endTime":400,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":0,"index":1},{"intensity":1,"index":2},{"intensity":1,"index":3}]},{"startTime":400,"endTime":600,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":1,"index":1},{"intensity":1,"index":2},{"intensity":0,"index":3}]},{"startTime":600,"endTime":800,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":1,"index":1},{"intensity":0,"index":2},{"intensity":1,"index":3}]},{"startTime":800,"endTime":1000,"playbackType":"NONE","pointList":[{"intensity":1,"index":0},{"intensity":1,"index":1},{"intensity":0,"index":2},{"intensity":0,"index":3}]},{"startTime":1000,"endTime":1000,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":0,"index":1},{"intensity":1,"index":2},{"intensity":1,"index":3}]}]},"pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]},"mode":"DOT_MODE"}}}]},{"enable":true,"effects":[]}],"layout":{"name":"TactVisor","type":"TactVisor","layouts":{"Head":[{"index":0,"y":0.5,"x":0},{"index":1,"y":0.5,"x":0.3},{"index":2,"y":0.5,"x":0.7},{"index":3,"y":0.5,"x":1}]}},"createdAt":1662366039712,"updatedAt":1662366039712},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics-patterns/visor/splatdropping.tact: -------------------------------------------------------------------------------- 1 | {"project":{"category":"Default","tags":["long","equip","charge"],"uploader":"eghPQlZojuUAqMalinjFs4NsBeh1","mediaFileDuration":2,"name":"splatdropping","id":"Kru5keS6RuH3nnPfiKZe","media":{"name":"","mediaType":"None","description":"","link":"","updateTime":0,"duration":0},"description":"A relatively dynamic haptic with long duration\nMostly used for equip charge","tracks":[{"enable":true,"effects":[{"name":"Effect 3","offsetTime":1037,"startTime":964,"modes":{"Head":{"dotMode":{"dotConnected":false,"feedback":[{"startTime":0,"endTime":1037,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":0,"index":1},{"intensity":0,"index":2},{"intensity":0,"index":3}]}]},"pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"FADE_OUT","visible":true,"pointList":[{"intensity":0.3,"time":0,"x":0.01,"y":0.24},{"intensity":0.3,"time":1037,"x":0.02,"y":1}]},{"movingPattern":"CONST_SPEED","playbackType":"FADE_OUT","visible":true,"pointList":[{"intensity":0.4,"time":0,"x":0.39,"y":0},{"intensity":0.4,"time":1037,"x":0.41,"y":0.69}]},{"movingPattern":"CONST_SPEED","playbackType":"FADE_OUT","visible":true,"pointList":[{"intensity":0.3,"time":0,"x":1,"y":0.5},{"intensity":0.3,"time":1037,"x":1,"y":0.95}]}]},"mode":"PATH_MODE"}}},{"name":"Effect 4","offsetTime":240,"startTime":0,"modes":{"Head":{"dotMode":{"dotConnected":false,"feedback":[{"startTime":0,"endTime":240,"playbackType":"NONE","pointList":[{"intensity":0.5,"index":0},{"intensity":0.5,"index":3},{"intensity":0.5,"index":2},{"intensity":0.5,"index":1}]}]},"pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"NONE","visible":true,"pointList":[]}]},"mode":"DOT_MODE"}}}]},{"enable":true,"effects":[{"name":"Effect 3","offsetTime":925,"startTime":162,"modes":{"Head":{"dotMode":{"dotConnected":false,"feedback":[{"startTime":0,"endTime":925,"playbackType":"NONE","pointList":[{"intensity":0,"index":0},{"intensity":0,"index":1},{"intensity":0,"index":2},{"intensity":0,"index":3}]}]},"pathMode":{"feedback":[{"movingPattern":"CONST_SPEED","playbackType":"FADE_OUT","visible":true,"pointList":[{"intensity":0.4,"time":0,"x":0.03,"y":0.49},{"intensity":0.4,"time":925,"x":0.02,"y":1}]},{"movingPattern":"CONST_SPEED","playbackType":"FADE_OUT","visible":true,"pointList":[{"intensity":0.3,"time":0,"x":0.7,"y":0.5},{"intensity":0.3,"time":925,"x":0.72,"y":0.97}]},{"movingPattern":"CONST_SPEED","playbackType":"FADE_OUT","visible":true,"pointList":[{"intensity":0.3,"time":0,"x":0.44,"y":0.52},{"intensity":0.3,"time":925,"x":0.45,"y":0.99}]}]},"mode":"PATH_MODE"}}}]}],"layout":{"name":"TactVisor","type":"TactVisor","layouts":{"Head":[{"index":0,"y":0.5,"x":0},{"index":1,"y":0.5,"x":0.3},{"index":2,"y":0.5,"x":0.7},{"index":3,"y":0.5,"x":1}]}},"createdAt":1691196707292,"updatedAt":1691196956080},"durationMillis":0,"intervalMillis":20,"size":20} -------------------------------------------------------------------------------- /Release_Dependencies/libs/bhaptics_library.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSprtn/GTFO_VR_Plugin/1f81eca31c51652cbc2a8ce654639e4b0f24a9d2/Release_Dependencies/libs/bhaptics_library.dll -------------------------------------------------------------------------------- /Release_Dependencies/libs/openvr_api.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSprtn/GTFO_VR_Plugin/1f81eca31c51652cbc2a8ce654639e4b0f24a9d2/Release_Dependencies/libs/openvr_api.dll --------------------------------------------------------------------------------