Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.27 KB | None | 0 0
  1.  
  2. local Dev = {}
  3.  
  4. Dev.CarDealer = CarDealer
  5.  
  6. Dev.CarDealer.SpawnPositions = {
  7.  
  8. ["rp_твоякарта"] = {
  9. { position = Vector( -4391.613770, -1292.884399, -1387.968750 ), angles = Angle( 0,0,0 ) },
  10. { position = Vector( -4556.653320, -1281.848145, -1387.968750 ), angles = Angle( 0,0,0 ) },
  11. { position = Vector( -3736.901367, -1280.808105, -1387.968750 ), angles = Angle( 0,0,0 ) },
  12. { position = Vector( -3736.901367, -1280.808105, -1387.968750 ), angles = Angle( 0,0,0 ) },
  13. }
  14.  
  15. }
  16.  
  17. function Dev.CarDealer.GetNearestCarDealer( ply )
  18.  
  19. local e,d,ent = ents.FindByClass( 'cardealer' ), 10000, nil
  20.  
  21. for k,v in pairs( e ) do
  22.  
  23. if ( v:GetPos():Distance( ply:GetPos() ) < d ) then
  24.  
  25. d,ent = v:GetPos():Distance( ply:GetPos() ), v
  26.  
  27. end
  28.  
  29. end
  30.  
  31. return ent
  32.  
  33. end
  34.  
  35. function Dev.CarDealer.CanBuyVehicle( ply )
  36.  
  37. local cd = Dev.CarDealer.GetNearestCarDealer( ply )
  38.  
  39. if not cd or cd:GetPos():Distance( ply:GetPos() ) > 300 then
  40. DarkRP.notify( ply, 1, 3, "Вы находитесь слишком далеко от магазина!" )
  41. return false
  42. end
  43.  
  44. if IsValid( ply.Car ) then
  45. DarkRP.notify( ply, 1, 3, "У вас уже есть заспавненная машина!" )
  46. return false
  47. end
  48.  
  49. return true
  50.  
  51. end
  52.  
  53. function Dev.CarDealer.GetSpawningCarPos()
  54.  
  55. local positions = Dev.CarDealer.SpawnPositions[ game.GetMap() ]
  56.  
  57. if not positions then return false end
  58.  
  59. for number, position in pairs( positions ) do
  60.  
  61. local tr = util.TraceLine( { start = position.position, endpos = position.position + Vector( 0, 0, 200 ), filter = 'worldspawn' } )
  62.  
  63. if not tr.Entity or not tr.Entity:IsVehicle() then return position end
  64.  
  65. end
  66.  
  67. return false
  68.  
  69. end
  70.  
  71. function Dev.CarDealer.GetVehicleTable( classname )
  72.  
  73. return {}
  74.  
  75. end
  76.  
  77. function Dev.CarDealer.CreateVehicle( classname )
  78.  
  79. local vehicle = list.Get( "Vehicles" )[ classname ]
  80. local spawnpos = Dev.CarDealer.GetSpawningCarPos()
  81.  
  82. if not vehicle then
  83.  
  84. return 'Такой машины не существует!'
  85.  
  86. end
  87.  
  88. if not spawnpos then
  89.  
  90. return 'Нет свободных мест для спауна машин'
  91.  
  92. end
  93.  
  94. local Car = ents.Create( vehicle.Class )
  95.  
  96. Car:SetModel( vehicle.Model )
  97.  
  98. Car:SetPos( spawnpos.position )
  99. Car:SetAngles( spawnpos.angles )
  100.  
  101. if ( vehicle.KeyValues ) then
  102. for k, v in pairs( vehicle.KeyValues ) do
  103. Car:SetKeyValue( k, v )
  104. end
  105. end
  106.  
  107.  
  108. Car:Spawn()
  109. Car:Activate()
  110.  
  111. if ( Car.SetVehicleClass ) then Car:SetVehicleClass( vehicle.Class ) end
  112. Car.VehicleName = vehicle.Class
  113. Car.VehicleTable = vehicle
  114.  
  115. Car.ClassOverride = vehicle.Class
  116.  
  117. return Car
  118.  
  119. end
  120.  
  121. function Dev.CarDealer.PlayerSpawnVehicle( ply, classname )
  122.  
  123. if not Dev.CarDealer.CanBuyVehicle( ply ) then
  124. return
  125. end
  126.  
  127. local Ent = Dev.CarDealer.CreateVehicle( CarDealer.VehicleList[ classname ].ClassName )
  128.  
  129. if type( Ent ) == 'string' then
  130.  
  131. DarkRP.notify( ply, 1, 3, Ent )
  132.  
  133. return
  134.  
  135. end
  136.  
  137. ply:SetNWEntity( "car", Ent )
  138. ply:SetNWString( "carname", list.Get( 'Vehicles' )[CarDealer.VehicleList[ classname ].ClassName].Name ) --[3]
  139. ply:SetNWString( "carcname", CarDealer.VehicleList[ classname ].ClassName )
  140.  
  141. Ent:keysOwn(ply,true)
  142. Ent:keysLock()
  143.  
  144. Ent:CPPISetOwner( nil )
  145. Ent:SetOwner( nil )
  146.  
  147. ply.Car = Ent
  148.  
  149. return Ent
  150.  
  151. end
  152.  
  153. function Dev.CarDealer.PlayerBuyVehicle( ply, classname )
  154.  
  155. if not Dev.CarDealer.CanBuyVehicle( ply ) then
  156. return
  157. end
  158.  
  159. local vtable = CarDealer.VehicleList[ classname ]
  160.  
  161. if not vtable then
  162.  
  163. DarkRP.notify( ply, 1, 3, "Такая машина не существует" )
  164.  
  165. return
  166.  
  167. end
  168.  
  169. if vtable.Price > ply:getDarkRPVar("money") then
  170.  
  171. DarkRP.notify( ply, 1, 3, "Вам не хватает средств на эту машину!" )
  172.  
  173. return
  174.  
  175. end
  176.  
  177.  
  178.  
  179. if table.HasValue( ply:GetOwnedCars(), classname ) then
  180.  
  181. DarkRP.notify( ply, 1, 3, 'У вас уже есть эта машина' )
  182.  
  183. return
  184.  
  185. end
  186.  
  187.  
  188. ply:addMoney( -vtable.Price )
  189.  
  190. ply:AddOwnedCar( classname )
  191.  
  192. Dev.CarDealer.PlayerSpawnVehicle( ply, classname )
  193.  
  194. DarkRP.notify( ply, 2, 4, 'Вы купили эту машину!' )
  195.  
  196.  
  197. end
  198.  
  199. util.AddNetworkString( 'owned_cars' )
  200.  
  201. local plyMeta = FindMetaTable( "Player" )
  202.  
  203. plyMeta.GetOwnedCars = function( ply )
  204.  
  205. return util.JSONToTable( ply:GetPData( "owned_cars", "[]" ) )
  206.  
  207. end
  208.  
  209. plyMeta.UpdateOwnedCars = function( ply )
  210.  
  211. net.Start( 'owned_cars' )
  212. net.WriteTable( ply:GetOwnedCars() )
  213. net.Send( ply )
  214.  
  215. end
  216.  
  217. plyMeta.SetOwnedCars = function( ply, tbl )
  218.  
  219. ply:SetPData( "owned_cars", util.TableToJSON( tbl ) )
  220.  
  221. ply:UpdateOwnedCars()
  222.  
  223. end
  224.  
  225. plyMeta.RemoveOwnedCars = function( ply, carname )
  226.  
  227. local cars = ply:GetOwnedCars()
  228.  
  229. table.RemoveByValue( cars, carname )
  230.  
  231. ply:SetOwnedCars( cars )
  232.  
  233. end
  234.  
  235. plyMeta.AddOwnedCar = function ( ply, vname )
  236.  
  237. local cars = ply:GetOwnedCars()
  238.  
  239. if not table.HasValue( cars, vname ) then table.insert( cars, vname ) end
  240.  
  241. ply:SetOwnedCars( cars )
  242.  
  243. end
  244.  
  245. hook.Add( 'PlayerInitialSpawn', 'Setup Bought Cars', function( ply )
  246. timer.Simple( .1, function()
  247. ply:UpdateOwnedCars()
  248. end)
  249. end )
  250.  
  251. hook.Add( 'PlayerDisconnected', 'Remove car on leave', function( ply )
  252.  
  253. if IsValid( ply.Car ) then
  254.  
  255. ply.Car:Remove()
  256.  
  257. end
  258.  
  259. end )
  260.  
  261. /*
  262. hook.Add( 'OnPlayerChangedTeam', 'Remove govern car', function( ply )
  263.  
  264. if IsValid( ply.Car ) and ply.Car.IsFree then
  265.  
  266. ply.Car:Remove()
  267.  
  268. end
  269.  
  270. end )
  271. */
  272.  
  273. local function CarDealer(ply, args)
  274. if args == "" or not tonumber(args) then return "" end
  275.  
  276. local a = tonumber(args)
  277.  
  278. if table.HasValue( ply:GetOwnedCars(), a ) then
  279. Dev.CarDealer.PlayerSpawnVehicle( ply, a )
  280. else
  281. Dev.CarDealer.PlayerBuyVehicle( ply, a )
  282. end
  283.  
  284. return ""
  285. end
  286. DarkRP.defineChatCommand("cardealer", CarDealer)
  287.  
  288. concommand.Add( 'dm_remove', function( ply )
  289. if IsValid( ply.Car ) then
  290. ply.Car:Remove()
  291. end
  292. end)
  293.  
  294. CarDealer = Dev.CarDealer
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement