Advertisement
DatAmazingCheese

Magical Suspension

Dec 18th, 2016
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.21 KB | None | 0 0
  1. @name Magical Suspension
  2. @outputs Left:array Right:array Ent:entity
  3. @persist DRVWheel Width Left:array Right:array Lefts Rights Constant Dampening RelDampening LDone LCount RDone RCount RD LD Selecting Ent:entity Base:entity Go Spawning Q
  4. @trigger
  5.  
  6. if(first()){
  7.  
  8. #Credits to Dakota for making the suspension code. Aerthas for making it chat controlled & user friendly.
  9.  
  10. #Credits to DatAmazingCheese for making it more user friendly via more precise prompts & labels.
  11.  
  12. #You can find a written guide here!
  13.  
  14. #http://pastebin.com/NZRMmnUb
  15.  
  16. runOnTick(1)
  17. runOnChat(1)
  18.  
  19. ########## VARIABLES MAKE SURE TO CHANGE ##########
  20.  
  21. # DRIVE SPROCKET #
  22.  
  23. DRVWheel = 1 #which wheel *from the back forward* is the drive wheel
  24.  
  25. # ELASTIC SETTINGS #
  26.  
  27. Constant = 50000
  28. Dampening = 1500
  29. RelDampening = 100
  30.  
  31. # ELASTIC COUNT #
  32.  
  33. RCount = 1 #how many elastics per wheel on the right side
  34. LCount = 1 #how many elastics per wheel on the left side
  35.  
  36. ########## DONT TOUCH UNDER HERE ##########
  37.  
  38. RDone = 0
  39. LDone = 0
  40.  
  41. Left=array()
  42. Right=array()
  43. Lefts = 0
  44. Rights = 0
  45.  
  46. holoCreate(1)
  47. holoColor(1,vec(255,0,0))
  48. holoAlpha(1,0)
  49.  
  50. print("Use the gravity gun and right click on your base plate. Type >start in chat after you have selected it.")
  51. function number array:hasValue( Entity:entity ) {
  52. for(I=1,This:count()) {
  53. if (This[I,entity] == Entity) {
  54. return 1
  55. }
  56. }
  57. return 0
  58. }
  59.  
  60. function number array:returnIndex( Entity:entity){
  61. for(I=1,This:count()) {
  62. if (This[I,entity] == Entity) {
  63. return I
  64. }
  65. }
  66. return 0
  67. }
  68. }
  69. Ent = owner():aimEntity()
  70. if(changed(owner():keyAttack2())&owner():keyAttack2()&Ent:isValid() & Selecting == 0 & owner():weapon():type() == "weapon_physcannon"){
  71. holoUnparent(1)
  72. holoAlpha(1,255)
  73. holoPos(1,Ent:pos())
  74. holoAng(1,Ent:angles())
  75. holoModel(1,Ent:model())
  76. holoParent(1,Ent)
  77.  
  78. Base = Ent
  79. }
  80. if(chatClk(owner())&owner():lastSaid():explode(""):string(1)==">"){
  81. hideChat(1)
  82.  
  83. if(owner():lastSaid():explode(" "):string(1):lower()==">start"){
  84. Selecting = 1
  85. holoColor(1,vec(0,255,0))
  86. print("Begin selecting your wheels. Start selecting wheels from front to back.")
  87. print("Left click for left side, right click for right side")
  88. print("Once finished selecting type >end [THICKNESS] to complete the suspension.")
  89. }
  90. if(owner():lastSaid():explode(" "):string(1):lower()==">end"){
  91. if(lastSaid():explode(" "):string(2):toNumber():toString() != lastSaid():explode(" "):string(2)){
  92. print("Please define suspension thickness! (Say >end [THICKNESS])")
  93. }
  94. else{
  95. Selecting = 0
  96. Width = owner():lastSaid():explode(" "):string(2):toNumber()
  97. Spawning = 1
  98. print(Spawning)
  99. }
  100. }
  101. }
  102. if(Selecting==1){
  103. if(owner():weapon():type() == "weapon_physcannon"){
  104. if(changed(owner():keyAttack1())&owner():keyAttack1()&!Left:hasValue(Ent)&Ent:isValid()){
  105. Lefts += 1
  106. Left[Lefts,entity] = Ent
  107. Ent:setColor(vec(0,0,255))
  108. print("Added "+toString(Ent)+" to the left side! Total: "+Lefts)
  109. }
  110. if(changed(owner():keyAttack2())&owner():keyAttack2()&!Right:hasValue(Ent)&Ent:isValid()){
  111. Rights += 1
  112. Right[Rights,entity] = Ent
  113. Ent:setColor(vec(255,0,0))
  114. print("Added "+toString(Ent)+" to the right side! Total: "+Rights)
  115. }
  116. if(changed(owner():keyReload())&owner():keyReload()&Ent:isValid()){
  117. if(Left:hasValue(Ent)){
  118. Left:removeEntity(Left:returnIndex(Ent))
  119. Ent:setColor(vec(255,255,255))
  120. Lefts--
  121. }
  122. elseif(Right:hasValue(Ent)){
  123. Right:removeEntity(Right:returnIndex(Ent))
  124. Ent:setColor(vec(255,255,255))
  125. Rights--
  126. }
  127. }
  128. }
  129. }
  130. if(Spawning == 1){
  131. if(Q <= Lefts&propCanCreate()){
  132. Q++
  133. POS = Left[Q,entity]:pos()
  134. ANG = Left[Q,entity]:angles()
  135. MODEL = Left[Q,entity]:model()
  136. MAT = Left[Q,entity]:getMaterial()
  137. Left[Q,entity]:propDelete()
  138. Left[Q,entity]=propSpawn(MODEL,POS,ANG,1)
  139. Left[Q,entity]:setMaterial(MAT)
  140. }
  141. if(Q == Lefts){
  142. Spawning = 2
  143. print(Spawning)
  144. Q = 0
  145. }
  146. }
  147. elseif(Spawning == 2){
  148. if(Q <= Rights&propCanCreate()){
  149. Q++
  150. POS = Right[Q,entity]:pos()
  151. ANG = Right[Q,entity]:angles()
  152. MODEL = Right[Q,entity]:model()
  153. MAT = Right[Q,entity]:getMaterial()
  154. Right[Q,entity]:propDelete()
  155. Right[Q,entity]=propSpawn(MODEL,POS,ANG,1)
  156. Right[Q,entity]:setMaterial(MAT)
  157. }
  158. if(Q == Rights){
  159. Spawning = 0
  160. Go = 1
  161. }
  162. }
  163.  
  164. if(changed(Go)&Go){
  165. LeftPos = -(Left[1,entity]:massCenter() - Left[Left:count(),entity]:massCenter())
  166. RightPos = -(Right[1,entity]:massCenter() - Right[Right:count(),entity]:massCenter())
  167. ToLeftPos = -(Right[1,entity]:massCenter() - Left[Left:count(),entity]:massCenter())
  168. ToRightPos = -(Left[1,entity]:massCenter() - Right[Right:count(),entity]:massCenter())
  169.  
  170. for(I=1,Lefts){
  171. Left[I,entity]:advballsocketTo(Base,Left[I,entity]:boxCenter(),(Left[I,entity]:massCenter()-Base:massCenter()):rotate(-Base:angles()),vec(-180,-0.1,-0.1),vec(180,0.1,0.1),vec(0,0,0),0,0,1,0)
  172. Left[I,entity]:advballsocketTo(Left[DRVWheel,entity],Left[I,entity]:boxCenter(),Left[I,entity]:boxCenter(),vec(-0.1,-0.1,-0.1),vec(0.1,0.1,0.1),vec(0,0,0),0,0,1,0)
  173. Left[I,entity]:ropeTo(Base,Left[I,entity]:boxCenter(),(LeftPos + Left[I,entity]:massCenter()-Base:massCenter()):rotate(-Base:angles()),0,0,Width,"",1)
  174. Left[I,entity]:ropeTo(Base,Left[I,entity]:boxCenter(),(ToRightPos + Left[I,entity]:massCenter()-Base:massCenter()):rotate(-Base:angles()),0,0,Width,"",1)
  175. #noCollide(Left[I,entity],Base)
  176.  
  177. for(J=1,LCount){
  178. Left[I,entity]:elasticTo(Base,Left[I,entity]:boxCenter(),(Left[I,entity]:massCenter()-Base:massCenter()):rotate(-Base:angles()),Constant,Dampening,RelDampening,"",0,1)
  179. }
  180. #Left[I,entity]:makeSpherical(Left[I,entity]:boxSize():z()/2)
  181. if(I==Left:count()){
  182. LD = 1
  183. print("Left Done")
  184. }
  185. else{
  186. #noCollide(Left[I,entity],Left[I+1,entity])
  187. }
  188.  
  189. }
  190.  
  191. for(I=1,Rights){
  192. Right[I,entity]:advballsocketTo(Base,Right[I,entity]:boxCenter(),(Right[I,entity]:massCenter()-Base:massCenter()):rotate(-Base:angles()),vec(-180,-0.1,-0.1),vec(180,0.1,0.1),vec(0,0,0),0,0,1,0)
  193. Right[I,entity]:advballsocketTo(Right[DRVWheel,entity],Right[I,entity]:boxCenter(),Right[I,entity]:boxCenter(),vec(-0.1,-0.1,-0.1),vec(0.1,0.1,0.1),vec(0,0,0),0,0,1,0)
  194. Right[I,entity]:ropeTo(Base,Right[I,entity]:boxCenter(),(RightPos + Right[I,entity]:massCenter()-Base:massCenter()):rotate(-Base:angles()),0,0,Width,"",1)
  195. Right[I,entity]:ropeTo(Base,Right[I,entity]:boxCenter(),(ToLeftPos + Right[I,entity]:massCenter()-Base:massCenter()):rotate(-Base:angles()),0,0,Width,"",1)
  196. #noCollide(Right[I,entity],Base)
  197.  
  198. for(J=1,RCount){
  199. Right[I,entity]:elasticTo(Base,Right[I,entity]:boxCenter(),(Right[I,entity]:massCenter()-Base:massCenter()):rotate(-Base:angles()),Constant,Dampening,RelDampening,"",0,1)
  200. }
  201. #Right[I,entity]:makeSpherical(Right[I,entity]:boxSize():z()/2)
  202.  
  203. if(I==Right:count()){
  204. RD = 1
  205. print("Right Done")
  206. }
  207. else{
  208. #noCollide(Right[I,entity],Right[I+1,entity])
  209. }
  210. }
  211. }
  212. if(changed(RD)&RD == 1 & LD == 1|changed(LD)&LD == 1 & RD == 1){
  213. print("Make sure to redo the following:\nMake Spherical\nNo-Collide\nACF Armor/HP/Weight")
  214. Selection = 0
  215. Go = 0
  216. holoAlpha(1,0)
  217. holoColor(1,vec(255,0,0))
  218.  
  219. Left:clear()
  220. Right:clear()
  221. Lefts = 0
  222. Rights = 0
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement