2015-03-22 12 views
0

Я строю текстовую игру в Evennia. Я добавил новый класс под названием Prop. На данный момент он имеет одну команду wear. Затем я создал пару Props в качестве прототипов и построил их с использованием @spawn. Когда я держу только одну опору, ее команда на износ отлично работает: wear glove возвращает «Ты теперь в перчатке». Но как только у меня есть несколько реквизитов, все, что я получаю, это меню значений .search(), и ничего, что я набираю, кажется, действительно делает неоднозначность.Почему я получаю несколько результатов для команды в Evenion?

Я уверен, что это связано с слиянием cmdset, но это насколько я понял. Что я делаю не так?

грязевые/команды/prop_commands.py

""" 
Prop commands 


""" 


from evennia import CmdSet 
from command import Command 




class CmdWear(Command): 
    """ 
    Wear or remove a prop 


    Usage: 
     wear <prop> 
     don <prop> 
     doff <prop> 


    Causes you to wear or remove the prop. {wdon{n and {wdoff{n will only put the prop on or off; {wwear{n form will toggle between worn and unworn. 
    """ 


    key = "wear" 
    aliases = ["don", "doff"] 
    locks = "cmd:holds()" 
    help_category = "Objects" 


    def parse(self): 
     """Trivial parser""" 
     self.target = self.args.strip() 


    def func(self): 
     caller = self.caller 
     if not self.target: 
      caller.msg("Wear what?") 
      return 


     target = caller.search(self.target) 
     if not target: 
      caller.msg("Couldn't find any %s." % self.target) 
      return 


     # assumes it's a Prop typeclass, so assumes it has this attribute 
     if not target.db.wearable: 
      caller.msg("That doesn't make any sense.") 
      return 


     if self.cmdstring in ("don", "doff"): 
      should_wear = True if self.cmdstring == "don" else False 
     else: 
      should_wear = not target.db.worn 


     if target.db.worn^should_wear: 
      target.db.worn = should_wear 
      caller.msg("You're %s wearing %s." % (
       "now" if target.db.worn else "no longer", 
       target)) 
     else: 
      caller.msg("You're %s wearing %s." % (
       "already" if target.db.worn else "not", 
       target)) 




class PropCmdSet(CmdSet): 


    def at_cmdset_creation(self): 
     self.add(CmdWear()) 

грязь/классы типов/props.py

""" 
Props are items that can be held, worn, etc. 


""" 


from evennia import DefaultObject 
from commands import prop_commands 




class Prop(DefaultObject): 
    """ 
    Props are items that can be held, worn, stood on, and more. 
    """ 
    def at_object_creation(self): 
     self.cmdset.add(prop_commands.PropCmdSet, permanent=True) 


     self.db.wearable = True 
     self.db.worn = False 

ответ

0

Оказывается, что я не получал .search устранения неоднозначности. Вместо этого сама команда была устранена. Решение состоит в том, чтобы переместить CmdSet в нечто иное, чем объекты. Тогда есть только одна команда, независимо от того, сколько объектов находится в области видимости.