How to detect changed value in index?

hello in my module i made a data system but in the data table i added template
in this template i will made a detect changed value in index. but I fail all the time.

function Player.new(player: Player)
	local self = setmetatable({}, Player)
	
	self.Player = player
	self.Template = {} -- ce que l'on va save
	self.Data = setmetatable({}, {
		__newindex = function(t, i, v)
			local leaderstats = self.Player:FindFirstChild("leaderstats")
			
			rawset(self.Data, i, v)

			if leaderstats then
				setValue(leaderstats, i, v)
			end
		end,
	})
	
	assert(not Players[self.Player.UserId], "This player already exist..")
	
	Players[self.Player.UserId] = self
	
	return self
end
function Player:increaseValue(name: string, value: any)
	self.Data[name] = value
end

If you wanna detect when a value changes, you’ll need to use proxies.

Example use-case:

-- Logic Table
local Constructor = {}
local Class = nil

-- Public Constructors
function Constructor.new()
	local this = {}
	setmetatable(this, Class)
	
	do
		this.Message = "Nothing for now!"
	end
	
	return wrap(this)
end

-- Private Methods
function wrap(this)
	local proxy = newproxy(true)
	local metatable = getmetatable(proxy)
	
	function metatable:__index(index)
		return this[index]
	end
	
	function metatable:__newindex(index, value)
		print(`{index} value changed to {value}`)
		this[index] = value
	end
	
	return proxy
end

-- Public Methods
Class = {}
Class.__index = Class

function Class:UpdateMessage(message)
	self.Message = message
end

-- Return
return Constructor

Output (when I update the “Message” value):
image

1 Like