Inventory System

Time to re-factor the old inventory system in my MUD to something a bit more principled. At the moment it is composed of two types of classes:

WearEvent, PutEvent, DropEvent, etc. etc. - Events which represent the movement of an Item from one location to another, at present these simply identify whether the target in question is visible/exists, and that it is an item. They then call methods inside of…
Inventory - A god-class with too many responsibilities. Contains enum Location for all locations an item can be worn/held. Used in a HashMap<Location, Item> which is manipulated through various methods that are extensions of the events mentioned above. EG: Inventory.drop(Item) etc. etc.

My primary issue is that in a text-based game you have to tell the player very specifically why the command they entered failed, whereas in a graphical game you can play an ‘error beep’ and trust that the player understands that he can’t wear a health potion on his head. So what I have is error messages entrenched very far past the above-mentioned events, within Inventory itself: ‘You are already wearing something in that location’, ‘You don’t have enough room to carry that’, ‘Your hands are full,’ etc.

Any suggestions? I could just re-factor all logic and accompanying error messages into the events themselves, or create intermediary events which handle secondary logic beyond type-checking, but in either case I can’t help but feel like I’m missing out on a more elegant, principled solution. This one is very seriously programmed to an implementation, as opposed to an interface.