Advertisement
artemx32

example to use CML

Jan 22nd, 2025
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 22.39 KB | None | 0 0
  1. --@name BMW_i7_chassis
  2. --@author artybyte
  3. --@shared
  4. --@model models/hunter/plates/plate2x4.mdl
  5.  
  6. -- IT CLOULD LOAD MESHES FROM LOCAL FOLDER. BE CAREFUL. UPDATE MESH .TXT EVENTUALLY (via local python script)
  7.  
  8. if CLIENT then  
  9.    
  10.     local chassis = { }
  11.    
  12.     --@include bmw_i7.txt
  13.     local BMW = require('bmw_i7.txt')    
  14.  
  15.     chassis.moveSound = nil
  16.  
  17.     chassis.driverPresented = false
  18.     chassis.passengerPresented = false
  19.    
  20.     chassis.moveSound = sound.create(chip(), "k_lab2.DropshipRotorLoop")
  21.     chassis.moveSound:play()
  22.     chassis.moveSound:setPitch(0)
  23.     chassis.front_vel = 0
  24.    
  25.     chassis.fl_wheel = nil
  26.     chassis.fr_wheel = nil
  27.     chassis.rl_wheel = nil
  28.     chassis.rr_wheel = nil
  29.    
  30.     chassis.wheels = { }
  31.     chassis.tires = { }
  32.    
  33.     chassis.steering = 0
  34.     chassis.LerpSteering = 0
  35.    
  36.     chassis.steeringArc = 32
  37.    
  38.     chassis.fl_wheel_tire = nil
  39.     chassis.fr_wheel_tire = nil
  40.     chassis.rl_wheel_tire = nil
  41.     chassis.rr_wheel_tire = nil
  42.    
  43.     BMW.Loader.SetOnPasteDoneContinuousFunction( function()
  44.        
  45.         local targ = chassis.steering - chassis.LerpSteering
  46.        
  47.         chassis.LerpSteering = chassis.LerpSteering + math.clamp( (chassis.steering) - chassis.LerpSteering, -targ/2, targ/2) / 2
  48.        
  49.         ComplexMeshLoader.HologramCollection["interior_steering_wheel"]:setAngles(
  50.             ComplexMeshLoader.HologramCollection["interior_steering_wheel"].parent:localToWorldAngles(Angle(chassis.LerpSteering * 8, 0, 0))
  51.         )
  52.        
  53.     end )
  54.    
  55.     BMW.on_done_paste = function(fl, fr, rl, rr, fl_tire, fr_tire, rl_tire, rr_tire)
  56.         table.insert(chassis.wheels, fl)
  57.         table.insert(chassis.wheels, fr)
  58.         table.insert(chassis.wheels, rl)
  59.         table.insert(chassis.wheels, rr)
  60.        
  61.         table.insert(chassis.tires, fl_tire)
  62.         table.insert(chassis.tires, fr_tire)
  63.         table.insert(chassis.tires, rl_tire)
  64.         table.insert(chassis.tires, rr_tire)
  65.        
  66.         net.start('BMW_i7_network')
  67.             net.writeTable({case="send_wheels", user=player():entIndex() })
  68.         net.send()
  69.     end
  70.    
  71.     net.receive('BMW_i7_network', function()
  72.         local t = net.readTable()
  73.         local case = t.case
  74.         if case == 'parent_wheels' then
  75.             local wheels = t.wheels
  76.             local entsWheels = { }
  77.            
  78.             local add_ang = Angle(0, -90, 0)
  79.            
  80.             table.insert(entsWheels, entity(wheels[2]))
  81.             table.insert(entsWheels, entity(wheels[1]))
  82.             table.insert(entsWheels, entity(wheels[4]))
  83.             table.insert(entsWheels, entity(wheels[3]))
  84.            
  85.             for i = 1, 4 do
  86.                 local wheel = chassis.wheels[i]
  87.                 local tire = chassis.tires[i]
  88.                 local target = entsWheels[i]
  89.                
  90.                 wheel:setParent(target)
  91.                 tire:setParent(target)
  92.                
  93.                 wheel:setPos(target:localToWorld(Vector()))
  94.                 tire:setPos(target:localToWorld(Vector()))
  95.                
  96.                 wheel:setAngles(target:localToWorldAngles(add_ang))
  97.                 tire:setAngles(target:localToWorldAngles(add_ang))
  98.             end
  99.         elseif case == 'steering' then
  100.             chassis.steering = t.steeringAngle
  101.         elseif case == 'abc' then
  102.            
  103.         end
  104.     end )
  105.    
  106.    
  107. end
  108.  
  109. if SERVER then
  110.    
  111.     -- Ultimate Ray Chassis
  112.    
  113.     //--@include infernus.txt
  114.     --local BMW = require('infernus.txt')
  115.    
  116.     --@include module/module_server_prop_spawner.txt
  117.     local SPAWNER = require('module/module_server_prop_spawner.txt')
  118.    
  119.     local chassis = { }
  120.    
  121.     chassis.params = { }
  122.     chassis.params.height = 28
  123.     chassis.params.zstabilization = 6
  124.     chassis.params.turnAng = 38
  125.     chassis.params.mass = 2500
  126.     chassis.params.spring = 6
  127.     chassis.params.power = 0.7  -- rusbuild. orig: 0.7
  128.     chassis.params.baseVec = Vector(35, 70, 0)
  129.     chassis.params.frontAxle = Vector(36, 65, 0)
  130.     chassis.params.rearAxle = Vector(36, 71, 0)
  131.     chassis.params.sideVec = { Vector(1, 1, 1), Vector(-1, 1, 1), Vector(1, -1, 1),Vector(-1, -1, 1) }
  132.    
  133.     chassis.controls          = { }
  134.     chassis.controls.W        = 0
  135.     chassis.controls.A        = 0
  136.     chassis.controls.S        = 0
  137.     chassis.controls.D        = 0
  138.     chassis.controls.SPACE    = 0
  139.     chassis.controls.SHIFT    = 0
  140.     chassis.controls.ALT      = 0
  141.    
  142.     chassis.phys_obj = chip():getPhysicsObject()
  143.     chassis.self = chip()
  144.     chassis.VC = { } -- main vector container and core of system
  145.     chassis.wheels = { }
  146.     chassis.driver = nil
  147.     chassis.passenger = nil
  148.     chassis.wheelModel = 'models/sprops/trans/wheel_d/t_wheel30.mdl'
  149.     chassis.wheelBodygroup = 5 -- ONLY FOR SPROPS. type -1 if no bodygroup
  150.     chassis.wheelColor = Color(45, 45, 45, 255)
  151.     chassis.driverSeatModel = 'models/nova/jeep_seat.mdl'
  152.     chassis.driverSeatLocalPos = Vector(18, -6, -5)
  153.     chassis.driverSeatLocalAng = Angle(0, 180, 15)
  154.     chassis.wheelHeight = 30  -- only for declared wheel model
  155.     chassis.wheelWideAX = 1
  156.     chassis.wheelContact = { }
  157.     chassis.wheelRotation = { }
  158.     chassis.wheelInertia = { }
  159.     chassis.steeringAngle = 0
  160.     chassis.dynamicLerp = 0
  161.     chassis.dynamicMult = 3.6 -- speed of acceleration \ decceleration
  162.     chassis.steeringAngleArc = 32 -- STEERING IN DEGREES
  163.     chassis.steeringAngleArcMin = 6 -- minimum degrees while speed at top
  164.     chassis.steeringDescendingCoeff = 0.025 -- until speed
  165.     chassis.steeringSpeed = 1
  166.     chassis.steeringPow = 4
  167.     chassis.accelerationLeanPower = 3
  168.     chassis.accelerationLean = 0
  169.     chassis.accelerationSubtractSpeed = 0.025
  170.     chassis.lastW = 0
  171.     chassis.lastS = 0
  172.     chassis.wheelAnchors = { }
  173.     chassis.wheelScale = Vector(0, 0, 0)
  174.     chassis.calcWheelHeight = false
  175.     chassis.tickSkip = 6 -- throttler to send networks
  176.     chassis.onSkip = 0
  177.    
  178.        
  179.     -- TODO: sound only when W \ S with interpolation smoothness of start and end!!!!
  180.     -- and same interpolation to gas and brake.
  181.        
  182.     -- WHEELS SHOULD BE SAME!!!!
  183.    
  184.     chassis.Initialize = function()
  185.         chassis.self:setMass(chassis.params.mass)
  186.         chassis.self:setColor(Color(0, 0, 0, 0))
  187.         chassis.self:setFrozen(true)
  188.        
  189.         SPAWNER.parent = chassis.self
  190.        
  191.         SPAWNER.add {
  192.             name='driverSeat',
  193.             seat=true,
  194.             local_pos=chassis.driverSeatLocalPos*Vector(1,0.5,-0.2),
  195.             local_ang=chassis.driverSeatLocalAng,
  196.             model=chassis.driverSeatModel,
  197.             color=Color(0,0,0,0)
  198.         }
  199.        
  200.         SPAWNER.add {
  201.             name='passengerSeat',
  202.             seat=true,
  203.             local_pos=chassis.driverSeatLocalPos*Vector(-1,0.5,-0.2),
  204.             local_ang=chassis.driverSeatLocalAng,
  205.             model=chassis.driverSeatModel,
  206.             color=Color(0,0,0,0)
  207.         }
  208.        
  209.         SPAWNER.add {
  210.             name='passengerRLSeat',
  211.             seat=true,
  212.             local_pos=chassis.driverSeatLocalPos*Vector(1,-7,-0.6),
  213.             local_ang=chassis.driverSeatLocalAng,
  214.             model=chassis.driverSeatModel,
  215.             color=Color(0,0,0,0)
  216.         }
  217.        
  218.         SPAWNER.add {
  219.             name='passengerRRSeat',
  220.             seat=true,
  221.             local_pos=chassis.driverSeatLocalPos*Vector(-1,-7,-0.6),
  222.             local_ang=chassis.driverSeatLocalAng,
  223.             model=chassis.driverSeatModel,
  224.             color=Color(0,0,0,0)
  225.         }
  226.        
  227.         SPAWNER.parentTable = chassis
  228.         SPAWNER.spawn()
  229.        
  230.     end
  231.    
  232.     --                          GET RIGHT           IS FORWARD-BACK!!!!
  233.     --                          GET FOWARD          IS LEFT-RIGHT!!!!!!
  234.    
  235.     chassis.calc = function()
  236.         chassis.phys_obj = chip():getPhysicsObject()
  237.        
  238.         local speedDecrement = chassis.self:getVelocity():getLength() * chassis.steeringDescendingCoeff
  239.        
  240.         local limitedAng = math.clamp( chassis.steeringAngleArc - speedDecrement*1.5, chassis.steeringAngleArcMin, chassis.steeringAngleArc )
  241.        
  242.         local AD = chassis.controls.A - chassis.controls.D
  243.         local WS = chassis.controls.W - chassis.controls.S
  244.        
  245.         -- this variable create lerp in accelerating and breaking
  246.         chassis.dynamicLerp = chassis.dynamicLerp + math.clamp( (WS) - chassis.dynamicLerp, -0.05, 0.05 ) / 3
  247.        
  248.         if chassis.lastW ~= chassis.controls.W then
  249.             chassis.lastW = chassis.controls.W
  250.             if chassis.controls.W == 1 then
  251.                 chassis.accelerationLean = chassis.accelerationLeanPower
  252.             end
  253.         end
  254.        
  255.         if chassis.lastS ~= chassis.controls.S then
  256.             chassis.lastS = chassis.controls.S
  257.             if chassis.controls.S == 1 then
  258.                 chassis.accelerationLean = -chassis.accelerationLeanPower
  259.             end
  260.         end
  261.        
  262.         chassis.accelerationLean = chassis.accelerationLean - chassis.accelerationSubtractSpeed
  263.         if chassis.accelerationLean < 0 then chassis.accelerationLean = chassis.accelerationLean + chassis.accelerationSubtractSpeed end
  264.         if chassis.accelerationLean > 0 then chassis.accelerationLean = chassis.accelerationLean - chassis.accelerationSubtractSpeed end
  265.        
  266.         -- calculate steer ang
  267.         chassis.steeringAngle = chassis.steeringAngle + math.clamp( ( ( AD ) * limitedAng ) - chassis.steeringAngle,
  268.         -chassis.steeringSpeed, chassis.steeringSpeed ) / ( chassis.steeringPow * ( AD == 0 and math.clamp( 0.5 + speedDecrement/3, 0.05, 1 ) or 0.5 ) ) -- this divider makes steering comes to center slower
  269.        
  270.         if SPAWNER.pasteDone then
  271.            
  272.             if chassis.driverSeat:getDriver() ~= nil then
  273.                 if chassis.driverSeat:getDriver():isValid() then
  274.                     chassis.driver = chassis.driverSeat:getDriver()
  275.                 else
  276.                     chassis.driver = nil
  277.                 end
  278.             else
  279.                 chassis.driver = nil    
  280.             end  
  281.  
  282.             if chassis.passengerSeat:getDriver() ~= nil then
  283.                 if chassis.passengerSeat:getDriver():isValid() then
  284.                     chassis.passenger = chassis.passengerSeat:getDriver()
  285.                 else
  286.                     chassis.passenger = nil
  287.                 end
  288.             else
  289.                 chassis.passenger = nil    
  290.             end
  291.         end
  292.        
  293.         if chassis.driver ~= nil then
  294.             chassis.controls.W = chassis.driver:keyDown(IN_KEY.FORWARD)         and 1 or 0
  295.             chassis.controls.S = chassis.driver:keyDown(IN_KEY.BACK)            and 1 or 0
  296.             chassis.controls.A = chassis.driver:keyDown(IN_KEY.MOVELEFT)        and 1 or 0
  297.             chassis.controls.D = chassis.driver:keyDown(IN_KEY.MOVERIGHT)       and 1 or 0
  298.             chassis.controls.SPACE = chassis.driver:keyDown(IN_KEY.JUMP)        and 1 or 0
  299.             chassis.controls.SHIFT = chassis.driver:keyDown(IN_KEY.SPEED)       and 1 or 0
  300.             chassis.controls.ALT = chassis.driver:keyDown(IN_KEY.WALK)          and 1 or 0
  301.         end
  302.        
  303.         local localVel = chassis.self:worldToLocal( chassis.self:getVelocity() + chassis.self:getPos() )
  304.        
  305.         local fl = math.floor
  306.        
  307.         --print("" .. tostring( fl(chassis.self:getLocalVelocity()[1]) ) .. ', ' .. tostring(fl(chassis.self:getLocalVelocity()[2])) .. ', ' .. fl(chassis.self:getLocalVelocity()[3]))
  308.        
  309.         for i = 1, 4 do -- this module will have only 4 wheels. hardcoded
  310.            
  311.             local is_wheels_rear = i < 3
  312.                        
  313.             local isWheelLeft = i%2==1
  314.             local isWheelFront = i > 2
  315.            
  316.             local wheel_pos = chassis.params.frontAxle * chassis.params.sideVec[i] -- abstract wheel pos according no sideVec
  317.             if is_wheels_rear then
  318.                 wheel_pos = chassis.params.rearAxle * chassis.params.sideVec[i]
  319.             end
  320.            
  321.             if chassis.wheels[i] == nil then
  322.                 chassis.wheels[i] = hologram.create(chassis.self:getPos(), chassis.self:localToWorldAngles(Angle()), chassis.wheelModel)
  323.                 chassis.wheelAnchors[i] = hologram.create(chassis.self:localToWorld(wheel_pos), chassis.self:localToWorldAngles(Angle()), "models/holograms/rcylinder_thick.mdl")
  324.                 chassis.wheelAnchors[i]:setParent(chassis.self)
  325.                 chassis.wheelAnchors[i]:setScale(Vector(0.1, 0.1, 0.1))
  326.                 chassis.wheels[i]:setParent(chassis.self)
  327.                 chassis.wheels[i]:setPos(chassis.self:localToWorld(wheel_pos ))
  328.                 chassis.wheels[i]:setScale(chassis.wheelScale)  
  329.                 chassis.wheels[i]:setColor(chassis.wheelColor)    
  330.                
  331.                 if chassis.wheelBodygroup ~= -1 then chassis.wheels[i]:setBodygroup(1, chassis.wheelBodygroup) end        
  332.                 chassis.wheelContact[i] = false
  333.                 chassis.wheelRotation[i] = 0
  334.                 chassis.wheelInertia[i] = 0
  335.                
  336.                 chassis.VC[i + 4] = chassis.wheelAnchors[i]:getPos()    
  337.                
  338.                 if i == 4 then
  339.                     if chassis.calcWheelHeight then
  340.                        
  341.                         local sz = chassis.wheels[i]:obbSize()
  342.                         local X, Y, Z = sz.x, sz.y, sz.z
  343.                         local height = math.max(X, Y)
  344.                         height = math.max(height, Z)
  345.                         -- test
  346.                         chassis.wheelHeight = height
  347.                        
  348.                     end
  349.                    
  350.                 end
  351.                
  352.             end
  353.            
  354.            
  355.             local additionToDistance = isWheelFront and -chassis.accelerationLean or chassis.accelerationLean
  356.            
  357.             -- TODO: add this >additionToDistance< to applyForce, not to rays distance!!!!!!
  358.            
  359.             -- setting up trace
  360.             local tracedata = {
  361.                 start = chassis.self:localToWorld( wheel_pos ),
  362.                 endpos = chassis.self:localToWorld( wheel_pos ) + chassis.self:getUp() * ( -chassis.params.height ),
  363.                 filter = { chassis.self, chip(), unpack(chassis.wheels)}
  364.             }
  365.            
  366.             local traceResult = trace.hull(tracedata.start, tracedata.endpos, Vector(), Vector(), tracedata.filter, nil, nil, false)
  367.            
  368.             local wheelHeight = 0
  369.            
  370.             local V2 = chassis.VC[i + 4] ~= nil and chassis.VC[i + 4] or Vector(0, 0, 0)
  371.             chassis.VC[i + 4] = chassis.wheelAnchors[i]:getPos()    
  372.            
  373.             local L = chassis.wheelAnchors[i]:worldToLocal(V2)
  374.            
  375.            
  376.             -- apply body leaning on gas / brake
  377.            
  378.             local rawDist__ = traceResult.HitPos:getDistance(tracedata.start)
  379.             local rawDist = rawDist__
  380.            
  381.             local dist = math.clamp( chassis.params.height - rawDist + L[3] * chassis.params.zstabilization, 1.1, chassis.params.height )
  382.             local vecBase = ( traceResult.HitNormal * dist ) * chassis.params.power * chassis.params.mass / 4
  383.            
  384.            
  385.             -- CT
  386.             local curTime = chassis.VC[i + 8] ~= nil and chassis.VC[i + 8] or 0
  387.             chassis.VC[i + 8] = timer.curtime()
  388.            
  389.             -- DT
  390.             local rawDistSaved = chassis.VC[i + 12] ~= nil and chassis.VC[i + 12] or 0
  391.             chassis.VC[i + 12] = rawDist
  392.            
  393.             -- JTRC
  394.             local hitPosSaved = chassis.VC[i + 16] ~= nil and chassis.VC[i + 16] or Vector(0, 0, 0)
  395.            
  396.             if traceResult.Entity:isValid() then
  397.                 chassis.VC[i + 16] = traceResult.Entity:worldToLocal(traceResult.HitPos)
  398.             else
  399.                 chassis.VC[i + 16] = traceResult.HitPos
  400.             end
  401.        
  402.             chassis.wheels[i]:setPos(chassis.self:localToWorld(wheel_pos - Vector(0, 0, rawDist + chassis.wheelHeight * -0.5) ))
  403.             chassis.wheels[i]:setAngles(chassis.self:localToWorldAngles(Angle(chassis.wheelRotation[i] * (isWheelLeft and 1 or -1), -90 + (isWheelLeft and 0 or 180) + (isWheelFront and chassis.steeringAngle or 0), 0) ))
  404.            
  405.             if isWheelFront then
  406.                 chassis.wheelAnchors[i]:setAngles(chassis.self:localToWorldAngles(Angle(0, chassis.steeringAngle, 0) ))
  407.             end
  408.            
  409.             -- TODO: make setAng for wheelAnchors!!!
  410.            
  411.             local climbAngle = math.round( math.rad( chassis.self:getAngles()[1] ), 2 ) * 0.1
  412.            
  413.             if traceResult.Hit then
  414.                
  415.                 local V = chassis.VC[ i ] ~= nil and chassis.VC[i] or Vector(0, 0, 0)
  416.                 local V2R = chassis.VC[ i + 4 ] ~= nil and chassis.VC[i + 4] or Vector(0, 0, 0)
  417.                 local R_D = chassis.VC[ i + 12 ] ~= nil and chassis.VC[i + 12] or 0
  418.                
  419.                 local Delta = vecBase - V
  420.                 local TimeDelta = timer.curtime() - curTime
  421.                 local DistDelta = ( rawDistSaved - R_D ) * 3
  422.                 local L = chassis.wheelAnchors[i]:worldToLocal( V2 )
  423.                
  424.                 local ForceVec = vecBase + Delta * chassis.params.spring
  425.                
  426.                 local ML            = ( chassis.wheelHeight * (math.pi * 1.5) * 0.75 ) * 0.0254
  427.                 local V_L           = ( localVel[2] * 0.75 ) * 0.0294--0.0254
  428.                 local Round         = V_L / ML
  429.                 local FakeRotation  = Round * 360 * TimeDelta
  430.                
  431.                 local UC            = V2 - V2R
  432.                  
  433.                 --local L             = ( (-chassis.self:getRight() * ( math.clamp(L[2],-5,5) / 3 )) + (chassis.self:getForward() * L[1] * 10 ) + chassis.self:getForward() * -climbAngle * chassis.params.mass / 220 ) * chassis.params.mass / 4
  434.                 local L             = ( (-chassis.self:getRight() * ( math.clamp(L[2],-5,5) / 3 )) + (chassis.self:getForward() * L[1] * 10 ) ) * chassis.params.mass / 4
  435.                
  436.                 if chassis.wheelContact[i] then
  437.                      
  438.                     if traceResult.Entity:isValid() then
  439.                         local Na = -chassis.wheels[i]:worldToLocal( traceResult.Entity:localToWorld( hitPosSaved ) )[2] * (chassis.wheelHeight / math.pi)
  440.                                        
  441.                         chassis.wheelRotation[i] = ( chassis.wheelRotation[i] - Na ) % 360
  442.                         chassis.wheelInertia[i]  = Na
  443.                     else
  444.                         chassis.wheelRotation[i] = ( chassis.wheelRotation[i] - FakeRotation ) % 360
  445.                         chassis.wheelInertia[i]  = FakeRotation
  446.                     end
  447.                    
  448.                 end
  449.                
  450.                 chassis.VC[i] = vecBase
  451.                
  452.                 if not chassis.wheelContact[i] then
  453.                     if DistDelta > 2.5 and DistDelta < 13 then
  454.                         chassis.self:emitSound('physics/rubber/rubber_tire_impact_soft' .. math.random( 1, 3 ) .. '.wav', 100, 120, 1, 0)
  455.                     elseif DistDelta > 13 and DistDelta < 17 then
  456.                         chassis.self:emitSound('physics/rubber/rubber_tire_impact_bullet' .. math.random( 1, 3 ) .. '.wav', 100, 120, 1, 0)
  457.                     elseif DistDelta > 17 and DistDelta then
  458.                         chassis.self:emitSound('physics/rubber/rubber_tire_impact_hard' .. math.random( 1, 3 ) .. '.wav', 100, 120, 1, 0)
  459.                     end
  460.                    
  461.                     local XD = chassis.self:getRight() * chassis.wheelInertia[i] * chassis.params.mass / 4
  462.                     chassis.self:getPhysicsObject():applyForceOffset( ForceVec + L + XD , V2R )
  463.                    
  464.                    
  465.                     chassis.wheelContact[i] = true
  466.                 end
  467.                
  468.                 -- i%2==1 and 0 or 180
  469.                
  470.                 local isRear = i > 2//( i % 2 ) == 1
  471.                
  472.                 --      force
  473.                 if isRear then
  474.                     chassis.self:getPhysicsObject():applyForceOffset( ForceVec + L, V2R + UC )
  475.                 else
  476.                     local Accel = chassis.self:getRight() * chassis.params.mass * chassis.dynamicMult * ( ( chassis.controls.W - chassis.controls.S ) * math.abs(chassis.dynamicLerp) )
  477.                     chassis.self:getPhysicsObject():applyForceOffset( ForceVec + L + Accel, V2R + UC )
  478.                 end
  479.    
  480.             else
  481.                 -- not .Hit
  482.                 if chassis.wheelContact[i] then
  483.                    chassis.wheelContact[i] = false
  484.                 end
  485.                
  486.                 chassis.wheelInertia[i] = math.normalizeAngle( chassis.wheelInertia[i] - chassis.wheelInertia[i] / 300 )
  487.                 chassis.wheelRotation[i] = math.normalizeAngle( chassis.wheelRotation[i] - chassis.wheelInertia[i] )
  488.                
  489.             end
  490.            
  491.             -- X - side
  492.             -- Y - prodolnyaya LENGTH
  493.             -- Z - height
  494.    
  495.         end
  496.        
  497.         chassis.onSkip = chassis.onSkip + 1
  498.        
  499.         local angle = ( chassis.steeringAngleArc + chassis.steeringAngle ) / 2
  500.        
  501.         chip():setColor(Color(angle, 0, 0, 0))
  502.        
  503.         if chassis.onSkip == chassis.tickSkip then
  504.             chassis.onSkip = 0
  505.            
  506.             local front_vel = chip():getLocalVelocity()[2]
  507.            
  508.            
  509.             -- PLACE TO SEND TETWORKS WITH PROVIDED INTERVAL
  510.             -- net.start ... there
  511.            
  512.             net.start('BMW_i7_network')
  513.                 net.writeTable( { case="steering", steeringAngle=chassis.steeringAngle } )
  514.             net.send()
  515.            
  516.         end
  517.     end
  518.    
  519.    
  520.     net.receive('BMW_i7_network', function( )
  521.         local t = net.readTable()
  522.        
  523.         if t.case == 'send_wheels' then
  524.             local userIndex = t.user
  525.             net.start('BMW_i7_network')
  526.                 net.writeTable( { case="parent_wheels", wheels={ chassis.wheels[1]:entIndex(), chassis.wheels[2]:entIndex(), chassis.wheels[3]:entIndex(), chassis.wheels[4]:entIndex() } } )
  527.             net.send(entity(userIndex))
  528.         end
  529.                    
  530.     end )
  531.    
  532.    
  533.     hook.add('Think', 'abt_urc', chassis.calc)
  534.     chassis.Initialize()
  535.  
  536. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement