lowlyforskin

Version 2 of e2 transmission

Jan 6th, 2025 (edited)
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.46 KB | Gaming | 0 0
  1. @name Universal Prop Transmission V2
  2. @inputs [WheelFL WheelFR WheelRL WheelRR RotatingObject]:entity Gearup Geardown Base:entity MaxRPM RPMIn ClutchINOUT ThrottleIn AutoKickdown DiffLock
  3. @outputs Gear Ratio Clutch ThrottleOut GPSSpeed WheelSpeed FullRatio RPMToSpeed Shifted FrntTransferCaseDif RearTransferCaseDif
  4. @persist Wheels:array RotatingObjectWeight PistonWeight FullRatio FinalRotational RAngVelocity DefinedClutch DifRat
  5. @persist Ratio Gear FinalMass AngVelMult Clutch AngVel1 AngVel2 GearV WheelMass Gears:array Shifted DifferentialType WheelRatios:array FrntSlip RearSlip RearAngVel
  6. @persist StaticCalc Ratios:array AutoRatio GearAmount AutoOrManual ShiftSound:string ClutchSensitivity SensitivityMath GPSSpeed ShiftTime MaxSlip:array TransferCaseOptions Realistic
  7. @trigger
  8. runOnTick(1)
  9. if(first() | dupefinished()) {
  10. #LINK EVERY WHEEL EVEN IF YOU WANT RWD OR FWD
  11.  
  12. #Diffential Math and tranmission prerequisets
  13. DifRat = 1/3.98 #Overall Differential Ratio
  14. AngVelMult = 1
  15. 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
  16. 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
  17. #Transmission Options
  18.  
  19. TransferCaseOptions = 0 #0 is RWD 1 is FWD 2 is AWD 3 is 4WD
  20. GearAmount = 6 #How many gears you want your car to have
  21. 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
  22. ShiftSound = "acf_extra/vehiclefx/trans/default_shift.wav"
  23. 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)
  24. ShiftTime = 20 #In MS for manual or auto how long it takes to shift to the next gear
  25. AutoOrManual = 1 #Auto is 0 Manual is 1
  26. AutoRatio = 0 #If 1 will determine ratios automatically based on ShiftRPM #Does not work yet
  27. ShiftRPM = 5000 #This is what your rpm would be at from each shift from max rpm #Does not work yet
  28. DifferentialType = 4 #1 is open dif,2 locked dif, 3 locking diff,4 limited slip dif, 5 welded dif
  29. #End of config
  30.  
  31. Wheels = array(WheelFL,WheelRL,WheelFR,WheelRR)
  32. RotatingObjectWeight = (RotatingObject:mass()/RotatingObject:inertia():z())
  33. WheelMass = WheelFL:mass()
  34. MaxSlip = array(600,100,400,600,50)
  35.  
  36. if(TransferCaseOptions == 0) {
  37. Wheels = array(WheelRL,WheelRR)
  38. }
  39. elseif(TransferCaseOptions == 1) {
  40. Wheels = array(WheelFL,WheelFR)
  41. }
  42. }
  43. ClutchINOUT = !ClutchINOUT
  44.  
  45. #GearChanging
  46. if(changed(Gearup)&Gearup) {
  47. if(Gear == 0) {
  48. GearV = 1
  49. RotatingObject:soundPlay(1,1,ShiftSound)
  50. }
  51. if(Gear < GearAmount) {
  52. Gear++
  53. Clutch = 0
  54. Shifted = 0
  55. ThrottleOut = 0
  56. }
  57. }
  58. elseif(changed(Geardown)&Geardown) {
  59. if(Gear != -1) {
  60. if(Gear == 0) {
  61. GearV = -1
  62. RotatingObject:soundPlay(1,1,ShiftSound)
  63. }
  64. Gear--
  65. Clutch = 0
  66. Shifted = 0
  67. ThrottleOut = 0
  68. }
  69. }
  70. elseif(Gear == 0) {
  71. GearV = 0
  72. Calc = 0
  73. ThrottleOut = ThrottleIn
  74. }
  75. #End Of Gear Changing
  76.  
  77. #Start of Transmission Math and application
  78. if(GearV != 0) {
  79. Ratio = Ratios[clamp(Gear+1,1,GearAmount+1),number]
  80. FullRatio = (1/(DifRat+Ratio))
  81. if(RotatingObject:angVel():yaw() < 100) { GearV = 0 Gear = 0 Clutch = 0 ThrottleOut = ThrottleIn exit()}
  82.  
  83. #Wheel Speed Calculation
  84. GPSSpeed = toUnit("mi/h",sqrt(Base:velL():x()^2+Base:velL():y()^2+Base:velL():z()^2))
  85. WheelSpeed = ((StaticCalc * -Wheels[1,entity]:angVel():pitch())*0.90691344583)*GearV
  86. if(GPSSpeed >= 5&StaticCalc == 0&ThrottleIn == 0) {
  87. StaticCalc = (GPSSpeed/-Wheels[1,entity]:angVel():pitch())
  88. ThrottleOut = ThrottleIn
  89. }
  90. #Clutch Math
  91. #RPMToSpeed = StaticCalc*((FullRatio*(RPMIn*6))/1.5)
  92. #ALL MANUAL MODE
  93. if(Gear == 1|Gear == -1) {
  94. #Clutch Unedited will fully go in around half the max speed of 1st or reverse
  95. ThrottleOut = ThrottleIn
  96. #If Throttle is pressed in
  97. if(ThrottleIn > 0) {
  98. if(!StaticCalc) {
  99. SensitivityMath = clamp(GPSSpeed/(((FullRatio*(MaxRPM/ClutchSensitivity))*0.026)),0.1*ClutchSensitivity,1)
  100. }
  101. else{
  102. SensitivityMath = clamp(-WheelSpeed/(((FullRatio*(MaxRPM/ClutchSensitivity))*StaticCalc)),0.1*ClutchSensitivity,1)
  103. }
  104. }
  105. #Idle
  106. else{
  107. if(!StaticCalc) {
  108. SensitivityMath = clamp((GPSSpeed/(((FullRatio*(MaxRPM/ClutchSensitivity))*0.026))),0.1*ClutchSensitivity,1)
  109. }
  110. else{SensitivityMath = clamp(-WheelSpeed/(((FullRatio*(MaxRPM/ClutchSensitivity))*StaticCalc)),0.1*ClutchSensitivity,1)}
  111. }
  112. Clutch = clamp(SensitivityMath,0,1)
  113. }
  114. elseif(Gear > 1) {
  115. #For the rest of the gears and shift time
  116. if(Clutch == 0) {
  117. timer("ShiftTime",ShiftTime)
  118. Shifted = 0
  119. ThrottleOut = 0
  120. }
  121. elseif(Shifted >= 1) {
  122. ThrottleOut = ThrottleIn
  123. }
  124. }
  125. #End Of Manual Mode
  126.  
  127.  
  128. #Wheel and Rotating object application
  129. if(DifferentialType == 1) {
  130. #open dif
  131. if(TransferCaseOptions < 2) {
  132. 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])
  133. 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])
  134. 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])
  135. 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])
  136. }
  137. else{
  138. 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])
  139. 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])
  140. 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])
  141. 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])
  142.  
  143. }
  144.  
  145. }
  146. else{
  147. #other difs
  148. FrntAngVel = Wheels[1,entity]:angVel():pitch()+(-Wheels[3,entity]:angVel():pitch())
  149. RearAngVel = Wheels[2,entity]:angVel():pitch()+(-Wheels[4,entity]:angVel():pitch())
  150. FrntSlip = 1-(FrntAngVel-RearAngVel)/600
  151. RearSlip = 1-(RearAngVel-FrntAngVel)/600
  152. FrntSlip = clamp(FrntSlip+(1-RearSlip),0,1)
  153. RearSlip = clamp(RearSlip+(1-FrntSlip),0,1)
  154. if(TransferCaseOptions == 3) {
  155. FrntTransferCaseDif = clamp(TransferCaseOptions-2,0,1)*FrntSlip
  156. RearTransferCaseDif = clamp(TransferCaseOptions-2,0,1)*RearSlip
  157. }
  158. else{FrntTransferCaseDif = 1 RearTransferCaseDif = 1}
  159. if(TransferCaseOptions < 2) {
  160. 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])
  161. 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])
  162. 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])
  163. 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])
  164.  
  165. }
  166. else{
  167. 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]))
  168. 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]))
  169. 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]))
  170. 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]))
  171.  
  172. }
  173. }
  174. for(A=1,Wheels:count(),1) {
  175. if(A <= Wheels:count()/2) {
  176. WAngVelocity = Wheels[A,entity]:angVel():pitch()
  177. RAngVelocity = (RotatingObject:angVel():yaw()*6)*(FullRatio)
  178. PercentageDifference = 1 - abs(WAngVelocity) / (RAngVelocity + 0.1) #Prevent division issues
  179. RotationalDifference = abs(abs(WAngVelocity)-RAngVelocity)
  180. FinalRotational = ((RotationalDifference*((RotationalDifference+(RotatingObjectWeight))/RotationalDifference))*PercentageDifference)
  181. FinalWheel = (RotationalDifference * PercentageDifference) * (FinalMass / WheelMass) * (1/FullRatio)
  182.  
  183. Wheels[A,entity]:applyAngForce(ang(FinalWheel*Clutch*GearV,0,0)*WheelRatios[A,number]) #EDIT THIS LINE IF WHEELS ARNT SPINNING IN SAME DIRECTION
  184. }
  185. else{
  186. WAngVelocity = -Wheels[A,entity]:angVel():pitch()
  187. RAngVelocity = (RotatingObject:angVel():yaw()*6)*(FullRatio)
  188. PercentageDifference = 1 - abs(WAngVelocity) / (RAngVelocity + 0.1) #Prevent division issues
  189. RotationalDifference = abs(abs(WAngVelocity)-RAngVelocity)
  190. FinalRotational = ((RotationalDifference*((RotationalDifference+(RotatingObjectWeight))/RotationalDifference))*PercentageDifference)
  191. FinalWheel = (RotationalDifference * PercentageDifference) * (FinalMass / WheelMass) * (1/FullRatio)
  192.  
  193. Wheels[A,entity]:applyAngForce(ang(-FinalWheel*Clutch*GearV,0,0)*WheelRatios[A,number]) #also this line
  194. }
  195. RotatingObject:applyAngForce(ang(0,(-FinalRotational*Clutch),0))
  196. }
  197. }
  198. WheelSpeed = ((StaticCalc * -Wheels[1,entity]:angVel():pitch())*0.90691344583)*GearV
  199. #Timers
  200. #ShiftTimer
  201. if(clk("ShiftTime")) {
  202. if(AutoOrManual == 1) {
  203. if(Shifted < 1) {
  204. Shifted+=(ShiftTime/100)
  205. Clutch = clamp(Shifted,0,1)
  206. timer("ShiftTime",ShiftTime)
  207. }
  208. else{stoptimer("ShiftTime") RotatingObject:soundPlay(1,1,ShiftSound)}
  209.  
  210.  
  211. }
  212. }
  213.  
  214.  
  215.  
Tags: #gmod
Advertisement
Add Comment
Please, Sign In to add comment