mirror of
https://github.com/sp-tarkov/modules.git
synced 2025-02-13 05:30:43 -05:00
Fixed BTR twerking on steep slopes (!142)
In the end, Kaeno's fix by changing the main client collider's layer to `HighPolyCollider` is the only way I could fix it. Also made changes to avoid unnecessary physics collisions between other BTR colliders; these physics collisions can cause FPS drops especially for lower end PCs so this should provide a slight performance gain for them. I left in the commented-out collision debugger script I made to log collisions in case it's useful for future debugging purposes. Reviewed-on: SPT/Modules#142 Co-authored-by: Nympfonic <arys.steam@gmail.com> Co-committed-by: Nympfonic <arys.steam@gmail.com>
This commit is contained in:
parent
cd190061cf
commit
f10742586c
@ -1,11 +1,12 @@
|
|||||||
using SPT.Custom.BTR.Utils;
|
using Comfort.Common;
|
||||||
using SPT.SinglePlayer.Utils.TraderServices;
|
|
||||||
using Comfort.Common;
|
|
||||||
using EFT;
|
using EFT;
|
||||||
using EFT.InventoryLogic;
|
using EFT.InventoryLogic;
|
||||||
using EFT.UI;
|
using EFT.UI;
|
||||||
using EFT.Vehicle;
|
using EFT.Vehicle;
|
||||||
|
using GPUInstancer;
|
||||||
using HarmonyLib;
|
using HarmonyLib;
|
||||||
|
using SPT.Custom.BTR.Utils;
|
||||||
|
using SPT.SinglePlayer.Utils.TraderServices;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@ -229,6 +230,7 @@ namespace SPT.Custom.BTR
|
|||||||
private void InitBtrBotService()
|
private void InitBtrBotService()
|
||||||
{
|
{
|
||||||
btrBotShooter = btrController.BotShooterBtr;
|
btrBotShooter = btrController.BotShooterBtr;
|
||||||
|
btrBotShooter.GetPlayer.GetComponent<Rigidbody>().detectCollisions = false; // disable rigidbody collisions with BTR bot
|
||||||
firearmController = btrBotShooter.GetComponent<Player.FirearmController>();
|
firearmController = btrBotShooter.GetComponent<Player.FirearmController>();
|
||||||
var weaponPrefab = (WeaponPrefab)AccessTools.Field(firearmController.GetType(), "weaponPrefab_0").GetValue(firearmController);
|
var weaponPrefab = (WeaponPrefab)AccessTools.Field(firearmController.GetType(), "weaponPrefab_0").GetValue(firearmController);
|
||||||
weaponSoundPlayer = weaponPrefab.GetComponent<WeaponSoundPlayer>();
|
weaponSoundPlayer = weaponPrefab.GetComponent<WeaponSoundPlayer>();
|
||||||
@ -380,14 +382,74 @@ namespace SPT.Custom.BTR
|
|||||||
// Initially we assumed there was a reason for this so it was left as is.
|
// Initially we assumed there was a reason for this so it was left as is.
|
||||||
// Turns out disabling the server collider in favour of the client collider fixes the "BTR doing a wheelie" bug,
|
// Turns out disabling the server collider in favour of the client collider fixes the "BTR doing a wheelie" bug,
|
||||||
// while preventing the player from walking through the BTR.
|
// while preventing the player from walking through the BTR.
|
||||||
|
// We also need to change the client collider's layer to HighPolyCollider due to unknown collisions that occur
|
||||||
|
// when going down a steep slope.
|
||||||
|
|
||||||
|
// Add collision debugger component to log collisions in the EFT Console
|
||||||
|
var clientColliders = btrClientSide.GetComponentsInChildren<Collider>(true);
|
||||||
|
//foreach (var collider in clientColliders)
|
||||||
|
//{
|
||||||
|
// collider.gameObject.AddComponent<CollisionDebugger>();
|
||||||
|
//}
|
||||||
|
|
||||||
|
var serverColliders = btrServerSide.GetComponentsInChildren<Collider>(true);
|
||||||
|
//foreach (var collider in serverColliders)
|
||||||
|
//{
|
||||||
|
// collider.gameObject.AddComponent<CollisionDebugger>();
|
||||||
|
//}
|
||||||
|
|
||||||
|
var clientRootCollider = clientColliders.First(x => x.gameObject.name == "Root");
|
||||||
|
|
||||||
|
// Retrieve all TerrainColliders
|
||||||
|
var terrainColliders = new List<TerrainCollider>();
|
||||||
|
|
||||||
|
foreach (GPUInstancerManager manager in GPUInstancerManager.activeManagerList)
|
||||||
|
{
|
||||||
|
if (manager.GetType() != typeof(GPUInstancerDetailManager))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var detailManager = (GPUInstancerDetailManager)manager;
|
||||||
|
if (detailManager.terrain == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
terrainColliders.Add(detailManager.terrain.GetComponent<TerrainCollider>());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make the Root collider ignore collisions with TerrainColliders
|
||||||
|
foreach (var collider in terrainColliders)
|
||||||
|
{
|
||||||
|
Physics.IgnoreCollision(clientRootCollider, collider);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve all wheel colliders on the serverside BTR
|
||||||
|
const string wheelColliderParentName = "BTR_82_wheel";
|
||||||
|
const string wheelColliderName = "Cylinder";
|
||||||
|
|
||||||
|
var serverWheelColliders = serverColliders
|
||||||
|
.Where(x => x.transform.parent.name.StartsWith(wheelColliderParentName) && x.gameObject.name.StartsWith(wheelColliderName))
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
// Make the Root collider ignore collisions with the serverside BTR wheels
|
||||||
|
foreach (var collider in serverWheelColliders)
|
||||||
|
{
|
||||||
|
Physics.IgnoreCollision(clientRootCollider, collider);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable clientside BTR collider and disable serverside BTR collider
|
||||||
const string exteriorColliderName = "BTR_82_exterior_COLLIDER";
|
const string exteriorColliderName = "BTR_82_exterior_COLLIDER";
|
||||||
var serverExteriorCollider = btrServerSide.GetComponentsInChildren<Collider>(true)
|
|
||||||
|
var serverExteriorCollider = serverColliders
|
||||||
.First(x => x.gameObject.name == exteriorColliderName);
|
.First(x => x.gameObject.name == exteriorColliderName);
|
||||||
var clientExteriorCollider = btrClientSide.GetComponentsInChildren<Collider>(true)
|
var clientExteriorCollider = clientColliders
|
||||||
.First(x => x.gameObject.name == exteriorColliderName);
|
.First(x => x.gameObject.name == exteriorColliderName);
|
||||||
|
|
||||||
serverExteriorCollider.gameObject.SetActive(false);
|
serverExteriorCollider.gameObject.SetActive(false);
|
||||||
clientExteriorCollider.gameObject.SetActive(true);
|
clientExteriorCollider.gameObject.SetActive(true);
|
||||||
|
clientExteriorCollider.gameObject.layer = LayerMask.NameToLayer("HighPolyCollider");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateTarget()
|
private void UpdateTarget()
|
||||||
|
35
project/SPT.Custom/BTR/CollisionDebugger.cs
Normal file
35
project/SPT.Custom/BTR/CollisionDebugger.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
using EFT.UI;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace SPT.Custom.BTR
|
||||||
|
{
|
||||||
|
public class CollisionDebugger : MonoBehaviour
|
||||||
|
{
|
||||||
|
private int _resetFrame = 10;
|
||||||
|
private int _frame = 0;
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
_frame = (_frame + 1) % _resetFrame;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnCollisionEnter(Collision collision)
|
||||||
|
{
|
||||||
|
foreach (var contact in collision.contacts)
|
||||||
|
{
|
||||||
|
ConsoleScreen.LogWarning($"Collision between {gameObject.name} and {contact.otherCollider.gameObject.name}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnCollisionStay(Collision collision)
|
||||||
|
{
|
||||||
|
if (_frame == 0)
|
||||||
|
{
|
||||||
|
foreach (var contact in collision.contacts)
|
||||||
|
{
|
||||||
|
ConsoleScreen.LogWarning($"Collision between {gameObject.name} and {contact.otherCollider.gameObject.name}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -25,8 +25,10 @@
|
|||||||
<Reference Include="UnityEngine.AudioModule" HintPath="..\Shared\Managed\UnityEngine.AudioModule.dll" Private="False" />
|
<Reference Include="UnityEngine.AudioModule" HintPath="..\Shared\Managed\UnityEngine.AudioModule.dll" Private="False" />
|
||||||
<Reference Include="UnityEngine.CoreModule" HintPath="..\Shared\Managed\UnityEngine.CoreModule.dll" Private="False" />
|
<Reference Include="UnityEngine.CoreModule" HintPath="..\Shared\Managed\UnityEngine.CoreModule.dll" Private="False" />
|
||||||
<Reference Include="UnityEngine.IMGUIModule" HintPath="..\Shared\Managed\UnityEngine.IMGUIModule.dll" Private="False" />
|
<Reference Include="UnityEngine.IMGUIModule" HintPath="..\Shared\Managed\UnityEngine.IMGUIModule.dll" Private="False" />
|
||||||
<Reference Include="UnityEngine.ParticleSystemModule" HintPath="..\Shared\Managed\UnityEngine.ParticleSystemModule.dll" Private="false" />
|
<Reference Include="UnityEngine.ParticleSystemModule" HintPath="..\Shared\Managed\UnityEngine.ParticleSystemModule.dll" Private="False" />
|
||||||
<Reference Include="UnityEngine.PhysicsModule" HintPath="..\Shared\Managed\UnityEngine.PhysicsModule.dll" Private="False" />
|
<Reference Include="UnityEngine.PhysicsModule" HintPath="..\Shared\Managed\UnityEngine.PhysicsModule.dll" Private="False" />
|
||||||
|
<Reference Include="UnityEngine.TerrainModule" HintPath="..\Shared\Managed\UnityEngine.TerrainModule.dll" Private="False" />
|
||||||
|
<Reference Include="UnityEngine.TerrainPhysicsModule" HintPath="..\Shared\Managed\UnityEngine.TerrainPhysicsModule.dll" Private="False" />
|
||||||
<Reference Include="UnityEngine.TextRenderingModule" HintPath="..\Shared\Managed\UnityEngine.TextRenderingModule.dll" Private="False" />
|
<Reference Include="UnityEngine.TextRenderingModule" HintPath="..\Shared\Managed\UnityEngine.TextRenderingModule.dll" Private="False" />
|
||||||
<Reference Include="UnityEngine.UI" HintPath="..\Shared\Managed\UnityEngine.UI.dll" Private="False" />
|
<Reference Include="UnityEngine.UI" HintPath="..\Shared\Managed\UnityEngine.UI.dll" Private="False" />
|
||||||
<Reference Include="UnityEngine.UIModule" HintPath="..\Shared\Managed\UnityEngine.UIModule.dll" Private="False" />
|
<Reference Include="UnityEngine.UIModule" HintPath="..\Shared\Managed\UnityEngine.UIModule.dll" Private="False" />
|
||||||
|
Loading…
x
Reference in New Issue
Block a user