Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Dev = {}
- Dev.CarDealer = CarDealer
- Dev.CarDealer.SpawnPositions = {
- ["rp_твоякарта"] = {
- { position = Vector( -4391.613770, -1292.884399, -1387.968750 ), angles = Angle( 0,0,0 ) },
- { position = Vector( -4556.653320, -1281.848145, -1387.968750 ), angles = Angle( 0,0,0 ) },
- { position = Vector( -3736.901367, -1280.808105, -1387.968750 ), angles = Angle( 0,0,0 ) },
- { position = Vector( -3736.901367, -1280.808105, -1387.968750 ), angles = Angle( 0,0,0 ) },
- }
- }
- function Dev.CarDealer.GetNearestCarDealer( ply )
- local e,d,ent = ents.FindByClass( 'cardealer' ), 10000, nil
- for k,v in pairs( e ) do
- if ( v:GetPos():Distance( ply:GetPos() ) < d ) then
- d,ent = v:GetPos():Distance( ply:GetPos() ), v
- end
- end
- return ent
- end
- function Dev.CarDealer.CanBuyVehicle( ply )
- local cd = Dev.CarDealer.GetNearestCarDealer( ply )
- if not cd or cd:GetPos():Distance( ply:GetPos() ) > 300 then
- DarkRP.notify( ply, 1, 3, "Вы находитесь слишком далеко от магазина!" )
- return false
- end
- if IsValid( ply.Car ) then
- DarkRP.notify( ply, 1, 3, "У вас уже есть заспавненная машина!" )
- return false
- end
- return true
- end
- function Dev.CarDealer.GetSpawningCarPos()
- local positions = Dev.CarDealer.SpawnPositions[ game.GetMap() ]
- if not positions then return false end
- for number, position in pairs( positions ) do
- local tr = util.TraceLine( { start = position.position, endpos = position.position + Vector( 0, 0, 200 ), filter = 'worldspawn' } )
- if not tr.Entity or not tr.Entity:IsVehicle() then return position end
- end
- return false
- end
- function Dev.CarDealer.GetVehicleTable( classname )
- return {}
- end
- function Dev.CarDealer.CreateVehicle( classname )
- local vehicle = list.Get( "Vehicles" )[ classname ]
- local spawnpos = Dev.CarDealer.GetSpawningCarPos()
- if not vehicle then
- return 'Такой машины не существует!'
- end
- if not spawnpos then
- return 'Нет свободных мест для спауна машин'
- end
- local Car = ents.Create( vehicle.Class )
- Car:SetModel( vehicle.Model )
- Car:SetPos( spawnpos.position )
- Car:SetAngles( spawnpos.angles )
- if ( vehicle.KeyValues ) then
- for k, v in pairs( vehicle.KeyValues ) do
- Car:SetKeyValue( k, v )
- end
- end
- Car:Spawn()
- Car:Activate()
- if ( Car.SetVehicleClass ) then Car:SetVehicleClass( vehicle.Class ) end
- Car.VehicleName = vehicle.Class
- Car.VehicleTable = vehicle
- Car.ClassOverride = vehicle.Class
- return Car
- end
- function Dev.CarDealer.PlayerSpawnVehicle( ply, classname )
- if not Dev.CarDealer.CanBuyVehicle( ply ) then
- return
- end
- local Ent = Dev.CarDealer.CreateVehicle( CarDealer.VehicleList[ classname ].ClassName )
- if type( Ent ) == 'string' then
- DarkRP.notify( ply, 1, 3, Ent )
- return
- end
- ply:SetNWEntity( "car", Ent )
- ply:SetNWString( "carname", list.Get( 'Vehicles' )[CarDealer.VehicleList[ classname ].ClassName].Name ) --[3]
- ply:SetNWString( "carcname", CarDealer.VehicleList[ classname ].ClassName )
- Ent:keysOwn(ply,true)
- Ent:keysLock()
- Ent:CPPISetOwner( nil )
- Ent:SetOwner( nil )
- ply.Car = Ent
- return Ent
- end
- function Dev.CarDealer.PlayerBuyVehicle( ply, classname )
- if not Dev.CarDealer.CanBuyVehicle( ply ) then
- return
- end
- local vtable = CarDealer.VehicleList[ classname ]
- if not vtable then
- DarkRP.notify( ply, 1, 3, "Такая машина не существует" )
- return
- end
- if vtable.Price > ply:getDarkRPVar("money") then
- DarkRP.notify( ply, 1, 3, "Вам не хватает средств на эту машину!" )
- return
- end
- if table.HasValue( ply:GetOwnedCars(), classname ) then
- DarkRP.notify( ply, 1, 3, 'У вас уже есть эта машина' )
- return
- end
- ply:addMoney( -vtable.Price )
- ply:AddOwnedCar( classname )
- Dev.CarDealer.PlayerSpawnVehicle( ply, classname )
- DarkRP.notify( ply, 2, 4, 'Вы купили эту машину!' )
- end
- util.AddNetworkString( 'owned_cars' )
- local plyMeta = FindMetaTable( "Player" )
- plyMeta.GetOwnedCars = function( ply )
- return util.JSONToTable( ply:GetPData( "owned_cars", "[]" ) )
- end
- plyMeta.UpdateOwnedCars = function( ply )
- net.Start( 'owned_cars' )
- net.WriteTable( ply:GetOwnedCars() )
- net.Send( ply )
- end
- plyMeta.SetOwnedCars = function( ply, tbl )
- ply:SetPData( "owned_cars", util.TableToJSON( tbl ) )
- ply:UpdateOwnedCars()
- end
- plyMeta.RemoveOwnedCars = function( ply, carname )
- local cars = ply:GetOwnedCars()
- table.RemoveByValue( cars, carname )
- ply:SetOwnedCars( cars )
- end
- plyMeta.AddOwnedCar = function ( ply, vname )
- local cars = ply:GetOwnedCars()
- if not table.HasValue( cars, vname ) then table.insert( cars, vname ) end
- ply:SetOwnedCars( cars )
- end
- hook.Add( 'PlayerInitialSpawn', 'Setup Bought Cars', function( ply )
- timer.Simple( .1, function()
- ply:UpdateOwnedCars()
- end)
- end )
- hook.Add( 'PlayerDisconnected', 'Remove car on leave', function( ply )
- if IsValid( ply.Car ) then
- ply.Car:Remove()
- end
- end )
- /*
- hook.Add( 'OnPlayerChangedTeam', 'Remove govern car', function( ply )
- if IsValid( ply.Car ) and ply.Car.IsFree then
- ply.Car:Remove()
- end
- end )
- */
- local function CarDealer(ply, args)
- if args == "" or not tonumber(args) then return "" end
- local a = tonumber(args)
- if table.HasValue( ply:GetOwnedCars(), a ) then
- Dev.CarDealer.PlayerSpawnVehicle( ply, a )
- else
- Dev.CarDealer.PlayerBuyVehicle( ply, a )
- end
- return ""
- end
- DarkRP.defineChatCommand("cardealer", CarDealer)
- concommand.Add( 'dm_remove', function( ply )
- if IsValid( ply.Car ) then
- ply.Car:Remove()
- end
- end)
- CarDealer = Dev.CarDealer
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement