Garry's Mod Lua Scripting Guide
Introduction to Lua scripting for creating custom server functionality and game modes.
Understanding Lua in GMod
Garry's Mod uses Lua as its scripting language. Scripts run in different realms:
- Server: Runs on server, handles game logic
- Client: Runs on player's computer, handles UI/rendering
- Shared: Runs on both server and client
Script Locations
garrysmod/lua/autorun/server/ # Server-side scripts
garrysmod/lua/autorun/client/ # Client-side scripts
garrysmod/lua/autorun/ # Shared scripts
garrysmod/lua/gamemodes/ # Game mode scripts
garrysmod/lua/weapons/ # Custom weapons
garrysmod/lua/entities/ # Custom entities
Basic Script Structure
-- Comments start with --
print("Hello, GMod!")
local playerName = "Player"
local playerHealth = 100
function GreetPlayer()
print("Welcome, " .. playerName)
end
GreetPlayer()
Common Hooks
Hooks allow you to run code at specific events:
-- Server-side hook
hook.Add("PlayerSpawn", "MySpawnHook", function(ply)
print(ply:Nick() .. " has spawned!")
ply:SetHealth(150)
end)
-- Shared hook
hook.Add("Think", "MyThinkHook", function()
-- Runs every frame
end)
Essential Functions
-- Print to console
print("Message")
-- Send message to player
ply:ChatPrint("Hello!")
-- Send message to all players
for k, v in ipairs(player.GetAll()) do
v:ChatPrint("Server Message")
end
-- Create entity
local ent = ents.Create("prop_physics")
ent:SetPos(Vector(0, 0, 0))
ent:Spawn()
Creating a Simple Command
hook.Add("PlayerSay", "MyCommandHook", function(ply, text)
if text == "!health" then
ply:SetHealth(100)
ply:ChatPrint("Health restored!")
return "" -- Prevent message from showing
end
end)
Working with Players
-- Get all players
local players = player.GetAll()
-- Iterate through players
for k, ply in ipairs(players) do
print(ply:Nick(), ply:SteamID(), ply:GetHealth())
end
-- Find player by name
local target = player.GetByName("PlayerName")
-- Check if player is admin
if ply:IsAdmin() then
-- Admin-only code
end
Best Practices
- Use local variables for performance
- Add comments to complex code
- Test scripts on a local server first
- Use print() for debugging
- Avoid expensive operations in Think hooks
- Clean up entities when no longer needed
Resource: Check the GMod Wiki for complete API documentation.
Learning More
- Official GMod Wiki
- Facepunch Forums
- Explore existing addons for examples