Jump to content

Fixing TT's wheels for 0.24


Recommended Posts

Since 0.19, I have been fixing his wheels and making them work, but since 0.24, they worked once and seems like ksp edited the script and broke it. Has for the part.cfg, its up to date but the plugin is broken I think. Here it is. Anything not correct in this ?? And then, how I convert the .cs into a .dll? (traditional format change)??

These are the wheels http://i11.photobucket.com/albums/a180/manmuppet/screenshot62-1.png

The name of the plugin is TTModularWheel.dll

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using UnityEngine;

public class TTModularWheel : PartModule

{

[KSPField]

public float steerFalloff = 0.25f;

[KSPField]

public float maxMotorTorque = 15f;

[KSPField]

public float maxBrakeTorque = 15f;

[KSPField]

public float rollingResistance = 0.5f;

[KSPField]

public float maxSteer = 45f;

[KSPField]

public Vector3 wheelRotationAxis = new Vector3 (0,0,1);

[KSPField]

public float rotationFactor = (6/180);

[KSPField]

public float contactDisplace = 0.075f;

[KSPField]

public float brakepercentadd = 0.03f;

[KSPField]

public float brakepercentsub = 0.12f;

[KSPField]

public float slidefactor = 10f;

[KSPField]

public float slidepower = 0.9f;

[KSPField]

public float velslidefactor = 0.05f;

[KSPField]

public float smokestart = 5f;

[KSPField]

public bool isDeployable = false;

[KSPField]

public string retractAnimation = "Retract";

[KSPField]

public float spring = 0f;

[KSPField(isPersistant = true)]

bool isDeployed = true;

bool isActive = false;

[KSPField(isPersistant = true)]

bool throttlemode = false;

[KSPField]

public bool yforwardtrueorxfalse = true;

//slightly borrowedcode

protected Animation anim

{

get { return part.FindModelAnimators(retractAnimation)[0]; }

}

//

Transform steeringTransform;

Transform suspensionTransform;

Transform wheelModel;

Transform Bounder;

Transform rotatingLever;

//Transform wheelc;

WheelCollider wheelc;

Vector3 driveAt;

//BoxCollider Bounderbox;

//Animation s;

//List<Animation> s = new List<Animation>();

GameObject skidSmoke;

[KSPField(isPersistant = true)]

bool brakesOn = false;

float motor;

float steer;

float csteer;

float fixedangle;

float vel;

float speed = 1f;

float BrakeTorquePercent = 0f;

float driveDirection = 1f;

//Vector3 direction;

//float mSpeed;

bool Debugtoggle;

bool editorstate = false;

[KSPEvent(guiActive = true, guiName = "DEBUGTOGGLE", guiActiveUnfocused = false, unfocusedRange = 0)]

public void Toggle2 ()

{

Debugtoggle = !Debugtoggle;

}

// Throttle switching GUI / Action groups

[KSPEvent(guiActive = true, guiName = "Change Throttlemode", guiActiveUnfocused = false, unfocusedRange = 0)]

public void Togglethrottle ()

{

throttlemode = !throttlemode;

}

[KSPAction("Change Throttlemode")]

public void Togglethrottle2(KSPActionParam Param)

{

throttlemode = !throttlemode;

}

[KSPField(guiActive = true, guiName = "Mode = ")]

public string throttlemodeout = "Rover Mode";

[KSPEvent(guiActive = true, guiName = "Gear up/down", guiActiveUnfocused = false, unfocusedRange = 0)]

public void GearGui ()

{

AnimGear();

}

[KSPAction("Gear", KSPActionGroup.Gear)]

public void Gear(KSPActionParam param)

{

AnimGear();

}

[KSPAction("Brakes", KSPActionGroup.Brakes)]

public void Brake (KSPActionParam param)

{

if (param.type == KSPActionType.Activate) {

brakesOn = true;

/*if (BrakeTorquePercent < 1f)

BrakeTorquePercent = BrakeTorquePercent + brakepercentadd;

else

BrakeTorquePercent = 1f;

wheelc.brakeTorque = maxBrakeTorque * BrakeTorquePercent;*/

Debug.Log ("Applying Percent Brakes : " + BrakeTorquePercent);

} else {

brakesOn = false;

//wheelc.brakeTorque = maxBrakeTorque * BrakeTorquePercent;

}

}

public void AnimGear ()

{

if (isDeployable == true)

if (isDeployed == true) {

isDeployed = false;

foreach (AnimationState s in anim)

s.speed = speed;

anim.Play (retractAnimation,PlayMode.StopAll);

} else {

isDeployed = true;

foreach (AnimationState s in anim){

s.speed = -speed;

}

anim.Play (retractAnimation,PlayMode.StopAll);

foreach (AnimationState s in anim){

if (s.normalizedTime == 0){

s.normalizedTime = 1;

//Debug.Log ("setting normalizedTime to 1...");

}

//Debug.Log ("normalizedtime = " + s.normalizedTime);

}

}

}

public override void OnStart (StartState state)

{

steeringTransform = part.FindModelTransform ("steeringAxis");

wheelModel = part.FindModelTransform ("Wheel");

suspensionTransform = part.FindModelTransform ("suspensionParent");

Bounder = part.FindModelTransform ("Bounds");

rotatingLever = part.FindModelTransform ("rotatingLever1");

//wheelc = part.FindModelTransform("Wheel");

wheelc = part.FindModelComponent<WheelCollider> ();

//s = (part.FindModelAnimators(retractAnimation));

//Bounderbox = Bounder.GetComponent<BoxCollider> ();

//Bounderbox.enabled = false;

Destroy (Bounder.gameObject.collider);

//This part is for setting up particles

if (state != StartState.Editor) {

skidSmoke = (GameObject)GameObject.Instantiate (UnityEngine.Resources.Load ("Effects/fx_smokeTrail_light"));

skidSmoke.transform.parent = suspensionTransform;

skidSmoke.transform.position = wheelc.transform.position;

skidSmoke.particleEmitter.emit = false;

skidSmoke.particleEmitter.localVelocity = Vector3.zero;

skidSmoke.particleEmitter.useWorldSpace = true;

JointSpring wheelspring;

wheelspring = wheelc.suspensionSpring;

if (spring != 0f){

wheelspring.spring = spring;

wheelc.suspensionSpring = wheelspring;

}

if (isDeployed == false) {

anim.Play (retractAnimation, PlayMode.StopAll);

Debug.Log ("Persistant shows gear retracted, retracting animation");

foreach (AnimationState s in anim)

s.normalizedTime = 1;

}

editorstate = false;

} else {

editorstate = true;

}

wheelc.enabled = true;

// make sure wheels are at full suspension extension in the VAB/SPH

suspensionTransform.position = wheelc.transform.position - (wheelc.transform.up * (wheelc.suspensionDistance + contactDisplace));

}

// fix180 is for converting 0 to 360 degree range to -180 to 180 degree range.

float fix180(float angle)

{

if (angle > 180f) {

fixedangle = angle - 360f;

} else {

fixedangle = angle;

}

return fixedangle;

}

public void FixedUpdate ()

{

/*// is the animation at the start? if it is, work. if it aint, don't.

foreach (AnimationState s in anim) {

if (s.normalizedTime == 0) {

isDeployed = true;

} else {

isDeployed = false;

}

}

*/

if (HighLogic.LoadedSceneIsEditor == false) {

if (this.vessel.isActiveVessel == false)

isActive = false;

else

isActive = true;

if (yforwardtrueorxfalse == true) {

driveAt = part.transform.InverseTransformDirection (vessel.transform.forward + vessel.transform.up);

if (driveAt.y > 0)

driveDirection = 1f;

else

driveDirection = -1f;

if (Debugtoggle == true)

Debug.Log ("driveAt.y = " + driveAt.y);

} else {

driveAt = part.transform.InverseTransformDirection (vessel.transform.forward + vessel.transform.up);

if (driveAt.x > 0)

driveDirection = 1f;

else

driveDirection = -1f;

if (Debugtoggle == true)

Debug.Log ("driveAt.x = " + driveAt.x);

}

if (isActive == true) {

if (isDeployed == true) {

vel = (float)this.vessel.srf_velocity.magnitude;

//Debug.Log ("velocity readout : " + vel);

steer = (float)(-FlightInputHandler.state.wheelSteer * maxSteer / (1f + (vel * steerFalloff)));

//select the appropiate mode for driving the motor

if (throttlemode == false) {

motor = (float)(FlightInputHandler.state.wheelThrottle);

throttlemodeout = "Rover Mode";

} else {

motor = (float)(FlightInputHandler.state.mainThrottle);

throttlemodeout = "Throttle Mode";

}

Vector3 partposition = part.transform.InverseTransformPoint (vessel.transform.position);

Vector3 CoMposition = part.transform.InverseTransformPoint (vessel.CoM);

if (Debugtoggle == true)

Debug.Log ("PP = " + partposition + " COMP = " + CoMposition);

if (yforwardtrueorxfalse == true)

if (CoMposition.y * driveDirection > 0)

steer = -steer;

if (yforwardtrueorxfalse == false)

if (CoMposition.x * driveDirection > 0)

steer = -steer;

// not deployed or active? then don't steer or drive.

} else {

motor = 0f;

steer = 0f;

}

csteer = steeringTransform.localEulerAngles.y;

csteer = fix180 (csteer);

//rediculously basic smoothing command

steer = (steer + csteer) / 2;

// set the steering angle and wheel torque

steeringTransform.localEulerAngles = new Vector3 (0, steer, 0);

wheelc.motorTorque = (float)(motor * maxMotorTorque * driveDirection);

}

//Old Brakes applying code using GetKey

/*if (Input.GetKey (KeyCode.B) == true) {

wheelc.brakeTorque = maxBrakeTorque;

} else {

wheelc.brakeTorque = 0f;

}*/

if (brakesOn == true) {

if (BrakeTorquePercent < 1f)

BrakeTorquePercent = BrakeTorquePercent + brakepercentadd;

if (BrakeTorquePercent > 1f)

BrakeTorquePercent = 1f;

if (Debugtoggle == true)

Debug.Log ("Applying Percent Brakes : " + BrakeTorquePercent);

} else {

if (BrakeTorquePercent > 0f)

BrakeTorquePercent = BrakeTorquePercent - brakepercentsub;

if (BrakeTorquePercent < 0f)

BrakeTorquePercent = 0f;

}

if ((maxBrakeTorque * BrakeTorquePercent) > rollingResistance)

wheelc.brakeTorque = maxBrakeTorque * BrakeTorquePercent;

else

if (vessel.srf_velocity.magnitude < 0.1)

wheelc.brakeTorque = rollingResistance;

//Debug.Log (KSPActionGroup.Brakes);

//Debug.Log (Input.GetKey(KeyCode.B));

//var hit : Physics.RaycastHit;

/*

float susdist = wheelc.radius + wheelc.suspensionDistance;

RaycastHit hit = new RaycastHit ();

if (Physics.Raycast (wheelc.transform.position, -transform.up, out hit, susdist)) {

suspensionTransform.position = hit.point + (this.part.transform.up * wheelc.radius);

} else {

suspensionTransform.position = wheelc.transform.position - (this.part.transform.up * wheelc.suspensionDistance);

}

*/

/*

WheelHit whit = new WheelHit ();

if (wheelc.GetGroundHit (out whit)) {

suspensionTransform.position = whit.point + (this.part.transform.up * wheelc.radius);

if (whit.forwardSlip + whit.sidewaysSlip > 0.9) {

Debug.Log ("skidding at " + whit.forwardSlip + " by " + whit.sidewaysSlip);

skidSmoke.transform.position = whit.point;

skidSmoke.particleEmitter.emit = true;

} else {

skidSmoke.particleEmitter.emit = false;

}

} else {

suspensionTransform.position = wheelc.transform.position - (this.part.transform.up * wheelc.suspensionDistance);

skidSmoke.particleEmitter.emit = false;

}

*/

wheelModel.RotateAroundLocal (wheelRotationAxis, wheelc.rpm * rotationFactor * Time.deltaTime);

WheelHit whit = new WheelHit ();

RaycastHit hit = new RaycastHit ();

if (wheelc.GetGroundHit (out whit)) {

Physics.Raycast (wheelc.transform.position, -wheelc.transform.up, out hit);

Vector3 hitlag = (whit.point - hit.point);

if (Debugtoggle == true)

Debug.Log ("Lagging " + hitlag.magnitude + " Deltatime " + Time.deltaTime);

whit.point = whit.point + vessel.srf_velocity*Time.deltaTime;

hitlag = (whit.point - hit.point);

if (Debugtoggle == true){

Debug.Log ("Lagging " + hitlag.magnitude + "velocity = " + vessel.srf_velocity*Time.deltaTime);

}

whit.point = wheelc.transform.InverseTransformPoint (whit.point);

whit.point = wheelc.transform.TransformPoint (0, whit.point.y + contactDisplace, 0);

suspensionTransform.position = whit.point + (wheelc.transform.up * wheelc.radius);

if (Math.Abs (whit.forwardSlip) + Math.Abs (whit.sidewaysSlip) > smokestart) {

skidSmoke.transform.position = whit.point;

skidSmoke.particleEmitter.emit = true;

} else {

skidSmoke.particleEmitter.emit = false;

}

WheelFrictionCurve sf = wheelc.sidewaysFriction;

WheelFrictionCurve ff = wheelc.forwardFriction;

Vector3 gee = FlightGlobals.getGeeForceAtPosition (transform.position);

//sf.stiffness = (0.1f/(1f+(wheelc.rpm/50f)));

//sf.stiffness = (1f/(10f * (1f+((float)vessel.srf_velocity.magnitude*velslidefactor)+slidefactor*(Math.Abs(whit.sidewaysSlip)+Math.Abs(whit.forwardSlip)))));

//sf.stiffness = (1f/(10f * (1f+((float)vessel.srf_velocity.magnitude*velslidefactor)*slidefactor*(Math.Abs(whit.sidewaysSlip)+Math.Abs(whit.forwardSlip)))));

//sf.stiffness = (1f/(10f * (1f+((float)vessel.srf_velocity.magnitude*velslidefactor)*slidefactor*(float)Math.Pow ((Math.Abs(whit.sidewaysSlip)+Math.Abs(whit.forwardSlip)),0.5f))));

sf.stiffness = (TimeWarp.CurrentRate / (10f + (slidefactor * (float)Math.Pow ((Math.Abs (whit.sidewaysSlip) + 0f * Math.Abs (whit.forwardSlip)), slidepower))));

ff.stiffness = (TimeWarp.CurrentRate / (7.5f * (1 + Math.Abs (whit.forwardSlip))));

if (Debugtoggle == true) {

//Debug.Log ("gee " + gee.magnitude);

Debug.Log ("partvel " + vessel.srf_velocity.magnitude);

Debug.Log ("skidding at " + Math.Abs (whit.forwardSlip) + " by " + Math.Abs (whit.sidewaysSlip));

Debug.Log (sf.stiffness);

Debug.Log (ff.stiffness);

Debug.Log ("timewarp : " + TimeWarp.CurrentRate);

}

wheelc.sidewaysFriction = sf;

wheelc.forwardFriction = ff;

} else {

suspensionTransform.position = wheelc.transform.position - (wheelc.transform.up * (wheelc.suspensionDistance + contactDisplace));

skidSmoke.particleEmitter.emit = false;

}

//deal with rotating levers

if (rotatingLever) {

//rotatingLever.LookAt (rotatingLever.position + wheelc.transform.right, Vector3.Normalize (wheelModel.position - rotatingLever.position));

//rotatingLever.LookAt (wheelc.transform, transform.TransformPoint (new Vector3(1,0,0)));

//rotatingLever.localRotation = Quaternion.LookRotation (wheelModel.position, rotatingLever.position + rotatingLever.TransformDirection (1,0,0));

rotatingLever.LookAt ((rotatingLever.position + part.transform.TransformDirection (1, 0, 0)), Vector3.Normalize (wheelModel.position - rotatingLever.position));

}

}

}

}

Edited by Jakey4150
Link to comment
Share on other sites

This thread is quite old. Please consider starting a new thread rather than reviving this one.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...