Hazuzi

Advanced Control Code

Mar 27th, 2022
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.04 KB | None | 0 0
  1. ----------------------------------------------------------------
  2. -- Advanced Control Mod 0.8.1
  3. -- https://www.nexusmods.com/cyberpunk2077/mods/1902
  4. ----------------------------------------------------------------
  5.  
  6. -- Settings
  7. disableAutoCover = false
  8. disableFirstEquip = false
  9.  
  10. -- Vars
  11. isWalking = false
  12. isLeanLeft = false
  13. isLeanRight = false
  14. firstEquip = false
  15. CurrentGrenade = 0
  16. Grenades = {}
  17. timer = 0.0
  18.  
  19. -- Init
  20. registerForEvent('onInit', function()
  21.  
  22. setupWalk()
  23.  
  24. setupFirstEquip()
  25.  
  26. setupDisableAutoCover()
  27.  
  28. end)
  29.  
  30. -- Shutdown
  31. registerForEvent('onShutdown', function()
  32. setupWalk(false)
  33. end)
  34.  
  35. -- Update
  36. registerForEvent('onUpdate', function(delta)
  37.  
  38. if timer > 0.0 then
  39. timer = timer + delta
  40. end
  41.  
  42. if not isLeanLeft and not isLeanRight then
  43. return
  44. end
  45.  
  46. if not IsPlayerAiming() then
  47.  
  48. isLeanLeft = false
  49. isLeanRight = false
  50.  
  51. local player = Game.GetPlayer()
  52. local event = PlayerCoverStatusChangedEvent.new()
  53.  
  54. event.fullyBehindCover = false
  55.  
  56. player:QueueEvent(event)
  57.  
  58. end
  59.  
  60. end)
  61.  
  62. -- Lean Left (Toggle)
  63. registerInput('advanced_control_lean_left', 'Lean Left (Toggle)', function(key)
  64.  
  65. if not key or IsPlayerInMenu() or not IsPlayerAiming() then
  66. return
  67. end
  68.  
  69. -- Cover + Aim
  70. if IsPlayerCover() then
  71.  
  72. local coverDirection = getCoverDirection()
  73.  
  74. if coverDirection.value == 'Left' then
  75.  
  76. leanToLeft() -- center
  77. leanToLeft() -- force left
  78. isLeanLeft = true
  79. isLeanRight = false
  80.  
  81. elseif coverDirection.value == 'Right' then
  82.  
  83. leanToRight(true) -- center
  84. isLeanLeft = false
  85. isLeanRight = false
  86.  
  87. else
  88.  
  89. leanToLeft()
  90. isLeanLeft = true
  91. isLeanRight = false
  92.  
  93. end
  94.  
  95. -- Aim
  96. else
  97.  
  98. if isLeanLeft then
  99.  
  100. leanToRight(true)
  101. isLeanLeft = false
  102. isLeanRight = false
  103.  
  104. elseif isLeanRight then
  105.  
  106. leanToLeft(true)
  107. isLeanLeft = false
  108. isLeanRight = false
  109.  
  110. else
  111.  
  112. leanToLeft()
  113. isLeanLeft = true
  114. isLeanRight = false
  115. end
  116.  
  117. end
  118.  
  119. end)
  120.  
  121.  
  122. -- Lean Right (Toggle)
  123. registerInput('advanced_control_lean_right', 'Lean Right (Toggle)', function(key)
  124.  
  125. if not key or IsPlayerInMenu() or not IsPlayerAiming() then
  126. return
  127. end
  128.  
  129. -- Cover + Aim
  130. if IsPlayerCover() then
  131.  
  132. local coverDirection = getCoverDirection()
  133.  
  134. if coverDirection.value == 'Right' then
  135.  
  136. leanToRight() -- center
  137. leanToRight() -- force right
  138. isLeanLeft = false
  139. isLeanRight = true
  140.  
  141. elseif coverDirection.value == 'Left' then
  142.  
  143. leanToLeft(true) -- center
  144. isLeanLeft = false
  145. isLeanRight = false
  146.  
  147. else
  148.  
  149. leanToRight()
  150. isLeanLeft = false
  151. isLeanRight = true
  152.  
  153. end
  154.  
  155. -- Aim
  156. else
  157.  
  158. if isLeanRight then
  159.  
  160. leanToLeft(true)
  161. isLeanLeft = false
  162. isLeanRight = false
  163.  
  164. elseif isLeanLeft then
  165.  
  166. leanToRight(true)
  167. isLeanLeft = false
  168. isLeanRight = false
  169.  
  170. else
  171.  
  172. leanToRight()
  173. isLeanLeft = false
  174. isLeanRight = true
  175. end
  176.  
  177. end
  178.  
  179. end)
  180.  
  181. -- Lean Left (Hold)
  182. registerInput('advanced_control_lean_left_hold', 'Lean Left (Hold)', function(key)
  183.  
  184. if IsPlayerInMenu() or not IsPlayerAiming() then
  185. return
  186. end
  187.  
  188. if key then
  189.  
  190. if IsPlayerCover() then
  191.  
  192. leanToLeft() -- center
  193. leanToLeft() -- force left
  194. isLeanLeft = true
  195. isLeanRight = false
  196.  
  197. else
  198.  
  199. leanToLeft()
  200. isLeanLeft = true
  201. isLeanRight = false
  202.  
  203. end
  204.  
  205. else
  206.  
  207. if isLeanLeft then
  208. leanToRight(true)
  209. isLeanLeft = false
  210. isLeanRight = false
  211. end
  212.  
  213. end
  214.  
  215. end)
  216.  
  217. -- Lean Right (Hold)
  218. registerInput('advanced_control_lean_right_hold', 'Lean Right (Hold)', function(key)
  219.  
  220. if IsPlayerInMenu() or not IsPlayerAiming() then
  221. return
  222. end
  223.  
  224. if key then
  225.  
  226. if IsPlayerCover() then
  227.  
  228. leanToRight() -- center
  229. leanToRight() -- force right
  230. isLeanRight = true
  231. isLeanLeft = false
  232.  
  233. else
  234.  
  235. leanToRight()
  236. isLeanRight = true
  237. isLeanLeft = false
  238.  
  239. end
  240.  
  241. else
  242.  
  243. if isLeanRight then
  244. leanToLeft(true)
  245. isLeanRight = false
  246. isLeanLeft = false
  247. end
  248.  
  249. end
  250.  
  251. end)
  252.  
  253.  
  254. -- Walk
  255. registerHotkey('advanced_control_walk', 'Walk', function()
  256.  
  257. if IsPlayerInMenu() then
  258. return
  259. end
  260.  
  261. if not isWalking then
  262. enableWalk()
  263. else
  264. disableWalk()
  265. end
  266.  
  267. end)
  268.  
  269. -- Walk (Hold)
  270. registerInput('advanced_control_walk_hold', 'Walk (Hold)', function(key)
  271.  
  272. if IsPlayerInMenu() then
  273. return
  274. end
  275.  
  276. if key then
  277. enableWalk()
  278. else
  279. disableWalk()
  280. end
  281.  
  282. end)
  283.  
  284. -- Grenade Next
  285. registerHotkey('advanced_control_grenade_next', 'Cycle Grenade Next', function()
  286.  
  287. if IsPlayerInMenu() or IsPlayerScanner() then
  288. return
  289. end
  290.  
  291. syncGrenades()
  292.  
  293. local equipmentSystem = Game.GetScriptableSystemsContainer():Get('EquipmentSystem')
  294. local equipmentSystemPlayer = equipmentSystem:GetPlayerData(Game.GetPlayer())
  295.  
  296. if CurrentGrenade == #Grenades then
  297.  
  298. equipmentSystemPlayer:EquipItem(Grenades[ #Grenades ].ID, false)
  299. CurrentGrenade = 0
  300.  
  301. else
  302.  
  303. CurrentGrenade = CurrentGrenade + 1
  304. equipmentSystemPlayer:EquipItem(Grenades[ CurrentGrenade ].ID, false)
  305.  
  306. end
  307.  
  308. end)
  309.  
  310. -- Grenade Prev
  311. registerHotkey('advanced_control_grenade_prev', 'Cycle Grenade Previous', function()
  312.  
  313. if IsPlayerInMenu() or IsPlayerScanner() then
  314. return
  315. end
  316.  
  317. syncGrenades()
  318.  
  319. local equipmentSystem = Game.GetScriptableSystemsContainer():Get('EquipmentSystem')
  320. local equipmentSystemPlayer = equipmentSystem:GetPlayerData(Game.GetPlayer())
  321.  
  322. if CurrentGrenade < 1 then
  323. CurrentGrenade = #Grenades
  324. else
  325. CurrentGrenade = CurrentGrenade - 1
  326. end
  327.  
  328. equipmentSystemPlayer:EquipItem(Grenades[ CurrentGrenade ].ID, false)
  329.  
  330. end)
  331.  
  332. -- Holster
  333. registerHotkey('advanced_control_holster', 'Toggle Holster', function()
  334.  
  335. if IsPlayerInMenu() then
  336. return
  337. end
  338.  
  339. local Player = Game.GetPlayer()
  340. local QuickSlotsManager = Player:GetQuickSlotsManager()
  341. local Transaction = Game.GetTransactionSystem()
  342. local Equipment = Game.GetScriptableSystemsContainer():Get('EquipmentSystem')
  343. local PlayerEquipmentData = Equipment:GetPlayerData(Player)
  344. local Weapon = Transaction:GetItemInSlot(Player, TweakDBID.new("AttachmentSlots.WeaponRight"))
  345.  
  346. if Weapon then
  347. QuickSlotsManager:HideWeapon()
  348. else
  349. QuickSlotsManager:RequestWeaponEquip(PlayerEquipmentData:GetActiveWeapon())
  350. end
  351.  
  352. end)
  353.  
  354.  
  355. -- Untrack Quest
  356. registerHotkey('advanced_control_untrack', 'Untrack Quest', function()
  357.  
  358. Game.untrack()
  359.  
  360. local blackboard = Game.GetBlackboardSystem()
  361. local blackboardDefs = Game.GetAllBlackboardDefs()
  362.  
  363. blackboard:Get(blackboardDefs.UI_System):SignalBool(blackboardDefs.UI_System.IsInMenu)
  364.  
  365. end)
  366.  
  367. function setupWalk(enable)
  368.  
  369. local enable = (enable ~= false)
  370.  
  371. -- PlayerSystem
  372. local PlayerSystem = Game.GetPlayerSystem()
  373. if not PlayerSystem then return end
  374.  
  375. -- Player
  376. local Player = PlayerSystem:GetLocalPlayerMainGameObject()
  377. if not Player then return end
  378.  
  379. -- StatSystem
  380. local StatSystem = Game.GetStatsSystem()
  381. if not StatSystem then return end
  382.  
  383. if enable then
  384. WalkEffect = Game['gameRPGManager::CreateStatModifier;gamedataStatTypegameStatModifierTypeFloat']('MaxSpeed', 'Multiplier', 0.4)
  385. else
  386. StatSystem:RemoveModifier(Player:GetEntityID(), WalkEffect)
  387. end
  388.  
  389. end
  390.  
  391. function setupFirstEquip()
  392.  
  393. if (disableFirstEquip) then
  394. return
  395. end
  396.  
  397. Observe('PlayerPuppet', 'OnAction', function(self, action)
  398.  
  399. -- bail early if player in menu or scanner
  400. if IsPlayerInMenu() or IsPlayerScanner() then
  401. return
  402. end
  403.  
  404. local actionName = Game.NameToString(action:GetName(action)) -- Reload
  405. local actionType = action:GetType(action).value -- BUTTON_PRESSED | BUTTON_RELEASED
  406. local actionValue = action:GetValue(action) -- 0 | 1
  407.  
  408. -- bail early if reload button not pressed
  409. if actionName ~= 'Reload' then
  410. return
  411. end
  412.  
  413. if actionType == 'BUTTON_PRESSED' then
  414. timer = timer + 1.0
  415. return
  416. end
  417.  
  418. if actionType == 'BUTTON_RELEASED' and timer < 1.3 then
  419. timer = 0.0
  420. return
  421. end
  422.  
  423. timer = 0.0
  424.  
  425. local Player = Game.GetPlayer()
  426. local Transaction = Game.GetTransactionSystem()
  427. local Weapon = Transaction:GetItemInSlot(Player, TweakDBID.new("AttachmentSlots.WeaponRight"))
  428.  
  429. -- bail early if no weapon
  430. if not Weapon then
  431. return
  432. end
  433.  
  434. local ItemID = Weapon:GetItemID()
  435. local canReload = Game['gameweaponObject::CanReload;WeaponObject'](Weapon)
  436.  
  437. -- bail early if player can reload
  438. if canReload then
  439. return
  440. end
  441.  
  442. local EquipmentSystem = Game.GetScriptableSystemsContainer():Get('EquipmentSystem')
  443. local EquipmentSystemPlayer = EquipmentSystem:GetPlayerData(Player)
  444.  
  445. -- set marker
  446. firstEquip = true
  447.  
  448. -- unequip + equip again
  449. EquipmentSystemPlayer:UnequipItem(ItemID)
  450. EquipmentSystemPlayer:EquipItem(ItemID, false)
  451.  
  452. end)
  453.  
  454. Observe('PlayerPuppet', 'OnWeaponEquipEvent', function(self, event)
  455.  
  456. -- bail early if no marker
  457. if not firstEquip then
  458. return
  459. end
  460.  
  461. -- first equip
  462. firstEquip = false
  463. event.animFeature.firstEquip = true
  464.  
  465. end)
  466.  
  467. end
  468.  
  469. function setupDisableAutoCover()
  470.  
  471. if not disableAutoCover then
  472. return
  473. end
  474.  
  475. Observe('ActivateCoverEvents', 'OnUpdate', function(self)
  476.  
  477. local coverDirection = getCoverDirection()
  478.  
  479. if coverDirection.value == 'Left' then
  480. leanToLeft()
  481. elseif coverDirection.value == 'Right' then
  482. leanToRight()
  483. end
  484.  
  485. end)
  486.  
  487. end
  488.  
  489. function enableWalk()
  490.  
  491. Game.GetStatsSystem():AddModifier(Game.GetPlayer():GetEntityID(), WalkEffect)
  492. isWalking = true
  493.  
  494. end
  495.  
  496. function disableWalk()
  497.  
  498. Game.GetStatsSystem():RemoveModifier(Game.GetPlayer():GetEntityID(), WalkEffect)
  499. isWalking = false
  500.  
  501. end
  502.  
  503. function syncGrenades()
  504.  
  505. local equipmentSystem = Game.GetScriptableSystemsContainer():Get('EquipmentSystem')
  506. local equipmentSystemPlayer = equipmentSystem:GetPlayerData(Game.GetPlayer())
  507. local inventoryDataManager = equipmentSystemPlayer:GetInventoryManager()
  508. local items = inventoryDataManager['GetPlayerInventoryData;gamedataEquipmentAreaBoolarray<ItemModParams>'](inventoryDataManager, 'QuickSlot', true, {})
  509.  
  510. if #Grenades == 0 then
  511.  
  512. for i, item in ipairs(items) do
  513.  
  514. local itemHash = item.ID.id.hash
  515. local itemID = item.ID
  516.  
  517. local temp = {}
  518. temp.hash = itemHash
  519. temp.ID = itemID
  520.  
  521. table.insert(Grenades, temp)
  522.  
  523. end
  524.  
  525. else
  526.  
  527. for i, item in ipairs(items) do
  528.  
  529. local itemHash = item.ID.id.hash
  530. local itemID = item.ID
  531. local found = false
  532.  
  533. local temp = {}
  534. temp.hash = itemHash
  535. temp.ID = itemID
  536.  
  537. for _, grenade in ipairs(Grenades) do
  538.  
  539. if grenade.hash == itemHash then
  540. found = true
  541. end
  542.  
  543. if equipmentSystemPlayer:HasItemInInventory(grenade.ID) == false then
  544.  
  545. CurrentGrenade = 0
  546. Grenades = {}
  547. syncGrenades()
  548. return
  549.  
  550. end
  551.  
  552. end
  553.  
  554. if found == false then
  555. table.insert(Grenades, temp)
  556. end
  557.  
  558. end
  559.  
  560. end
  561.  
  562. end
  563.  
  564. function IsPlayerAiming()
  565.  
  566. local GetPlayer = Game.GetPlayer()
  567.  
  568. if GetPlayer == nil then
  569. return false
  570. end
  571.  
  572. local GetEntityID = GetPlayer:GetEntityID()
  573. local blackboard = Game.GetBlackboardSystem()
  574. local blackboardDefs = Game.GetAllBlackboardDefs()
  575. local blackboardPSM = blackboardDefs.PlayerStateMachine
  576.  
  577. return blackboard:GetLocalInstanced(GetEntityID, blackboardPSM):GetInt(blackboardPSM.UpperBody) == 6
  578.  
  579. end
  580.  
  581. function IsPlayerCover()
  582.  
  583. local GetPlayer = Game.GetPlayer()
  584.  
  585. if GetPlayer == nil then
  586. return false
  587. end
  588.  
  589. local GetEntityID = GetPlayer:GetEntityID()
  590. local blackboard = Game.GetBlackboardSystem()
  591. local blackboardDefs = Game.GetAllBlackboardDefs()
  592. local blackboardPSM = blackboardDefs.PlayerStateMachine
  593.  
  594. return blackboard:GetLocalInstanced(GetEntityID, blackboardPSM):GetBool(blackboardPSM.UsingCover)
  595.  
  596. end
  597.  
  598. function IsPlayerScanner()
  599.  
  600. local blackboard = Game.GetBlackboardSystem()
  601. local blackboardDefs = Game.GetAllBlackboardDefs()
  602.  
  603. return blackboard:Get(blackboardDefs.UI_Scanner):GetBool(blackboardDefs.UI_Scanner.UIVisible)
  604.  
  605. end
  606.  
  607. function IsPlayerInMenu()
  608.  
  609. local blackboard = Game.GetBlackboardSystem()
  610. local blackboardDefs = Game.GetAllBlackboardDefs()
  611. local uiSystem = blackboard:Get(blackboardDefs.UI_System)
  612.  
  613. if (not uiSystem) then
  614. return true
  615. end
  616.  
  617. return uiSystem:GetBool(blackboardDefs.UI_System.IsInMenu) or GetSingleton('inkMenuScenario'):GetSystemRequestsHandler():IsPreGame()
  618.  
  619. end
  620.  
  621. function leanToLeft(reset)
  622.  
  623. local reset = reset or false
  624. local player = Game.GetPlayer()
  625.  
  626. Game.GetSpatialQueriesSystem():GetPlayerObstacleSystem():ManualLeanRight(player)
  627.  
  628. local event = PlayerCoverStatusChangedEvent.new()
  629.  
  630. if not reset then
  631. event.direction = 1
  632. end
  633.  
  634. event.fullyBehindCover = false
  635.  
  636. player:QueueEvent(event)
  637.  
  638. end
  639.  
  640. function leanToRight(reset)
  641.  
  642. local reset = reset or false
  643. local player = Game.GetPlayer()
  644.  
  645. Game.GetSpatialQueriesSystem():GetPlayerObstacleSystem():ManualLeanLeft(player)
  646.  
  647. local event = PlayerCoverStatusChangedEvent.new()
  648.  
  649. if not reset then
  650. event.direction = 2
  651. end
  652.  
  653. event.fullyBehindCover = false
  654.  
  655. player:QueueEvent(event)
  656.  
  657. end
  658.  
  659. function getCoverDirection()
  660. return Game.GetSpatialQueriesSystem():GetPlayerObstacleSystem():GetCoverDirection(Game.GetPlayer())
  661. end
Advertisement
Add Comment
Please, Sign In to add comment