Need some help with entities

So I have just started Lua coding recently, and I am a developer for a SWRP server, I am trying to code a custom shop NPC to purchase ships from. I know I can use the F4 menu for that but it isn’t as cool. I have my base entity, but I am not sure how to make it appear like an NPC, open a purchasing menu when E is pressed on it, how to impliment payment, and the spawning of the ship its self, any help would be greatly appreciated.

Regarding the use of the Entity, you can use this function https://wiki.garrysmod.com/page/Entity/Use.
Then make a VGUI element appear on use, or whatever else you are using for the shop :slight_smile:

As for the payment, assuming you’re using DarkRP as a base, it provides the following meta functions:



ply:getDarkRPVar("money") //will return how much money ply has
ply:addMoney(50) //will add $50 to the player's balance
ply:addMoney(-100) //will take $100 from the player's balance, same as the one above but note use of a negative value to take vs. add
ply:canAfford(600) //will return true if the player can afford $600, false if not


Use these to interact with the player’s balance.

As :Use is only available serverside, you will have to tell the player to open a menu from the server, using net messages.

Quick example:



//Serverside:
util.AddNetworkString("OpenMenu") //doesnt matter what you put in here, just has to be a string and unique

function ENT:Use(a, caller) //our use function, caller is the player who used the entity
    if(IsValid(caller) && caller:IsPlayer()) then //making sure a player actually used this
        net.Start("OpenMenu") //starting our net message which we cached above
        net.Send(caller) //send it to the player who used the entity
    end
end


//Clientside:
net.Receive("OpenMenu", function() //hook up a function to be called when we receive the OpenMenu net message (which we precached and later sent @ use function on the serverside)
    local frame = vgui.Create("DFrame") //create our frame
    frame:SetSize(ScrW()/2, ScrH()/2) //set the size to half the width and half the height
    frame:Center() //center it
    frame:MakePopup() //make the cursor pop up and disable mouse and keyboard input to the game
end)


To make purchasing work, you’d have to send a net message from the client to the server (e.g. on a vgui button click event) with what you want to buy. The server should then make sure the player can afford it (use the meta functions I showed above), then it should take the money and give the player the item.

There should be DScrollPanel to list items in shop menu.



net.Receive("OpenMenu", function() //hook up a function to be called when we receive the OpenMenu net message (which we precached and later sent @ use function on the serverside)
    local frame = vgui.Create("DFrame") //create our frame
    frame:SetSize(ScrW()/2, ScrH()/2) //set the size to half the width and half the height
    frame:Center() //center it
    frame:MakePopup() //make the cursor pop up and disable mouse and keyboard input to the game

local rgb = Color

		local DScrollPanel = vgui.Create( "DScrollPanel", frame ) -- creating dscrollpanel child of frame
		DScrollPanel:SetSize( 565, 300 ) -- sizing
		DScrollPanel:SetPos( 5, 500 ) -- pos
		DScrollPanel:Dock( FILL ) -- dscrollpanel will fill the frame.
		DScrollPanel:Center() -- centering it.

		local sbar = DScrollPanel:GetVBar() -- styling dscrollpanel's scrollbar. I recommend this.
		function sbar:Paint( w, h )
			draw.RoundedBox( 0, 0, 0, w, h, rgb(52, 73, 94,100) )
		end
		function sbar.btnUp:Paint( w, h )
			draw.RoundedBox( 0, 0, 0, w, h, rgb(192, 57, 43) )
		end
		function sbar.btnDown:Paint( w, h )
			draw.RoundedBox( 0, 0, 0, w, h, rgb(192, 57, 43) )
		end
		function sbar.btnGrip:Paint( w, h )
			draw.RoundedBox( 0, 0, 0, w, h, rgb(44, 62, 80) )
		end

end)


Next thing there should be is a table.
Table for your items, their prices.




local itemtable = {} --main table

itemtable["entity_example"] = { -- registering a entity to table

    name = "Health Pack",
    entity = "health_pack",
    price = 500,

}



You have to send the table to client when opening the menu.


net.WriteTable(itemtable)

Now, you are ready to list the table. Go back to dscrollpanel end.




for k,v in pairs(itemtable) do
-- in this part you should make button to buy, model to show the entity maybe. It's up to you.
end



Thanks for all the help guys! I hope all of this works well, either way thanks for taking your time to help me!