/// <summary> /// Creates a preset for the <paramref name="vehicle"/> to edit it locally /// </summary> /// <param name="vehicle">The handle of the entity</param> /// <returns></returns> private VStancerPreset CreatePreset(int vehicle) { if (debug && IsVehicleDamaged(vehicle)) { Screen.ShowNotification($"~o~Warning~w~: You are creating a vstancer preset for a damaged vehicle, default position and rotation of the wheels might be wrong"); } int wheelsCount = GetVehicleNumberOfWheels(vehicle); int frontCount = VStancerPreset.CalculateFrontWheelsCount(wheelsCount); // Get default values first float off_f_def = DecorExistOn(vehicle, DefaultFrontOffsetID) ? DecorGetFloat(vehicle, DefaultFrontOffsetID) : GetVehicleWheelXOffset(vehicle, 0); float rot_f_def = DecorExistOn(vehicle, DefaultFrontRotationID) ? DecorGetFloat(vehicle, DefaultFrontRotationID) : GetVehicleWheelYRotation(vehicle, 0); float off_r_def = DecorExistOn(vehicle, DefaultRearOffsetID) ? DecorGetFloat(vehicle, DefaultRearOffsetID) : GetVehicleWheelXOffset(vehicle, frontCount); float rot_r_def = DecorExistOn(vehicle, DefaultRearRotationID) ? DecorGetFloat(vehicle, DefaultRearRotationID) : GetVehicleWheelYRotation(vehicle, frontCount); float steering_lock_def = DecorExistOn(vehicle, DefaultSteeringLockID) ? DecorGetFloat(vehicle, DefaultSteeringLockID) : GetVehicleHandlingFloat(vehicle, "CHandlingData", "fSteeringLock"); float susp_height_def = DecorExistOn(vehicle, DefaultSuspensionHeightID) ? DecorGetFloat(vehicle, DefaultSuspensionHeightID) : GetVehicleHandlingFloat(vehicle, "CHandlingData", "fSuspensionRaise");; float off_f = DecorExistOn(vehicle, FrontOffsetID) ? DecorGetFloat(vehicle, FrontOffsetID) : off_f_def; float rot_f = DecorExistOn(vehicle, FrontRotationID) ? DecorGetFloat(vehicle, FrontRotationID) : rot_f_def; float off_r = DecorExistOn(vehicle, RearOffsetID) ? DecorGetFloat(vehicle, RearOffsetID) : off_r_def; float rot_r = DecorExistOn(vehicle, RearRotationID) ? DecorGetFloat(vehicle, RearRotationID) : rot_r_def; float steering_lock = DecorExistOn(vehicle, SteeringLockID) ? DecorGetFloat(vehicle, SteeringLockID) : steering_lock_def; float susp_height = DecorExistOn(vehicle, SuspensionHeightID) ? DecorGetFloat(vehicle, SuspensionHeightID) : susp_height_def; return(new VStancerPreset(wheelsCount, off_f, rot_f, off_r, rot_r, steering_lock, susp_height, off_f_def, rot_f_def, off_r_def, rot_r_def, steering_lock_def, susp_height_def)); }
/// <summary> /// Refreshes the <paramref name="vehicle"/> with values from its decorators (if exist) /// </summary> /// <param name="vehicle">The handle of the entity</param> private void RefreshVehicleUsingDecorators(int vehicle) { int wheelsCount = GetVehicleNumberOfWheels(vehicle); int frontCount = VStancerPreset.CalculateFrontWheelsCount(wheelsCount); if (DecorExistOn(vehicle, FrontOffsetID)) { float value = DecorGetFloat(vehicle, FrontOffsetID); for (int index = 0; index < frontCount; index++) { if (index % 2 == 0) { SetVehicleWheelXOffset(vehicle, index, value); } else { SetVehicleWheelXOffset(vehicle, index, -value); } } } if (DecorExistOn(vehicle, FrontRotationID)) { float value = DecorGetFloat(vehicle, FrontRotationID); for (int index = 0; index < frontCount; index++) { if (index % 2 == 0) { SetVehicleWheelYRotation(vehicle, index, value); } else { SetVehicleWheelYRotation(vehicle, index, -value); } } } if (DecorExistOn(vehicle, RearOffsetID)) { float value = DecorGetFloat(vehicle, RearOffsetID); for (int index = frontCount; index < wheelsCount; index++) { if (index % 2 == 0) { SetVehicleWheelXOffset(vehicle, index, value); } else { SetVehicleWheelXOffset(vehicle, index, -value); } } } if (DecorExistOn(vehicle, RearRotationID)) { float value = DecorGetFloat(vehicle, RearRotationID); for (int index = frontCount; index < wheelsCount; index++) { if (index % 2 == 0) { SetVehicleWheelYRotation(vehicle, index, value); } else { SetVehicleWheelYRotation(vehicle, index, -value); } } } if (DecorExistOn(vehicle, SteeringLockID)) { float value = DecorGetFloat(vehicle, SteeringLockID); SetVehicleHandlingFloat(vehicle, "CHandlingData", "fSteeringLock", value); } if (DecorExistOn(vehicle, SuspensionHeightID)) { float value = DecorGetFloat(vehicle, SuspensionHeightID); SetVehicleHandlingFloat(vehicle, "CHandlingData", "fSuspensionRaise", value); } }
/// <summary> /// Refreshes the <paramref name="vehicle"/> with values from its decorators (if exist) /// </summary> /// <param name="vehicle">The handle of the entity</param> private void RefreshVehicleUsingDecorators(int vehicle) { int wheelsCount = GetVehicleNumberOfWheels(vehicle); int frontCount = VStancerPreset.CalculateFrontWheelsCount(wheelsCount); if (DecorExistOn(vehicle, FrontOffsetID)) { float value = DecorGetFloat(vehicle, FrontOffsetID); for (int index = 0; index < frontCount; index++) { if (index % 2 == 0) { SetVehicleWheelXOffset(vehicle, index, value); } else { SetVehicleWheelXOffset(vehicle, index, -value); } } } if (DecorExistOn(vehicle, FrontRotationID)) { float value = DecorGetFloat(vehicle, FrontRotationID); for (int index = 0; index < frontCount; index++) { if (index % 2 == 0) { SetVehicleWheelYRotation(vehicle, index, value); } else { SetVehicleWheelYRotation(vehicle, index, -value); } } } if (DecorExistOn(vehicle, RearOffsetID)) { float value = DecorGetFloat(vehicle, RearOffsetID); for (int index = frontCount; index < wheelsCount; index++) { if (index % 2 == 0) { SetVehicleWheelXOffset(vehicle, index, value); } else { SetVehicleWheelXOffset(vehicle, index, -value); } } } if (DecorExistOn(vehicle, RearRotationID)) { float value = DecorGetFloat(vehicle, RearRotationID); for (int index = frontCount; index < wheelsCount; index++) { if (index % 2 == 0) { SetVehicleWheelYRotation(vehicle, index, value); } else { SetVehicleWheelYRotation(vehicle, index, -value); } } } }
/// <summary> /// Loads a Vstancer preset for the <paramref name="vehicle"/> with the specified values. /// </summary> /// <param name="vehicle">The handle of the entity</param> /// <param name="frontOffset">The front offset value</param> /// <param name="frontRotation">The front rotation value</param> /// <param name="rearOffset">The rear offset value</param> /// <param name="rearRotation">The rear rotation value</param> /// <param name="steeringLock">Steering lock value</param> /// <param name="suspensionHeight">Suspension height value</param> /// <param name="defaultFrontOffset">The default front offset value</param> /// <param name="defaultFrontRotation">The default front rotation value</param> /// <param name="defaultRearOffset">The default rear offset value</param> /// <param name="defaultRearRotation">The default rear rotation value</param> /// <param name="defaultSteeringLock">The default steering lock value</param> /// <param name="defaultSuspensionHeight">The default suspension height value</param> public void SetVstancerPreset(int vehicle, float frontOffset, float frontRotation, float rearOffset, float rearRotation, float steeringLock, float suspensionHeight, object defaultFrontOffset = null, object defaultFrontRotation = null, object defaultRearOffset = null, object defaultRearRotation = null, object defaultSteeringLock = null, object defaultSuspensionHeight = null) { if (debug) { Debug.WriteLine($"{ScriptName}: SetVstancerPreset parameters {frontOffset} {frontRotation} {rearOffset} {rearRotation} {steeringLock} {suspensionHeight} {defaultFrontOffset} {defaultFrontRotation} {defaultRearOffset} {defaultRearRotation} {defaultSteeringLock} {defaultSuspensionHeight}"); } if (!DoesEntityExist(vehicle)) { return; } int wheelsCount = GetVehicleNumberOfWheels(vehicle); int frontCount = VStancerPreset.CalculateFrontWheelsCount(wheelsCount); float off_f_def, rot_f_def, off_r_def, rot_r_def, steering_lock_def, susp_height_def; if (defaultFrontOffset != null && defaultFrontOffset is float) { off_f_def = (float)defaultFrontOffset; } else { off_f_def = DecorExistOn(vehicle, DefaultFrontOffsetID) ? DecorGetFloat(vehicle, DefaultFrontOffsetID) : GetVehicleWheelXOffset(vehicle, 0); } if (defaultFrontRotation != null && defaultFrontRotation is float) { rot_f_def = (float)defaultFrontRotation; } else { rot_f_def = DecorExistOn(vehicle, DefaultFrontRotationID) ? DecorGetFloat(vehicle, DefaultFrontRotationID) : GetVehicleWheelYRotation(vehicle, 0); } if (defaultRearOffset != null && defaultRearOffset is float) { off_r_def = (float)defaultRearOffset; } else { off_r_def = DecorExistOn(vehicle, DefaultRearOffsetID) ? DecorGetFloat(vehicle, DefaultRearOffsetID) : GetVehicleWheelXOffset(vehicle, frontCount); } if (defaultRearRotation != null && defaultRearRotation is float) { rot_r_def = (float)defaultRearRotation; } else { rot_r_def = DecorExistOn(vehicle, DefaultRearRotationID) ? DecorGetFloat(vehicle, DefaultRearRotationID) : GetVehicleWheelYRotation(vehicle, frontCount); } if (defaultSteeringLock != null && defaultSteeringLock is float) { steering_lock_def = (float)defaultSteeringLock; } else { steering_lock_def = DecorExistOn(vehicle, DefaultSteeringLockID) ? DecorGetFloat(vehicle, DefaultSteeringLockID) : GetVehicleHandlingFloat(vehicle, "CHandlingData", "fSteeringLock"); } if (defaultSuspensionHeight != null && defaultSuspensionHeight is float) { susp_height_def = (float)defaultSuspensionHeight; } else { susp_height_def = DecorExistOn(vehicle, DefaultSuspensionHeightID) ? DecorGetFloat(vehicle, DefaultSuspensionHeightID) : GetVehicleHandlingFloat(vehicle, "CHandlingData", "fSuspensionRaise"); } if (vehicle == currentVehicle) { currentPreset = new VStancerPreset(wheelsCount, frontOffset, frontRotation, rearOffset, rearRotation, steeringLock, suspensionHeight, off_f_def, rot_f_def, off_r_def, rot_r_def, steering_lock_def, susp_height_def); PresetChanged?.Invoke(this, EventArgs.Empty); } else { UpdateFloatDecorator(vehicle, DefaultFrontOffsetID, off_f_def, frontOffset); UpdateFloatDecorator(vehicle, DefaultFrontRotationID, rot_f_def, frontRotation); UpdateFloatDecorator(vehicle, DefaultRearOffsetID, off_r_def, rearOffset); UpdateFloatDecorator(vehicle, DefaultRearRotationID, rot_r_def, rearRotation); UpdateFloatDecorator(vehicle, DefaultSteeringLockID, steering_lock_def, steeringLock); UpdateFloatDecorator(vehicle, DefaultSuspensionHeightID, susp_height_def, suspensionHeight); UpdateFloatDecorator(vehicle, FrontOffsetID, frontOffset, off_f_def); UpdateFloatDecorator(vehicle, FrontRotationID, frontRotation, rot_f_def); UpdateFloatDecorator(vehicle, RearOffsetID, rearOffset, off_r_def); UpdateFloatDecorator(vehicle, RearRotationID, rearRotation, rot_r_def); UpdateFloatDecorator(vehicle, SteeringLockID, steeringLock, steering_lock_def); UpdateFloatDecorator(vehicle, SuspensionHeightID, suspensionHeight, susp_height_def); } }
/// <summary> /// Loads a Vstancer preset for the <paramref name="vehicle"/> with the specified values. /// </summary> /// <param name="vehicle">The handle of the entity</param> /// <param name="frontOffset">The front offset value</param> /// <param name="frontRotation">The front rotation value</param> /// <param name="rearOffset">The rear offset value</param> /// <param name="rearRotation">The rear rotation value</param> /// <param name="defaultFrontOffset">The default front offset value</param> /// <param name="defaultFrontRotation">The default front rotation value</param> /// <param name="defaultRearOffset">The default rear offset value</param> /// <param name="defaultRearRotation">The default rear rotation value</param> public void SetVstancerPreset(int vehicle, float frontOffset, float frontRotation, float rearOffset, float rearRotation, object defaultFrontOffset = null, object defaultFrontRotation = null, object defaultRearOffset = null, object defaultRearRotation = null) { if (debug) { Debug.WriteLine($"{ScriptName}: SetVstancerPreset parameters {frontOffset} {frontRotation} {rearOffset} {rearRotation} {defaultFrontOffset} {defaultFrontRotation} {defaultRearOffset} {defaultRearRotation}"); } if (!DoesEntityExist(vehicle)) { return; } int wheelsCount = GetVehicleNumberOfWheels(vehicle); int frontCount = VStancerPreset.CalculateFrontWheelsCount(wheelsCount); float off_f_def, rot_f_def, off_r_def, rot_r_def; if (defaultFrontOffset != null && defaultFrontOffset is float) { off_f_def = (float)defaultFrontOffset; } else { off_f_def = DecorExistOn(vehicle, DefaultFrontOffsetID) ? DecorGetFloat(vehicle, DefaultFrontOffsetID) : GetVehicleWheelXOffset(vehicle, 0); } if (defaultFrontRotation != null && defaultFrontRotation is float) { rot_f_def = (float)defaultFrontRotation; } else { rot_f_def = DecorExistOn(vehicle, DefaultFrontRotationID) ? DecorGetFloat(vehicle, DefaultFrontRotationID) : GetVehicleWheelYRotation(vehicle, 0); } if (defaultRearOffset != null && defaultRearOffset is float) { off_r_def = (float)defaultRearOffset; } else { off_r_def = DecorExistOn(vehicle, DefaultRearOffsetID) ? DecorGetFloat(vehicle, DefaultRearOffsetID) : GetVehicleWheelXOffset(vehicle, frontCount); } if (defaultRearRotation != null && defaultRearRotation is float) { rot_r_def = (float)defaultRearRotation; } else { rot_r_def = DecorExistOn(vehicle, DefaultRearRotationID) ? DecorGetFloat(vehicle, DefaultRearRotationID) : GetVehicleWheelYRotation(vehicle, frontCount); } if (vehicle == currentVehicle) { currentPreset = new VStancerPreset(wheelsCount, frontOffset, frontRotation, rearOffset, rearRotation, off_f_def, rot_f_def, off_r_def, rot_r_def); PresetChanged?.Invoke(this, EventArgs.Empty); } else { UpdateFloatDecorator(vehicle, DefaultFrontOffsetID, off_f_def, frontOffset); UpdateFloatDecorator(vehicle, DefaultFrontRotationID, rot_f_def, frontRotation); UpdateFloatDecorator(vehicle, DefaultRearOffsetID, off_r_def, rearOffset); UpdateFloatDecorator(vehicle, DefaultRearRotationID, rot_r_def, rearRotation); UpdateFloatDecorator(vehicle, FrontOffsetID, frontOffset, off_f_def); UpdateFloatDecorator(vehicle, FrontRotationID, frontRotation, rot_f_def); UpdateFloatDecorator(vehicle, RearOffsetID, rearOffset, off_r_def); UpdateFloatDecorator(vehicle, RearRotationID, rearRotation, rot_r_def); } }