Isso ocorre pois você precisa criar uma tabela para a tabela que indexa o jogador também.
Dessa forma:
local players = {}
function startWork (source)
print(getPlayerName(source)) -- Retorna o nick ou seja o source existe
if not players[source] then
players[source] = {}
players[source]["rubble"] = 0
players[source]["rubbleRemoved"] = false
players[source]["atWork"] = false
end
end
Offtopic: percebo que você costuma não utilizar variáveis locais, o que deixa a desejar em questão de otimização (não é tanta diferença, mas boas práticas de programação devem estar em todos os códigos ?). No topo do seu código, defina todas as tabelas e variáveis como local. Ao decorrer do código, você poderá usar sem o local, pois uma vez definida dessa forma, sempre será local. Isso vale também para funções, laços de repetições e afins, sempre considere usar local para definir uma variável ou tabela dentro do escopo seja de função ou laço de repetição.