My solution to this wasn't exactly elegant but it works, I have 8 global variables all default value of 0.
CommonLootDrop, uncommonLootDrop, rareLootDrop, epicLootDrop
CommonLoot, uncommonLoot, rareLoot, epicLoot
When a monster dies, roll to see if you got a drop from it. A weak rat for example would be set commonDrop to random (0,100) set uncommonDrop to random (0, 60)
Then I have events such as "CommonLootDrop > 50, set CommonLoot to choose (1,2,3,4) and then another event that is CommonLoot = 1 + 1 health potion, if CommonLoot = 2, +10 gold, etc etc... Same for the other rarities.
I have it so you only get 1 drop at most per kill, so I do the loot checks in order of rarest to least rare.
As an example I kill a big enemy with random (0,60) epic. random(30,80) rare. random(50,100) uncommon.
It would roll epic, check if over 50, roll rare, check if over 50, roll uncommon, check if over 50.
So if those random numbers were 40, 65, 99, then it actually would stop at 65 and give me a rare item, never completing the uncommon roll as it's now irrelevant.