afaik, KillObject works, it's only the grenade kit's graphic that stays for a bunch of seconds, it doesn't have any effect though after it was killed. you should also call the sleep() and the KillObject in a separate ThreadFunc because as far as i can see, sleep doesn't work in some of the hardcoded procedures.
procedure DelayedKillObject(ObjectID,Delay: integer);
begin
sleep(Delay);
KillObject(ObjectID);
end;
procedure OnPlayerSpeak(ID: byte; Text: string);
var
i: integer;
begin
Cash[ID] := 16000;
i := SpawnObject(GetPlayerStat(ID,'X') + 50,GetPlayerStat(ID,'Y'),17);
Command('/say B4');
ThreadFunc([i,2000],'DelayedKillObject');
Command('/say AF');
end;