Here's a slightly more concise version of Rhidian's solution. Tested and confirmed working.

Code
TriggerRegisterForItems(TRIGGER_test);

DB_Enigma02_bodyparts(ITEM_test1);
DB_Enigma02_bodyparts(ITEM_test2);
DB_Enigma02_bodyparts(ITEM_test3);


IF
ItemEnteredTrigger(_Item,TRIGGER_test,_Player)
AND
DB_Enigma02_bodyparts(_Item)
THEN
DB_AllInTrigger(1);
TestAllInTrigger();
DisplayWhenAllItemsArePresent(_Player);

PROC TestAllInTrigger()
AND
DB_Enigma02_bodyparts(_Item)
AND
ItemIsInTrigger(_Item,TRIGGER_test,0)
THEN
NOT DB_AllInTrigger(1);

PROC
DisplayWhenAllItemsArePresent((CHARACTER) _player)
AND
DB_AllInTrigger(1)
THEN
CharacterDisplayText(_player, "PENNY_01");



Note that by passing player to the proc we can ensure that the text will display over the character that moved the object.