Módulo para atributos em instances

Olá querido leitor, venho hoje aqui pedir opiniões, críticas sobre um módulo que fiz ontem.
Ele usa o CollectionService para armazenar tags em instances como atributos.

Link para o módulo: https://www.roblox.com/library/6055314711/Attributes-Module

Github: https://github.com/TownbyHelio/AttributesModule

Como usar?

No código abaixo estamos adicionando um atributo ao script

local AttributesModule = require(--[[caminho para o módulo]])

AttributesModule.SetAttribute(script, "Atributo", "Valor")

script.Parent = game.Workspace

OBS

É possível também usar require(6055314711)

Em outro outro script na workspace, estamos pegando o atributo desse script e imprimindo ele no output

local AttributesModule = require(--[[caminho para o módulo]])

local s = game.Workspace:WaitForChild("Script1")

print(AttributesModule.GetAttribute(s, "Atributo"))

--[[ Output
    Valor
]]

Há outras funções também:

GetAttributes

Tipo de retorno: array

local attributes = AttributesModule.GetAttributes(s)

for i, v in pairs(attributes) do
    print(i, v)
end

--[[ Output
    Atributo Valor
]]

HasAttribute

Tipo de retorno: boolean

print(AttributesModule.HasAttribute(s, "Atributo"))

print(AttributesModule.HasAttribute(s, "Outro Atributo"))

--[[ Output
    true
    false
]]

Coisas a se destacar

  • Um atributo pode ser adicionado a qualquer instance, não apenas a scripts.

Estou pensando em fazer um plugin para poder setar atributos fora de scripts.

Então é isso galera! Qualquer crítica, sugestão, dúvida é só botar aqui em baixo. Valeu!

2 Curtidas

Achei muito legal o module, realmente ajuda enquanto o Roblox não adicionar isso oficialmente.

Mas o module está privado:
image

Uma dúvida, é possível adicionar valores sem ser strings(numbers, tables, booleans) ao objeto?

Acho que uma ideia legal seria ter os eventos AtributeAdded e AtributeRemoving.

Bom, gostei bastante! :grinning:

1 Curtida

Peço mil perdões, acho que já deve estar público!

Você pode adicionar tudo que pode ser serializado em JSON.

Boa idéia! Estou implementando isso agora, talvez eu até faça um sistema de cancelamento. Ex:

AttributesModule.AttributeSet:Connect(function(instance, attribute, value)
    return false -- Bloqueia o atributo de ser setado
end)
1 Curtida

Feito!

local module = require(6055901194) -- Modelo de testes

module.AttributeSet:Connect(function(instance, attribute, value)
	print(instance.Name, attribute, value)
	
	return false
end)

module.SetAttribute(script, "Atributo", 10)

wait()

print(module.GetAttribute(script, "Atributo"))

--[[ Output
    Script Atributo 10
    nil
]]

Se você não retornar nada ou retornar true, o atributo é setado!

1 Curtida

Muito boa a ideia de poder cancelar! Acho que vou usar no meu jogo para proteger proximity prompts de exploiters, já que o Roblox ainda não adicionou isso(e nem sei se vai). Com isso, quando um prompt for ativado, eu posso fazer todas as checagens em um script separado para isso e caso algo esteja errado, posso cancelar o atributo e meu script original do prompt não roda. Deve ter ficado meio confuso, mas estava procurando algo assim!

1 Curtida

Que legal! Não conhecia o CollectionService . Isso deixa o jogo bem mais seguro, já que não é mais preciso colocar scripts dentro dos objetos e sim deixar eles no ServerScriptService.

2 Curtidas

Estou pensando em adicionar Persistent Attributes (Nome que inventei), eles só poderiam ser dados a players porém esses atributos salvariam após sair do jogo ou entrar, com DataStore, claro. Facilitaria o trabalho pois invés de fazer um script para salvar/carregar do datastore, é só usar:

AttributesModule.HasPersistentAttribute(player, "Dinheiro")

Ou

AttributesModule.SetPersistentAttribute(player, "Dinheiro", 1000000)

Gostaria de opiniões se possível

2 Curtidas

Gostei da ideia, mas acho que é muita responsabilidade garantir que o valor será salvo e carregado corretamente. Se for fazer, talvez seja bom manter um cachê para cada player, dessa forma, não será preciso mandar uma request cada vez que esse método for chamado, e salvar os dados só quando o player sair.

1 Curtida

Exato, eu iria armazenar os dados do mesmo jeito que armazeno atributos após carregar os dados quando o player entrar. E salvá-los automaticamente quando sair.

1 Curtida

Esse módulo acabou se tornando inútil, o próprio roblox acabou de lançar um update em que libera os attributes! Eu havia o feito justamente para substituir os atributos enquanto eles ainda não foram lançados. https://devforum.roblox.com/t/new-studio-beta-attributes/984141

2 Curtidas