To be able to limit the number of props on the map (to optimize server), I purpose you an LUA script than you can easily customize for your requirements.
DarkRP already has a way to buy props, but the following script will add a GUI that asks players to validate their choice with "Yes" or "No", which is visually more beautiful.
How to use
- You need to create a
paytospawn
directory insidegarrysmod/addons
. - Go to
garrysmod/addons/paytospawn
and createautorun
folder. - Inside
autorun
, create a fileshared.lua
which contains the following scripts, and reboot your GMod server.
lmmpropcost = 75 -- Price of object (A) if (SERVER) then util.AddNetworkString("LMMPlayerSpawnPropCL") util.AddNetworkString("LMMPlayerSpawnPropCLBack") hook.Add( "PlayerSpawnProp", "LMMPlayerSpawnProp", function( ply, mdl ) if ply:GetNWBool("LMMCanSpawnProp") then return true else net.Start("LMMPlayerSpawnPropCL") net.WriteString(mdl) net.Send(ply) end end ) net.Receive("LMMPlayerSpawnPropCLBack",function(len, ply) local mdl = net.ReadString() ply:addMoney(-lmmpropcost) ply:SetNWBool("LMMCanSpawnProp",true) ply:ConCommand("gm_spawn "..mdl) timer.Simple(1,function() ply:SetNWBool("LMMCanSpawnProp",false) end) end) end if (CLIENT) then surface.CreateFont( "DRPTitleFont", { font = "Arial", size = 25, weight = 5000, blursize = 0, scanlines = 0, antialias = true, }) surface.CreateFont( "DRPLabelFont", { font = "Arial", size = 20, weight = 5000, blursize = 0, scanlines = 0, antialias = true, }) surface.CreateFont( "DRPBtnLabelFont", { font = "Arial", size = 15, weight = 5000, blursize = 0, scanlines = 0, antialias = true, }) net.Receive("LMMPlayerSpawnPropCL",function() local mdl = net.ReadString() local DFrame = vgui.Create( "DFrame" ) DFrame:SetSize( 450, 100 ) DFrame:Center() DFrame:SetTitle( "" ) DFrame:SetDraggable( false ) DFrame:ShowCloseButton(false) DFrame:MakePopup() function DFrame:Paint(w, h) draw.RoundedBox(2, 0, 0, self:GetWide(), self:GetTall(), Color(35, 35, 35, 250)) draw.RoundedBox(2, 0, 0, self:GetWide(), 30, Color(0, 102, 255, 250)) draw.SimpleText( "Buy props!", "DRPTitleFont", self:GetWide() / 2, 15, Color(255,255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) end local Label1 = vgui.Create("DLabel", DFrame) Label1:SetPos(30,40) Label1:SetSize(400,20) Label1:SetText("Are you sure to buy "..DarkRP.formatMoney(lmmpropcost).."?") Label1:SetTextColor(Color(255,255,255,255)) Label1:SetFont("DRPLabelFont") local YesBTN = vgui.Create("DButton", DFrame) YesBTN:SetPos(30, 70) YesBTN:SetSize(150, 20) YesBTN:SetText("Yes") YesBTN:SetFont("DRPBtnLabelFont") YesBTN.OnCursorEntered = function(self) self.hover = true end YesBTN.OnCursorExited = function(self) self.hover = false end YesBTN.Paint = function( self, w, h ) if self.IsClose then draw.RoundedBox(0, 0, 0, w, h, (self.hover and Color(88,0,0,250) or Color(255,255,255,255))) -- Paints on hover else draw.RoundedBox(0, 0, 0, w, h, (self.hover and Color(0,160,255,250) or Color(255,255,255,255))) -- Paints on hover end self:SetTextColor(self.hover and Color(255,255,255,255) or Color(0,0,0,250)) end YesBTN.DoClick = function() net.Start("LMMPlayerSpawnPropCLBack") net.WriteString(mdl) net.SendToServer() DFrame:Close() end local NoBTN = vgui.Create("DButton", DFrame) NoBTN:SetPos(220, 70) NoBTN:SetSize(150, 20) NoBTN:SetText("No") NoBTN.IsClose = true NoBTN:SetFont("DRPBtnLabelFont") NoBTN.OnCursorEntered = function(self) self.hover = true end NoBTN.OnCursorExited = function(self) self.hover = false end NoBTN.Paint = function( self, w, h ) if self.IsClose then draw.RoundedBox(0, 0, 0, w, h, (self.hover and Color(88,0,0,250) or Color(255,255,255,255))) -- Paints on hover else draw.RoundedBox(0, 0, 0, w, h, (self.hover and Color(0,160,255,250) or Color(255,255,255,255))) -- Paints on hover end self:SetTextColor(self.hover and Color(255,255,255,255) or Color(0,0,0,250)) end NoBTN.DoClick = function() DFrame:Close() end end) end