Hmmm... Why not just use a sensor?
string Glass = "name_of_the_glass";
integer Handle;
touch_start(integer total)
{
llSensor(Glass, NULL_KEY, SCRIPTED, 96.0, PI); // 96m for a very large castle
}
sensor(integer total)
{
key glass_key = llDetectedKey(0);
ffSlowlyMoveTo(llDetectedPos(0) + some_offset); // Function to write
ffSlowlyRotateToPour(); // Function to write
Handle = llListen(-474747, Glass, glass_key, (string)llGetKey());
llWhisper(-474747, (string)glass_key);
//ffShowWineFlowing(); // Eventually... To look better.
}
no_sensor()
{
llSay(0, "The glass isn't is the house..."

;
}
listen(integer channel, string name, key id, string msg)
{
llListenRemove(Handle);
//ffStopFlowOfWine; // Eventually...
ffSlowlyRotateToVertical(); // Function to write
ffSlowlyMoveBack(); // Eventually... Function to write
}
And in the glass:
state_entry()
{
llListen(-474747, "", NULL_KEY, (string)llGetKey());
}
listen(integer channel, string name, key bottle_key, string msg)
{
ffSlowlyFill(); // Function to write
llWhisper(-474747, (string)bottle_key); // I'm full!
}
I made the bottle and the glass talk to each other using their UUID so it's easy to expand the script to let the bottle fill a row of glasses. (That's the most common use of a bottle.) Besides, the UUIDs make good filters to narrow the llListen() "openness".
As for how to fill the glass, it totally depends on the glass. If the glass has a spherical shape like most wine glasses, a dimpled sphere plus a moving/growing disc for the surface will do. You used the word "gobelet", for me that's cylindric. So, a dimpled cylinder that grows with llSetScale() would work in this case. And for the worse cases, a half invisible half transparent texture slowly shifting below an appropriate rising prim surface may be the way to go. Last and simplest solution: llSetAlpha() if everything else fails.