--- orig/rpggame/rpg.cpp
+++ mod/rpggame/rpg.cpp
@@ -135,7 +135,7 @@
     {
         glLoadIdentity();
         glOrtho(0, w*2, h*2, 0, -1, 1);
-        draw_textf("using: %s", 636*2, h*2-256+149, os.selected ? os.selected->name : "(none)");       // temp
+        draw_textf("using: %s", 636*2, h*2-256+149, os.playerobj->selected ? os.playerobj->selected->name : "(none)");       // temp
 
         glLoadIdentity();
         glOrtho(0, w, h, 0, -1, 1);
--- orig/rpggame/rpgobjset.h
+++ mod/rpggame/rpgobjset.h
@@ -22,7 +22,6 @@
 
     rpgobj *pointingat;
     rpgobj *playerobj;
-    rpgobj *selected;
 
     vector<rpgaigroup> aigroups;
     vector<rsleepcmd> rsleepcmds;
@@ -30,7 +29,7 @@
     rpgquest *quests;
     rpgquest *currentquest;
 
-    rpgobjset(rpgclient &_cl) : cl(_cl), pointingat(NULL), playerobj(NULL), selected(NULL), quests(NULL), currentquest(NULL)
+    rpgobjset(rpgclient &_cl) : cl(_cl), pointingat(NULL), playerobj(NULL), quests(NULL), currentquest(NULL)
     {
         #define N(n) CCOMMAND(r_##n,     "i", (rpgobjset *self, int *val), { self->stack[0]->s_##n = *val; }); \
                      CCOMMAND(r_get_##n, "",  (rpgobjset *self), { intret(self->stack[0]->s_##n); });
@@ -56,7 +55,7 @@
         CCOMMAND(r_del_action,  "s",   (rpgobjset *self, char *s), { self->stack[0]->delaction(s); });
         CCOMMAND(r_take,        "sssi",(rpgobjset *self, char *name, char *ok, char *notok, int *silent), { self->takefromplayer(name, ok, notok, *silent); });
         CCOMMAND(r_give,        "si",  (rpgobjset *self, char *s, int *silent), { self->givetoplayer(s, *silent); });
-        CCOMMAND(r_use,         "",    (rpgobjset *self), { self->stack[0]->selectuse(); });
+        CCOMMAND(r_use,         "",    (rpgobjset *self), { self->stack[0]->selectuse(self->stack[1]); });
         CCOMMAND(r_applydamage, "i",   (rpgobjset *self, int *d), { self->stack[0]->takedamage(*d, *self->stack[1]); });
         CCOMMAND(r_get_name,    "",    (rpgobjset *self), { if (self->stack[0]->name) result(self->stack[0]->name); });
         CCOMMAND(r_check_inv,   "s",   (rpgobjset *self, char *name), { intret(self->playerobj->checkinv(name)); });
@@ -118,10 +117,10 @@
 
     void removefromsystem(rpgobj *o)
     {
+        if (o->parent && (o->parent->selected==o)) o->parent->selected = NULL;
         removefromworld(o);
         o->decontain();
         if(pointingat==o) pointingat = NULL;
-        if(selected==o) selected = NULL;
         resetstack();
         DELETEP(o);
     }
--- orig/rpggame/rpgobj.h
+++ mod/rpggame/rpgobj.h
@@ -37,6 +37,7 @@
     rpgobj *parent;     // container object, if not top level
     rpgobj *inventory;  // contained objects, if any
     rpgobj *sibling;    // used for linking, if contained
+    rpgobj *selected;   // currently selected object (weapon), if any
 
     rpgent *ent;        // representation in the world, if top level
 
@@ -69,7 +70,7 @@
     #define loopinventory() for(rpgobj *o = inventory; o; o = o->sibling)
     #define loopinventorytype(T) loopinventory() if(o->itemflags&(T))
 
-    rpgobj(const char *_name, rpgobjset &_os) : parent(NULL), inventory(NULL), sibling(NULL), ent(NULL), name(_name), model(NULL), itemflags(IF_INVENTORY),
+    rpgobj(const char *_name, rpgobjset &_os) : parent(NULL), inventory(NULL), sibling(NULL), selected(NULL), ent(NULL), name(_name), model(NULL), itemflags(IF_INVENTORY),
         actions(NULL), abovetext(NULL), menutime(0), menutab(1), menuwhich(MENU_DEFAULT), os(_os) {}
 
     ~rpgobj()
@@ -123,8 +124,8 @@
 
     rpgobj &selectedweapon()
     {
-        if(this==os.playerobj) return os.selected ? *os.selected : *this;
-        else { loopinventorytype(IF_INVENTORY) if(o->s_usetype) return *o; };
+        if(selected) return *selected;
+        else { loopinventorytype(IF_INVENTORY) if(o->s_usetype && o->s_damage) return *o; };
         return *this;
     }
 
@@ -284,16 +285,18 @@
         }
     }
 
-    void selectuse()
+    void selectuse(rpgobj *target)
     {
+        if (!target->ent) return;
+
         if(s_usetype)
         {
-            conoutf("\f2using: %s", name);
-            os.selected = this;
+            if (target==os.playerobj) conoutf("\f2using: %s", name);
+            target->selected = this;
         }
         else
         {
-            useaction(*os.playerobj, *os.playerobj->ent, true);
+            useaction(*target, *(target->ent), true);
         }
     }
 
@@ -342,7 +345,7 @@
                     }
                     if(!s_usetype && g.button("use", 0xFFFFFF, "hand")&G3D_UP)
                     {
-                        selectuse();
+                        selectuse(os.playerobj);
                     }
                 }
                 break;
@@ -424,7 +427,7 @@
                 }
                 else    // player wants to use this item
                 {
-                    o->selectuse();
+                    o->selectuse(os.playerobj);
                 }
             }
         }
