Lua Paydays

timer.Create( “PayDay”, 120, 0,
function( ply )
if ply:Team( ) == 1 then
GAMEMODE:AddNotify( “You have received $25.00 for your welfare check.”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt( “Money”, ply:GetNWInt( “Money” ) + 25 )
elseif ply:Team( ) == 2 then
GAMEMODE:AddNotify( “You have received $30.00 for serving the city as a police officer.”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt( “Money”, ply:GetNWInt( “Money” ) + 30 )
elseif ply:Team( ) == 3 then
GAMEMODE:AddNotify( “You have received $50.00 for serving the city as the mayor.”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt( “Money”, ply:GetNWInt( “Money” ) + 50 )
elseif ply:Team( ) == 4 then
GAMEMODE:AddNotify( “You have received $20.00 for stealing a T.V”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt( “Money”, ply:GetNWInt( “Money” ) + 20 )
elseif ply:Team( ) == 5 then
GAMEMODE:AddNotify( “You have received $25.00 for being the gundealer.”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt( “Money”, ply:GetNWInt( “Money” ) + 25 )
elseif ply:Team( ) == 6 then
GAMEMODE:AddNotify( “You have received $0.00 for Joining Noob”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
end
end )
(don’t bitch and moan at me for not using local player, I did have LocalPlayer first, however it came with same issue)
Error: Timer Error: MRP\gamemode\shared.lua:39:attempt to index local ‘ply’ (a nil value)

Remove
[lua]
function( ply )
[/lua]

Replace with

[lua]
function( )
[/lua]

try

[lua]
timer.Create( “PayDay”, 120, 0,
function( )
local ply = LocalPlayer()
if ply:Team( ) == 1 then
GAMEMODE:AddNotify( “You have received $25.00 for your welfare check.”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:AddCash( 25 )
elseif ply:Team( ) == 2 then
GAMEMODE:AddNotify( “You have received $30.00 for serving the city as a police officer.”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:AddCash( 30 )
elseif ply:Team( ) == 3 then
GAMEMODE:AddNotify( “You have received $50.00 for serving the city as the mayor.”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:AddCash( 50 )
elseif ply:Team( ) == 4 then
GAMEMODE:AddNotify( “You have received $20.00 for stealing a T.V”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:AddCash( 20 )
elseif ply:Team( ) == 5 then
GAMEMODE:AddNotify( “You have received $25.00 for being the gundealer.”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:AddCash( 25 )
elseif ply:Team( ) == 6 then
GAMEMODE:AddNotify( “You have received $0.00 for Joining Noob”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
end
end )
[/lua]

You could just use player.GetAll() and do it that way.

[lua]
timer.Create( “PayDay”, 120, 0,
function( )
for _, ply in pairs(player.GetAll()) do
if ply:Team( ) == 1 then
GAMEMODE:AddNotify( “You have received $25.00 for your welfare check.”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt(“Money”, ply:GetNWInt(“Money”) + 25 )
elseif ply:Team( ) == 2 then
GAMEMODE:AddNotify( “You have received $30.00 for serving the city as a police officer.”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt(“Money”, ply:GetNWInt(“Money”) + 30 )
elseif ply:Team( ) == 3 then
GAMEMODE:AddNotify( “You have received $50.00 for serving the city as the mayor.”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt(“Money”, ply:GetNWInt(“Money”) + 50 )
elseif ply:Team( ) == 4 then
GAMEMODE:AddNotify( “You have received $20.00 for stealing a T.V”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt(“Money”, ply:GetNWInt(“Money”) + 20 )
elseif ply:Team( ) == 5 then
GAMEMODE:AddNotify( “You have received $25.00 for being the gundealer.”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt(“Money”, ply:GetNWInt(“Money”) + 25 )
elseif ply:Team( ) == 6 then
GAMEMODE:AddNotify( “You have received $0.00 for Joining Noob”, NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
end
end
end )
[/lua]

For get that. Use

[lua]GM:Think()[/lua]

Testing it out now, I made a modification because it wasn’t working first.

I know who you are I have helped you before. We worked on MRP for a while. Message me on steam. I give you a GM:Think Function which is a lot better. KRALC

local ply = LocalPlayer() = nil still,

[editline]02:37AM[/editline]

Jonney’s method worked, thanks.

you forgot


 if CLIENT then     end 

Since it’s in shared you have to tell it to use just client or just server. The error you get in console is probably blue and not orange.

I had to message you.

That is a horrible idea, the Think hook is called every instant, whereas the Timer can be made to run at a specified interval. To do this interval in the Think hook you’d have to do a time comparison at the start and abort if it’s too early. Why not use the built in system for delayed events rather than inefficiently hacking it into another.

I wouldn’t suggest storing a whole function into a timer either. You should make a local function and call it from the timer.

That doesn’t really make it more efficient, just tidier.

Actually, that is exactly how the built-in system works, as seen here.

I had always assumed as much, if you’re going to use it like that in any case why not use the built-in method is what I was trying to say, which I believe I did.

If you aren’t calling it anywhere else then it’d be costing you a pointer’s worth more memory, though this drawback is negligible compared to the gain of readability.
Though if we’re going for improving style then I’d suggest something like this.
[lua]local teamPaydays = {
[1] = function(ply)
GAMEMODE:AddNotify( “You have received $25.00 for your welfare check.”,
NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt( “Money”, ply:GetNWInt( “Money” ) + 25 )
end;
[2] = function(ply)
GAMEMODE:AddNotify( “You have received $30.00 for serving the city as a police officer.”,
NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt( “Money”, ply:GetNWInt( “Money” ) + 30 )
end;
[3] = function(ply)
GAMEMODE:AddNotify( “You have received $50.00 for serving the city as the mayor.”,
NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt( “Money”, ply:GetNWInt( “Money” ) + 50 )
end;
[4] = function(ply)
GAMEMODE:AddNotify( “You have received $20.00 for stealing a T.V”,
NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt( “Money”, ply:GetNWInt( “Money” ) + 20 )
end;
[5] = function(ply)
GAMEMODE:AddNotify( “You have received $25.00 for being the gundealer.”,
NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
ply:SetNWInt( “Money”, ply:GetNWInt( “Money” ) + 25 )
end;
[6] = function(ply)
GAMEMODE:AddNotify( “You have received $0.00 for Joining Noob”,
NOTIFY_GENERIC, 5 )
surface.PlaySound( “ambient/water/drip2.wav” )
end;
}

timer.Create( “PayDay”, 120, 0, function()
for _, ply in ipairs(player.GetAll()) do
teamPaydaysply:GetTeam()
end
end)[/lua]
Although I have doubts about the AddNotify bit, whether it’d actually send the message.

So I was on XFire with Jonney because the Paydays went and paid for about 5 seconds then it disappeared, now it’s not even appearing on the HUD.


GM.Name = "MultiRP Beta"
GM.Author = "Genieman"
GM.Email = "n/a"
GM.Website = "MultiRP.FreeHostia.com"
DeriveGamemode( "sandbox" )
team.SetUp( 1, "Citizen", Color( 0, 255, 0, 255 ) )
team.SetUp( 2, "Police", Color( 0, 0, 255, 255 ) )
team.SetUp( 3, "Mayor", Color( 255, 0, 0, 255 ) )
team.SetUp( 4, "Gangster", Color( 225, 255, 100, 255 ) )
team.SetUp( 5, "GunDealer", Color( 0, 255, 150, 255 ) )
team.SetUp( 6, "Joining", Color( 0, 0, 0, 0 ) )
team.SetUp( 7, "Car Builder", Color( 255, 255, 0, 255 ) )

-- gravgun
function gravgunPunt( userid, target )
	if userid:IsAdmin() then
		return true
	else
		if SERVER then DropEntityIfHeld( target ) end
		return false
	end
end

hook.Add( "GravGunPunt", "gravgunPunt", gravgunPunt )

--$$
timer.Create( "PayDay", 1, 0,    
function( )   
	for _, v in pairs(player.GetAll()) do   
		if v:Team( ) == 1 then   
			GAMEMODE:AddNotify( "You have received $25.00 for your welfare check.", NOTIFY_GENERIC, 5 )   
			surface.PlaySound( "ambient/water/drip2.wav" )   
			v:SetNWInt(v:GetNWInt("money") + 25)
		elseif v:Team( ) == 2 then   
			GAMEMODE:AddNotify( "You have received $30.00 for serving the city as a police officer.", NOTIFY_GENERIC, 5 )   
			surface.PlaySound( "ambient/water/drip2.wav" )   
			v:SetNWInt(v:GetNWInt("money") + 30 )   
		elseif v:Team( ) == 3 then   
			GAMEMODE:AddNotify( "You have received $50.00 for serving the city as the mayor.", NOTIFY_GENERIC, 5 )   
			surface.PlaySound( "ambient/water/drip2.wav" )   
			v:SetNWInt(v:GetNWInt("money") + 50 )   
		elseif v:Team( ) == 4 then   
			GAMEMODE:AddNotify( "You have received $20.00 for stealing a T.V", NOTIFY_GENERIC, 5 )   
			surface.PlaySound( "ambient/water/drip2.wav" )   
			v:SetNWInt(v:GetNWInt("money") + 20 )   
		elseif v:Team( ) == 5 then   
			GAMEMODE:AddNotify( "You have received $25.00 for being the gundealer.", NOTIFY_GENERIC, 5 )   
			surface.PlaySound( "ambient/water/drip2.wav" )   
			v:SetNWInt(v:GetNWInt("money") + 25 )   
		elseif v:Team( ) == 6 then   
			GAMEMODE:AddNotify( "You have received $0.00 for Joining Noob", NOTIFY_GENERIC, 5 )   
			surface.PlaySound( "ambient/water/drip2.wav" )   
		end   
	end   
end )   

[editline]09:13PM[/editline]

With fish’s code, I get this error:

Timer Error: MRP\gamemode\shared.lua:67: attempt to call method ‘GetTeam’ (a nil value)

Ah, that’ll be because I put GetTeam instead of Team. Replacing all isntances of ply:GetTeam() with ply:Team() will fix it.
I guess I’m used to assuming that if you’re retrieving a value it should have ‘Get’ in the name, like most other functions do, and how the AccessorFunc function creates them.
How foolish I was to assume that it would follow standard programming practises؟

Still doesn’t work.

I have this code:


timer.Create( "payday", 60, 0, function( )
for k, v in pairs( player.GetAll( ) ) do
if v:Team() == 1 then
 v:SetNWInt( "Money", v:GetNWInt( "Money" ) + 25 )
 v:ChatPrint( "PAYDAY! Added 25$ To your wallet for being a Citizen" )
elseif v:Team() == 2 then
 v:SetNWInt( "Money", v:GetNWInt( "Money" ) + 40 )
  v:ChatPrint( "PAYDAY! Added 30$ To your wallet for being a Police Officer" )
elseif v:Team() == 3 then
 v:SetNWInt( "Money", v:GetNWInt( "Money" ) + 50 )
  v:ChatPrint( "PAYDAY! Added 50$ To your wallet for being a Mayor" )
elseif v:Team() == 4 then
 v:SetNWInt( "Money", v:GetNWInt( "Money" ) + 20 )
  v:ChatPrint( "PAYDAY! Added 20$ To your wallet for being a Gangster" )
elseif v:Team() == 5 then
 v:SetNWInt( "Money", v:GetNWInt( "Money" ) + 25 )
  v:ChatPrint( "PAYDAY! Added 25$ To your wallet for being a Gundealer" )
elseif v:Team() == 6 then
 v:SetNWInt( "Money", v:GetNWInt( "Money" ) + 0 )
  v:ChatPrint( "PAYDAY! Added 0$ To your wallet for being a Joining Noob" )
elseif v:Team() == 6 then
 v:SetNWInt( "Money", v:GetNWInt( "Money" ) + 45 )
  v:ChatPrint( "PAYDAY! Added 45$ To your wallet for being a Car Builder" )
end
end
end )

But say for example there’s a cop, mayor, and a gundealer, each player would get a cop payday, a mayor payday, and a gundealer payday.

I can’t see any obvious errors in the code. Using the table is faster and more extensible. You just need to add a new entry for the team instead of modifying the if statement.
I was bored so I redid yours as a table here. I’m just going to try and debug what you’ve given, although I have tested this and it appeared to match the specification.
[lua]local paydays = {
[1] = function(pl)
pl:SetNWInt( “Money”, pl:GetNWInt( “Money”, 0 ) + 25 )
pl:ChatPrint( “PAYDAY! Added 25$ To your wallet for being a Citizen” )
end;
[2] = function(pl)
pl:SetNWInt( “Money”, pl:GetNWInt( “Money”, 0 ) + 40 )
pl:ChatPrint( “PAYDAY! Added 40$ To your wallet for being a Police Officer” )
end;
[3] = function(pl)
pl:SetNWInt( “Money”, pl:GetNWInt( “Money”, 0 ) + 50 )
pl:ChatPrint( “PAYDAY! Added 50$ To your wallet for being a Mayor” )
end;
[4] = function(pl)
pl:SetNWInt( “Money”, pl:GetNWInt( “Money”, 0 ) + 20 )
pl:ChatPrint( “PAYDAY! Added 20$ To your wallet for being a Gangster” )
end;
[5] = function(pl)
pl:SetNWInt( “Money”, pl:GetNWInt( “Money”, 0 ) + 25 )
pl:ChatPrint( “PAYDAY! Added 25$ To your wallet for being a Gundealer” )
end;
[6] = function(pl)
pl:SetNWInt( “Money”, pl:GetNWInt( “Money”, 0 ) + 0 )
pl:ChatPrint( “PAYDAY! Added 0$ To your wallet for being a Joining Noob” )
end;
[7] = function(pl)
pl:SetNWInt( “Money”, pl:GetNWInt( “Money”, 0 ) + 45 )
pl:ChatPrint( “PAYDAY! Added 45$ To your wallet for being a Car Builder” )
end;
}

timer.Create( “payday”, 60, 0, function()
for i, pl in ipairs(player.GetAll()) do
paydayspl:Team()
end
end)[/lua]
Proof that the table is faster:
In the if statement block you perform T comparisons, where T is the player’s team.
With the table it’s one indexing operation.

[editline]09:11PM[/editline]

Also, the code you gave doesn’t have the problem you described.