Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @name Universal Prop Transmission V2
- @inputs [WheelFL WheelFR WheelRL WheelRR RotatingObject]:entity Gearup Geardown Base:entity MaxRPM RPMIn ClutchINOUT ThrottleIn AutoKickdown DiffLock
- @outputs Gear Ratio Clutch ThrottleOut GPSSpeed WheelSpeed FullRatio RPMToSpeed Shifted FrntTransferCaseDif RearTransferCaseDif
- @persist Wheels:array RotatingObjectWeight PistonWeight FullRatio FinalRotational RAngVelocity DefinedClutch DifRat
- @persist Ratio Gear FinalMass AngVelMult Clutch AngVel1 AngVel2 GearV WheelMass Gears:array Shifted DifferentialType WheelRatios:array FrntSlip RearSlip RearAngVel
- @persist StaticCalc Ratios:array AutoRatio GearAmount AutoOrManual ShiftSound:string ClutchSensitivity SensitivityMath GPSSpeed ShiftTime MaxSlip:array TransferCaseOptions Realistic
- @trigger
- runOnTick(1)
- if(first() | dupefinished()) {
- #LINK EVERY WHEEL EVEN IF YOU WANT RWD OR FWD
- #Diffential Math and tranmission prerequisets
- DifRat = 1/3.98 #Overall Differential Ratio
- AngVelMult = 1
- FinalMass = 1480 #Change mass based on your All the mass your vehicle is equal up too, If you dont wanna do math be safe and do your baseplate mass + 200
- Realistic = 0 #Changes it so its physically realistic THIS WILL PUT STRAIN ON THE ENGINE A LOT #You will also need to change ratios after doing this
- #Transmission Options
- TransferCaseOptions = 0 #0 is RWD 1 is FWD 2 is AWD 3 is 4WD
- GearAmount = 6 #How many gears you want your car to have
- Ratios = array((1/0.08),(1/0.1),(1/0.14),(1/0.19),(1/0.25),(1/0.3),(1/0.4)) #ALWAYS GOES (reverse 1 2...) FOR RATIOS
- ShiftSound = "acf_extra/vehiclefx/trans/default_shift.wav"
- ClutchSensitivity = 1.1 #Determines how light or how hard the clutch is going to be in reverse or first DOES NOT MATTER IF MANUAL OR AUTOMATIC (Adjust to biting point of your engine if possible)
- ShiftTime = 20 #In MS for manual or auto how long it takes to shift to the next gear
- AutoOrManual = 1 #Auto is 0 Manual is 1
- AutoRatio = 0 #If 1 will determine ratios automatically based on ShiftRPM #Does not work yet
- ShiftRPM = 5000 #This is what your rpm would be at from each shift from max rpm #Does not work yet
- DifferentialType = 4 #1 is open dif,2 locked dif, 3 locking diff,4 limited slip dif, 5 welded dif
- #End of config
- Wheels = array(WheelFL,WheelRL,WheelFR,WheelRR)
- RotatingObjectWeight = (RotatingObject:mass()/RotatingObject:inertia():z())
- WheelMass = WheelFL:mass()
- MaxSlip = array(600,100,400,600,50)
- if(TransferCaseOptions == 0) {
- Wheels = array(WheelRL,WheelRR)
- }
- elseif(TransferCaseOptions == 1) {
- Wheels = array(WheelFL,WheelFR)
- }
- }
- ClutchINOUT = !ClutchINOUT
- #GearChanging
- if(changed(Gearup)&Gearup) {
- if(Gear == 0) {
- GearV = 1
- RotatingObject:soundPlay(1,1,ShiftSound)
- }
- if(Gear < GearAmount) {
- Gear++
- Clutch = 0
- Shifted = 0
- ThrottleOut = 0
- }
- }
- elseif(changed(Geardown)&Geardown) {
- if(Gear != -1) {
- if(Gear == 0) {
- GearV = -1
- RotatingObject:soundPlay(1,1,ShiftSound)
- }
- Gear--
- Clutch = 0
- Shifted = 0
- ThrottleOut = 0
- }
- }
- elseif(Gear == 0) {
- GearV = 0
- Calc = 0
- ThrottleOut = ThrottleIn
- }
- #End Of Gear Changing
- #Start of Transmission Math and application
- if(GearV != 0) {
- Ratio = Ratios[clamp(Gear+1,1,GearAmount+1),number]
- FullRatio = (1/(DifRat+Ratio))
- if(RotatingObject:angVel():yaw() < 100) { GearV = 0 Gear = 0 Clutch = 0 ThrottleOut = ThrottleIn exit()}
- #Wheel Speed Calculation
- GPSSpeed = toUnit("mi/h",sqrt(Base:velL():x()^2+Base:velL():y()^2+Base:velL():z()^2))
- WheelSpeed = ((StaticCalc * -Wheels[1,entity]:angVel():pitch())*0.90691344583)*GearV
- if(GPSSpeed >= 5&StaticCalc == 0&ThrottleIn == 0) {
- StaticCalc = (GPSSpeed/-Wheels[1,entity]:angVel():pitch())
- ThrottleOut = ThrottleIn
- }
- #Clutch Math
- #RPMToSpeed = StaticCalc*((FullRatio*(RPMIn*6))/1.5)
- #ALL MANUAL MODE
- if(Gear == 1|Gear == -1) {
- #Clutch Unedited will fully go in around half the max speed of 1st or reverse
- ThrottleOut = ThrottleIn
- #If Throttle is pressed in
- if(ThrottleIn > 0) {
- if(!StaticCalc) {
- SensitivityMath = clamp(GPSSpeed/(((FullRatio*(MaxRPM/ClutchSensitivity))*0.026)),0.1*ClutchSensitivity,1)
- }
- else{
- SensitivityMath = clamp(-WheelSpeed/(((FullRatio*(MaxRPM/ClutchSensitivity))*StaticCalc)),0.1*ClutchSensitivity,1)
- }
- }
- #Idle
- else{
- if(!StaticCalc) {
- SensitivityMath = clamp((GPSSpeed/(((FullRatio*(MaxRPM/ClutchSensitivity))*0.026))),0.1*ClutchSensitivity,1)
- }
- else{SensitivityMath = clamp(-WheelSpeed/(((FullRatio*(MaxRPM/ClutchSensitivity))*StaticCalc)),0.1*ClutchSensitivity,1)}
- }
- Clutch = clamp(SensitivityMath,0,1)
- }
- elseif(Gear > 1) {
- #For the rest of the gears and shift time
- if(Clutch == 0) {
- timer("ShiftTime",ShiftTime)
- Shifted = 0
- ThrottleOut = 0
- }
- elseif(Shifted >= 1) {
- ThrottleOut = ThrottleIn
- }
- }
- #End Of Manual Mode
- #Wheel and Rotating object application
- if(DifferentialType == 1) {
- #open dif
- if(TransferCaseOptions < 2) {
- WheelRatios[2,number] = abs(1-clamp(((Wheels[1,entity]:angVel():pitch()-(-Wheels[2,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1)) WheelRatios[2,number] = WheelRatios[1,number]+abs(1-WheelRatios[2,number])
- WheelRatios[1,number] = abs(1-clamp(((-Wheels[2,entity]:angVel():pitch()-(Wheels[1,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1)) WheelRatios[1,number] = WheelRatios[2,number]+abs(1-WheelRatios[1,number])
- WheelRatios[4,number] = abs(1-clamp(((Wheels[3,entity]:angVel():pitch()-(-Wheels[4,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1)) WheelRatios[4,number] = WheelRatios[3,number]+abs(1-WheelRatios[4,number])
- WheelRatios[3,number] = abs(1-clamp(((-Wheels[4,entity]:angVel():pitch()-(Wheels[3,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1)) WheelRatios[3,number] = WheelRatios[4,number]+abs(1-WheelRatios[3,number])
- }
- else{
- WheelRatios[3,number] = abs(1-clamp(((Wheels[1,entity]:angVel():pitch()-(-Wheels[3,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1)) WheelRatios[3,number] = WheelRatios[1,number]+abs(1-WheelRatios[3,number])
- WheelRatios[1,number] = abs(1-clamp(((-Wheels[3,entity]:angVel():pitch()-(Wheels[1,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1)) WheelRatios[1,number] = WheelRatios[3,number]+abs(1-WheelRatios[1,number])
- WheelRatios[4,number] = abs(1-clamp(((Wheels[2,entity]:angVel():pitch()-(-Wheels[4,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1)) WheelRatios[4,number] = WheelRatios[2,number]+abs(1-WheelRatios[4,number])
- WheelRatios[2,number] = abs(1-clamp(((-Wheels[4,entity]:angVel():pitch()-(Wheels[2,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1)) WheelRatios[2,number] = WheelRatios[4,number]+abs(1-WheelRatios[2,number])
- }
- }
- else{
- #other difs
- FrntAngVel = Wheels[1,entity]:angVel():pitch()+(-Wheels[3,entity]:angVel():pitch())
- RearAngVel = Wheels[2,entity]:angVel():pitch()+(-Wheels[4,entity]:angVel():pitch())
- FrntSlip = 1-(FrntAngVel-RearAngVel)/600
- RearSlip = 1-(RearAngVel-FrntAngVel)/600
- FrntSlip = clamp(FrntSlip+(1-RearSlip),0,1)
- RearSlip = clamp(RearSlip+(1-FrntSlip),0,1)
- if(TransferCaseOptions == 3) {
- FrntTransferCaseDif = clamp(TransferCaseOptions-2,0,1)*FrntSlip
- RearTransferCaseDif = clamp(TransferCaseOptions-2,0,1)*RearSlip
- }
- else{FrntTransferCaseDif = 1 RearTransferCaseDif = 1}
- if(TransferCaseOptions < 2) {
- WheelRatios[1,number] = abs(1-clamp(((Wheels[1,entity]:angVel():pitch()-(-Wheels[2,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1)) WheelRatios[1,number] = WheelRatios[1,number]+abs(1-WheelRatios[2,number])
- WheelRatios[2,number] = abs(1-clamp(((-Wheels[2,entity]:angVel():pitch()-(Wheels[1,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1)) WheelRatios[2,number] = WheelRatios[2,number]+abs(1-WheelRatios[1,number])
- WheelRatios[3,number] = abs(1-clamp(((Wheels[3,entity]:angVel():pitch()-(-Wheels[4,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1)) WheelRatios[3,number] = WheelRatios[3,number]+abs(1-WheelRatios[4,number])
- WheelRatios[4,number] = abs(1-clamp(((-Wheels[4,entity]:angVel():pitch()-(Wheels[3,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1)) WheelRatios[4,number] = WheelRatios[4,number]+abs(1-WheelRatios[3,number])
- }
- else{
- WheelRatios[1,number] = abs(1-clamp(((Wheels[1,entity]:angVel():pitch()-(-Wheels[3,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1))*FrntTransferCaseDif WheelRatios[1,number] = (WheelRatios[1,number]+abs(1-WheelRatios[3,number]))
- WheelRatios[3,number] = abs(1-clamp(((-Wheels[2,entity]:angVel():pitch()-(Wheels[1,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1))*FrntTransferCaseDif WheelRatios[3,number] = (WheelRatios[3,number]+abs(1-WheelRatios[1,number]))
- WheelRatios[2,number] = abs(1-clamp(((Wheels[3,entity]:angVel():pitch()-(-Wheels[4,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1))*RearTransferCaseDif WheelRatios[2,number] = (WheelRatios[2,number]+abs(1-WheelRatios[4,number]))
- WheelRatios[4,number] = abs(1-clamp(((-Wheels[4,entity]:angVel():pitch()-(Wheels[2,entity]:angVel():pitch()))/MaxSlip[DifferentialType,number]),0,1))*RearTransferCaseDif WheelRatios[4,number] = (WheelRatios[4,number]+abs(1-WheelRatios[2,number]))
- }
- }
- for(A=1,Wheels:count(),1) {
- if(A <= Wheels:count()/2) {
- WAngVelocity = Wheels[A,entity]:angVel():pitch()
- RAngVelocity = (RotatingObject:angVel():yaw()*6)*(FullRatio)
- PercentageDifference = 1 - abs(WAngVelocity) / (RAngVelocity + 0.1) #Prevent division issues
- RotationalDifference = abs(abs(WAngVelocity)-RAngVelocity)
- FinalRotational = ((RotationalDifference*((RotationalDifference+(RotatingObjectWeight))/RotationalDifference))*PercentageDifference)
- FinalWheel = (RotationalDifference * PercentageDifference) * (FinalMass / WheelMass) * (1/FullRatio)
- Wheels[A,entity]:applyAngForce(ang(FinalWheel*Clutch*GearV,0,0)*WheelRatios[A,number]) #EDIT THIS LINE IF WHEELS ARNT SPINNING IN SAME DIRECTION
- }
- else{
- WAngVelocity = -Wheels[A,entity]:angVel():pitch()
- RAngVelocity = (RotatingObject:angVel():yaw()*6)*(FullRatio)
- PercentageDifference = 1 - abs(WAngVelocity) / (RAngVelocity + 0.1) #Prevent division issues
- RotationalDifference = abs(abs(WAngVelocity)-RAngVelocity)
- FinalRotational = ((RotationalDifference*((RotationalDifference+(RotatingObjectWeight))/RotationalDifference))*PercentageDifference)
- FinalWheel = (RotationalDifference * PercentageDifference) * (FinalMass / WheelMass) * (1/FullRatio)
- Wheels[A,entity]:applyAngForce(ang(-FinalWheel*Clutch*GearV,0,0)*WheelRatios[A,number]) #also this line
- }
- RotatingObject:applyAngForce(ang(0,(-FinalRotational*Clutch),0))
- }
- }
- WheelSpeed = ((StaticCalc * -Wheels[1,entity]:angVel():pitch())*0.90691344583)*GearV
- #Timers
- #ShiftTimer
- if(clk("ShiftTime")) {
- if(AutoOrManual == 1) {
- if(Shifted < 1) {
- Shifted+=(ShiftTime/100)
- Clutch = clamp(Shifted,0,1)
- timer("ShiftTime",ShiftTime)
- }
- else{stoptimer("ShiftTime") RotatingObject:soundPlay(1,1,ShiftSound)}
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment