A mi también me devolvía el mensaje dos veces. Lo que utilicé es onClientClick y el objeto en cuestión, pero yo abro una GUI, no envío mensajes. Prueba con esto:
mesa = createObject(201, -2107.7, -2283.6001, 30.7, 0, 0, 320)
function asda ( button, state, _, _, _, _, _, clickedElement )
local x, y, z = getElementPosition(localPlayer)
local x1, y1, z1 = getElementPosition(clickedElement)
local distance = getDistanceBetweenPoints3D(x, y, z, x1, y1, z1)
if distance < 3 then
if clickedElement == mesa then
exports.gui:show('mesa')
end
end
end
addEventHandler ( "onClientClick", getRootElement(), asda )