-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathOffRailsObject.cs
More file actions
133 lines (122 loc) · 5.18 KB
/
Copy pathOffRailsObject.cs
File metadata and controls
133 lines (122 loc) · 5.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace PersistentTrails
{
class OffRailsObject : MonoBehaviour
{
public float maxDistanceFromPlayer = 3000f;
public float timeOut = 600f;
public bool destroyIfTimewarp = false;
public float buoyancyForce = 50f;
public float buoyancyRange = 2f;
public bool destructionAllowed = true; //should be false when spawnign from replay window to avoid nullreffing. Closing the replay will kill the object
/// <summary>
/// Max speed to float up through the water
/// </summary>
public float maxVerticalSpeed = 5f;
public float dragInWater = 1f;
public float dragInAir = 0.01f;
private bool destroyThis = false;
private Vector3 lastMainBodyPosition = Vector3.zero;
private Vector3 referenceFrameCorrection = Vector3.zero;
private CelestialBody mainBody;
private Vessel activeVessel;
private void performDestruction()
{
Utilities.debug.debugMessage("Destroying ghost");
Destroy(gameObject);
}
public void Start()
{
Utilities.debug.debugMessage("Added OffRailsObject module");
if (FlightGlobals.ActiveVessel != null)
{
lastMainBodyPosition = FlightGlobals.ActiveVessel.mainBody.position;
activeVessel = FlightGlobals.ActiveVessel;
mainBody = activeVessel.mainBody;
}
}
public void Update()
{
activeVessel = FlightGlobals.ActiveVessel;
mainBody = activeVessel.mainBody;
if (destroyThis)
Utilities.debug.debugMessage("Unexpected OffrailsObject Update call from destroyed object");
//Destruction checks
if (destructionAllowed)
{
if (destroyIfTimewarp)
{
if (TimeWarp.CurrentRate > 1f)
if (TimeWarp.WarpMode == TimeWarp.Modes.HIGH)
{
Utilities.debug.debugMessage("Ghost time warp destruction triggered");
destroyThis = true;
}
}
if (Vector3.Distance(activeVessel.transform.position, gameObject.transform.position) > maxDistanceFromPlayer)
{
Utilities.debug.debugMessage("Ghost distance destruction triggered");
destroyThis = true;
}
timeOut -= Time.deltaTime;
if (timeOut < 0f)
{
Utilities.debug.debugMessage("Ghost timeout destruction triggered");
destroyThis = true;
}
if (destroyThis)
{
performDestruction();
return;
}
}
//Reference frame correction
if (FlightGlobals.ActiveVessel != null)
{
referenceFrameCorrection = mainBody.position - lastMainBodyPosition;
lastMainBodyPosition = mainBody.position;
if (referenceFrameCorrection.magnitude > 1f)
{
Utilities.debug.debugMessage("Reference Frame shift: " + referenceFrameCorrection);
gameObject.transform.position -= referenceFrameCorrection; // + or -?
}
}
}
public void FixedUpdate()
{
//Ocean float code
if (mainBody == null)
{
//Utilities.debug.debugMessage("No main body");
return;
}
if (buoyancyForce > 0f && mainBody.ocean && rigidbody != null)
{
float seaAltitude = Vector3.Distance(mainBody.position, gameObject.transform.position) - (float)mainBody.Radius;
if (seaAltitude < 0f)
{
rigidbody.drag = dragInWater;
float floatMultiplier = Mathf.Max(0f, -Mathf.Max(seaAltitude, -buoyancyRange)) / buoyancyRange;
if (floatMultiplier > 0f)
{
Vector3 up = (gameObject.transform.position - mainBody.position).normalized;
Vector3 upLift = up * buoyancyForce * floatMultiplier;
float verticalSpeed = Vector3.Dot(gameObject.rigidbody.velocity, up) * gameObject.rigidbody.velocity.magnitude;
if (verticalSpeed < maxVerticalSpeed)
{
gameObject.rigidbody.AddForce(upLift * Time.deltaTime * 50f); // *50 compensates for the deltaTime reduction, so I can use familiar values
}
}
}
else
{
rigidbody.drag = dragInAir;
}
}
}
}
}