@@ -135,6 +135,7 @@ public bool AssignFromConfigNode(ConfigNode pCN)
135135 public static GlobalSettings Instance { get ; private set ; }
136136 #endregion
137137
138+ private EventData < float > OnTimeControlHyperWarpMaximumDeltaTimeChangedEvent { get ; set ; }
138139 private EventData < float > OnTimeControlHyperWarpMaxAttemptedRateChangedEvent { get ; set ; }
139140 private EventData < float > OnTimeControlHyperWarpPhysicsAccuracyChangedEvent { get ; set ; }
140141 private EventData < float > OnTimeControlSlowMoRateChangedEvent { get ; set ; }
@@ -172,15 +173,33 @@ public void SetActiveKeyBinds(List<TimeControlKeyBinding> value)
172173 saveOnNextUpdate = true ;
173174 }
174175
176+ private float hyperWarpMaximumDeltaTime = GameSettings . PHYSICS_FRAME_DT_LIMIT ;
177+ public float HyperWarpMaximumDeltaTime
178+ {
179+ get => hyperWarpMaximumDeltaTime ;
180+ set
181+ {
182+ if ( hyperWarpMaximumDeltaTime != value )
183+ {
184+ hyperWarpMaximumDeltaTime = value ;
185+ mainNode ? . SetValue ( nameof ( HyperWarpMaximumDeltaTime ) , value , true ) ;
186+ saveOnNextUpdate = true ;
187+ }
188+ }
189+ }
190+
175191 private float hyperWarpPhysicsAccuracy = 1f ;
176192 public float HyperWarpPhysicsAccuracy
177193 {
178194 get => hyperWarpPhysicsAccuracy ;
179195 set
180196 {
181- hyperWarpPhysicsAccuracy = value ;
182- mainNode ? . SetValue ( nameof ( HyperWarpPhysicsAccuracy ) , value , true ) ;
183- saveOnNextUpdate = true ;
197+ if ( hyperWarpPhysicsAccuracy != value )
198+ {
199+ hyperWarpPhysicsAccuracy = value ;
200+ mainNode ? . SetValue ( nameof ( HyperWarpPhysicsAccuracy ) , value , true ) ;
201+ saveOnNextUpdate = true ;
202+ }
184203 }
185204 }
186205
@@ -190,9 +209,12 @@ public float HyperWarpMaxAttemptedRate
190209 get => hyperWarpMaxAttemptedRate ;
191210 set
192211 {
193- hyperWarpMaxAttemptedRate = value ;
194- mainNode ? . SetValue ( nameof ( HyperWarpMaxAttemptedRate ) , value , true ) ;
195- saveOnNextUpdate = true ;
212+ if ( hyperWarpMaxAttemptedRate != value )
213+ {
214+ hyperWarpMaxAttemptedRate = value ;
215+ mainNode ? . SetValue ( nameof ( HyperWarpMaxAttemptedRate ) , value , true ) ;
216+ saveOnNextUpdate = true ;
217+ }
196218 }
197219 }
198220
@@ -202,9 +224,12 @@ public float SlowMoRate
202224 get => slowMoRate ;
203225 set
204226 {
205- slowMoRate = value ;
206- mainNode ? . SetValue ( nameof ( SlowMoRate ) , value , true ) ;
207- saveOnNextUpdate = true ;
227+ if ( slowMoRate != value )
228+ {
229+ slowMoRate = value ;
230+ mainNode ? . SetValue ( nameof ( SlowMoRate ) , value , true ) ;
231+ saveOnNextUpdate = true ;
232+ }
208233 }
209234 }
210235
@@ -214,9 +239,12 @@ public bool DeltaLocked
214239 get => deltaLocked ;
215240 set
216241 {
217- deltaLocked = value ;
218- mainNode ? . SetValue ( nameof ( DeltaLocked ) , value , true ) ;
219- saveOnNextUpdate = true ;
242+ if ( deltaLocked != value )
243+ {
244+ deltaLocked = value ;
245+ mainNode ? . SetValue ( nameof ( DeltaLocked ) , value , true ) ;
246+ saveOnNextUpdate = true ;
247+ }
220248 }
221249 }
222250 private float resetAltitudeToValue = 1000f ;
@@ -225,28 +253,33 @@ public float ResetAltitudeToValue
225253 get => resetAltitudeToValue ;
226254 set
227255 {
228- resetAltitudeToValue = value ;
229- mainNode ? . SetValue ( nameof ( ResetAltitudeToValue ) , value , true ) ;
230- saveOnNextUpdate = true ;
256+ if ( resetAltitudeToValue != value )
257+ {
258+ resetAltitudeToValue = value ;
259+ mainNode ? . SetValue ( nameof ( ResetAltitudeToValue ) , value , true ) ;
260+ saveOnNextUpdate = true ;
261+ }
231262 }
232263 }
233-
234-
264+
235265 // This is managed in the time control parameters screen, but is applied globally by the settings
236266 private bool cameraZoomFix = true ;
237267 public bool CameraZoomFix
238268 {
239269 get => cameraZoomFix ;
240270 set
241271 {
242- cameraZoomFix = value ;
243- try
272+ if ( cameraZoomFix != value )
244273 {
245- HighLogic . CurrentGame . Parameters . CustomParams < TimeControlParameterNode > ( ) . CameraZoomFix = value ;
274+ cameraZoomFix = value ;
275+ try
276+ {
277+ HighLogic . CurrentGame . Parameters . CustomParams < TimeControlParameterNode > ( ) . CameraZoomFix = value ;
278+ }
279+ catch ( NullReferenceException ) { }
280+ mainNode ? . SetValue ( nameof ( CameraZoomFix ) , value , true ) ;
281+ saveOnNextUpdate = true ;
246282 }
247- catch ( NullReferenceException ) { }
248- mainNode ? . SetValue ( nameof ( CameraZoomFix ) , value , true ) ;
249- saveOnNextUpdate = true ;
250283 }
251284 }
252285
@@ -256,9 +289,12 @@ public int KeyRepeatStart
256289 get => keyRepeatStart ;
257290 set
258291 {
259- keyRepeatStart = value ;
260- mainNode ? . SetValue ( nameof ( KeyRepeatStart ) , value , true ) ;
261- saveOnNextUpdate = true ;
292+ if ( keyRepeatStart != value )
293+ {
294+ keyRepeatStart = value ;
295+ mainNode ? . SetValue ( nameof ( KeyRepeatStart ) , value , true ) ;
296+ saveOnNextUpdate = true ;
297+ }
262298 }
263299 }
264300 private int keyRepeatInterval = 15 ;
@@ -267,9 +303,12 @@ public int KeyRepeatInterval
267303 get => keyRepeatInterval ;
268304 set
269305 {
270- keyRepeatInterval = value ;
271- mainNode ? . SetValue ( nameof ( KeyRepeatInterval ) , value , true ) ;
272- saveOnNextUpdate = true ;
306+ if ( keyRepeatInterval != value )
307+ {
308+ keyRepeatInterval = value ;
309+ mainNode ? . SetValue ( nameof ( KeyRepeatInterval ) , value , true ) ;
310+ saveOnNextUpdate = true ;
311+ }
273312 }
274313 }
275314
@@ -280,15 +319,18 @@ public LogSeverity LoggingLevel
280319 get => loggingLevel ;
281320 set
282321 {
283- loggingLevel = value ;
284- Log . LoggingLevel = value ;
285- try
322+ if ( loggingLevel != value )
286323 {
287- HighLogic . CurrentGame . Parameters . CustomParams < TimeControlParameterNode > ( ) . LoggingLevel = value ;
324+ loggingLevel = value ;
325+ Log . LoggingLevel = value ;
326+ try
327+ {
328+ HighLogic . CurrentGame . Parameters . CustomParams < TimeControlParameterNode > ( ) . LoggingLevel = value ;
329+ }
330+ catch ( NullReferenceException ) { }
331+ mainNode ? . SetValue ( nameof ( LoggingLevel ) , value . ToString ( ) , true ) ;
332+ saveOnNextUpdate = true ;
288333 }
289- catch ( NullReferenceException ) { }
290- mainNode ? . SetValue ( nameof ( LoggingLevel ) , value . ToString ( ) , true ) ;
291- saveOnNextUpdate = true ;
292334 }
293335 }
294336
@@ -299,15 +341,18 @@ public bool UseKerbinTime
299341 get => useKerbinTime ;
300342 set
301343 {
302- useKerbinTime = value ;
303- GameSettings . KERBIN_TIME = value ;
304- try
344+ if ( useKerbinTime != value )
305345 {
306- HighLogic . CurrentGame . Parameters . CustomParams < TimeControlParameterNode > ( ) . UseKerbinTime = value ;
346+ useKerbinTime = value ;
347+ GameSettings . KERBIN_TIME = value ;
348+ try
349+ {
350+ HighLogic . CurrentGame . Parameters . CustomParams < TimeControlParameterNode > ( ) . UseKerbinTime = value ;
351+ }
352+ catch ( NullReferenceException ) { }
353+ //mainNode?.SetValue( nameof( KerbinTime ), value.ToString(), true );
354+ //saveOnNextUpdate = true;
307355 }
308- catch ( NullReferenceException ) { }
309- //mainNode?.SetValue( nameof( KerbinTime ), value.ToString(), true );
310- //saveOnNextUpdate = true;
311356 }
312357 }
313358
@@ -343,6 +388,7 @@ private void Start()
343388
344389 mainNode . SetValue ( nameof ( HyperWarpPhysicsAccuracy ) , HyperWarpPhysicsAccuracy , true ) ;
345390 mainNode . SetValue ( nameof ( HyperWarpMaxAttemptedRate ) , HyperWarpMaxAttemptedRate , true ) ;
391+ mainNode . SetValue ( nameof ( HyperWarpMaximumDeltaTime ) , HyperWarpMaximumDeltaTime , true ) ;
346392 mainNode . SetValue ( nameof ( SlowMoRate ) , SlowMoRate , true ) ;
347393 mainNode . SetValue ( nameof ( DeltaLocked ) , DeltaLocked , true ) ;
348394 mainNode . SetValue ( nameof ( ResetAltitudeToValue ) , ResetAltitudeToValue , true ) ;
@@ -358,6 +404,8 @@ private void Start()
358404 LoadFromConfig ( ) ;
359405
360406 SubscribeToEvents ( ) ;
407+
408+ saveOnNextUpdate = true ;
361409 IsReady = true ;
362410 }
363411 }
@@ -393,6 +441,9 @@ private void SubscribeToEvents()
393441 OnTimeControlHyperWarpPhysicsAccuracyChangedEvent = GameEvents . FindEvent < EventData < float > > ( nameof ( TimeControlEvents . OnTimeControlHyperWarpPhysicsAccuracyChanged ) ) ;
394442 OnTimeControlHyperWarpPhysicsAccuracyChangedEvent ? . Add ( OnTimeControlHyperWarpPhysicsAccuracyChanged ) ;
395443
444+ OnTimeControlHyperWarpMaximumDeltaTimeChangedEvent = GameEvents . FindEvent < EventData < float > > ( nameof ( TimeControlEvents . OnTimeControlHyperWarpMaximumDeltaTimeChanged ) ) ;
445+ OnTimeControlHyperWarpMaximumDeltaTimeChangedEvent ? . Add ( OnTimeControlHyperWarpMaximumDeltaTimeChanged ) ;
446+
396447 OnTimeControlSlowMoRateChangedEvent = GameEvents . FindEvent < EventData < float > > ( nameof ( TimeControlEvents . OnTimeControlSlowMoRateChanged ) ) ;
397448 OnTimeControlSlowMoRateChangedEvent ? . Add ( OnTimeControlSlowMoRateChanged ) ;
398449
@@ -413,6 +464,7 @@ private void UnsubscribeFromEvents()
413464 OnTimeControlKeyBindingsChangedEvent ? . Remove ( OnTimeControlKeyBindingsChanged ) ;
414465 OnTimeControlHyperWarpMaxAttemptedRateChangedEvent ? . Remove ( OnTimeControlHyperWarpMaxAttemptedRateChanged ) ;
415466 OnTimeControlHyperWarpPhysicsAccuracyChangedEvent ? . Remove ( OnTimeControlHyperWarpPhysicsAccuracyChanged ) ;
467+ OnTimeControlHyperWarpMaximumDeltaTimeChangedEvent ? . Remove ( OnTimeControlHyperWarpMaximumDeltaTimeChanged ) ;
416468 OnTimeControlSlowMoRateChangedEvent ? . Remove ( OnTimeControlSlowMoRateChanged ) ;
417469
418470 SpaceCenterWindow . OnChanged -= GUIWindowsChanged ;
@@ -496,6 +548,18 @@ private void OnTimeControlHyperWarpMaxAttemptedRateChanged(float data)
496548 }
497549 }
498550
551+ private void OnTimeControlHyperWarpMaximumDeltaTimeChanged ( float data )
552+ {
553+ const string logBlockName = nameof ( GlobalSettings ) + "." + nameof ( OnTimeControlHyperWarpMaximumDeltaTimeChanged ) ;
554+ using ( EntryExitLogger . EntryExitLog ( logBlockName , EntryExitLoggerOptions . All ) )
555+ {
556+ if ( HyperWarpController . IsReady )
557+ {
558+ HyperWarpMaximumDeltaTime = HyperWarpController . Instance . MaximumDeltaTime ;
559+ }
560+ }
561+ }
562+
499563 private void OnTimeControlSlowMoRateChanged ( float data )
500564 {
501565 const string logBlockName = nameof ( GlobalSettings ) + "." + nameof ( OnTimeControlSlowMoRateChanged ) ;
@@ -679,6 +743,18 @@ private void LoadFromConfig()
679743 Log . Warning ( nameof ( HyperWarpPhysicsAccuracy ) + " has error in configuration file. Using default." , logBlockName ) ;
680744 }
681745
746+ ////////////////////////////////////////////////
747+ // HyperWarpPhysicsAccuracy
748+ ////////////////////////////////////////////////
749+ if ( tmpConfigMain . TryAssignFromConfigFloat ( nameof ( HyperWarpMaximumDeltaTime ) , out float tmpHyperWarpMaximumDeltaTime ) )
750+ {
751+ HyperWarpMaximumDeltaTime = tmpHyperWarpMaximumDeltaTime ;
752+ }
753+ else
754+ {
755+ Log . Warning ( nameof ( HyperWarpMaximumDeltaTime ) + " has error in configuration file. Using default." , logBlockName ) ;
756+ }
757+
682758 ////////////////////////////////////////////////
683759 // SlowMoRate
684760 ////////////////////////////////////////////////
0 commit comments