跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
皮肤
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Cerulean)
  • 不使用皮肤
折叠
品牌标识

PyMUD官方论坛

  1. 主页
  2. 版块
  3. PyMUD讨论区
  4. 关于commands的问题,如何在异步执行的await中添加其他条件?

关于commands的问题,如何在异步执行的await中添加其他条件?

已定时 已固定 已锁定 已移动 PyMUD讨论区
5 帖子 2 发布者 112 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • T 离线
    T 离线
    terry
    写于 最后由 编辑
    #1

    我写了一个skills命令,意图查看自身或者师父的技能。
    现在是第一步,先实现自身的技能查询,并保存到变量中。

    你目前所掌握的技能:(十四项)
    
    ┏━  普通知识  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
    ┃  读书识字 (literate)                      - 学贯古今    192/ 22225   ┃
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
    ┏━  基本技能  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
    ┃  基本弓箭 (archery)                       - 初窥堂奥    171/ 2729    ┃
    ┃  基本轻功 (dodge)                         - 凌空渡虚    502/ 49830   ┃
    ┃  内功心法 (force)                         - 深不可测    503/ 239011  ┃
    ┃  拆招卸力之法 (parry)                     - 一代宗师    502/ 41364   ┃
    ┃  法术 (spells)                            - 变换莫测    503/ 8800    ┃
    ┃  基本剑术 (sword)                         - 一代宗师    502/ 8384    ┃
    ┃  扑击格斗之技 (unarmed)                   - 一代宗师    502/ 4228    ┃
    ┠─  特殊技能  ────────────────────────────┨
    ┃□百花掌 (baihua-zhang)                    - 一代宗师    502/ 32618   ┃
    ┃□枯骨刀 (kugu-blade)                      - 一代宗师    502/ 21322   ┃
    ┃□冷月凝香舞 (moondance)                   - 一代宗师    502/ 43960   ┃
    ┃□圆月心法 (moonforce)                     - 一代宗师    503/ 7155    ┃
    ┃□月宫仙法 (moonshentong)                  - 一代宗师    502/ 351011  ┃
    ┃□风回雪舞剑法 (snowsword)                 - 一代宗师    502/ 29453   ┃
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
    

    这是输入skills命令后的显示结果,我想通过'┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛'来触发命令结束,但这个在整个技能中出现了不止一次,所以我想结合技能的数量判断是否已经结束,即技能的获取数量和掌握技能的总数(十四项),可以判断技能查询结束了,如何把这个条件也加到异步判断中呢?
    下面是我暂时写的代码:

    from pymud import Command, Trigger, IConfig, DotDict,trigger,async_exception
    import traceback
    import re, cn2an
    
    class CmdSkills(Command, IConfig):
        _help = """
        通过命令行查看技能的命令:
            正常指令      含义
            skills:         查看角色所有技能
            skills xxx:    查看npc'xxx'的所有技能
        """
        def __init__(self, session, *args, **kwargs):
            pattern = r"^(?:skills|sk)\s*(.*)$"
            
            kwargs.setdefault("id", "cmd_skills")
            super().__init__(session, patterns = pattern, *args, **kwargs)
            self.session.setVariable('skills',[])    
            self.category = ''
            self.skill_count = 0
            self.skill_order = 0
        def __unload__(self):
            super().__unload__()
    
        @trigger(id = "cmd.skiills.start", patterns = r"^你目前所掌握的技能:((.*?)项)", group = "cmd.skills",enabled = False)
        def start(self, name, line, wildcards):    
            self.session.info('Start to parse skill on')
            self.skill_count = cn2an.cn2an(wildcards[0],'normal')
            self.session.enableGroup(group = "cmd.skills", enabled = True, subgroup = True)  
        
        @trigger(id = "cmd.skills.end", patterns = r'┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛', group = "cmd.skills",enabled = False)
        def end(self, name, line, wildcards):    
            self.session.info(f'End to parse skills')
            self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True)  
            
        
        @trigger(id = "cmd.skills.item", patterns = r'^\s*┃\s*([□ ]?)\s*([^()]+)\s*\(([^)]+)\)\s*-\s*([^ ]+)\s+(\d+)/\s*(\d+)\s*┃\s*$', group = "cmd.skills",enabled = False)
        def item(self, name, line, wildcards):    
            skill = {}
            skill['category'] = self.category
            skill['enabled'] = '□' in wildcards[0].strip()
            skill['cn_name'] = wildcards[1].strip()
            skill['en_name'] = wildcards[2].strip()
            skill['title'] = wildcards[3].strip()
            skill['level'] = int(wildcards[4].strip())
            skill['experience'] = int(wildcards[5].strip())
            self.session.getVariable('skills').append(skill)
            self.skill_order += 1
        
        @trigger(id = "cmd.skills.category", patterns = r'^[┏┠][━─]\s{2}([\u4e00-\u9fa5]+)\s{2}[━─]+.*[┓┨]\s*$', group = "cmd.skills",enabled = False)
        def item_end(self, name, line, wildcards):
            self.category = wildcards[0].strip()    
            self.session.info(f'Skill category: {self.category}')
    
        async def execute(self, cmd = "skills", *args, **kwargs):        
            try:
                self.reset()
                self.session.tris["cmd.skiills.start"].enabled = True 
                await self.session.waitfor(cmd, self.session.tris["cmd.skills.end"].triggered())
                self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True)  
                return self.SUCCESS
            except Exception as e:
                self.error(f"异步执行中遇到异常, {e}, 类型为 {type(e)}")
                self.error(f"异常追踪为: {traceback.format_exc()}")
    
    1 条回复 最后回复
    0
    • H 离线
      H 离线
      hhyzz
      写于 最后由 hhyzz 编辑
      #2

      有两个思路,你参考下:
      1.execute方法中整组使能之后关闭cmd.skills.end触发

      self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True)
      self.session.tris["cmd.skiills.stop"].enabled = False
      

      增加一个新的触发"┠─ 特殊技能 ────────────────────────────┨",
      用这个触发来使能"cmd.skiills.stop"触发,这样就避免了被前序的字符串误触发了。

      2.第二个思路就比较不推荐了,只是作为一个参考也许其他地方能用的上。
      你目前所掌握的技能:(十四项)此处将"十四"转阿拉伯数字,存变量"_num"
      后面写一个while循环等待技能捕获到足够数量,

      
      self.session.vars.skills = []
      while len(self.session.vars.skills)<_num:
          #实际使用中,应加入超时机制,避免因为睡觉等无法接收服务器消息的原因造成无限循环
          await asyncio.sleep(0.1)
          self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True)  
          return self.SUCCESS
      
      1 条回复 最后回复
      0
      • T 离线
        T 离线
        terry
        写于 最后由 编辑
        #3

        我可能会用第二种方法,第一种方法适用性有些窄,因为新角色或者转世后,角色可能只有基本技能而无特殊技能。

        其实我在想如何构造一个可等待对象,在里边等待这个判断条件,但我现在对这个异步理解不深刻,还得琢磨琢磨

        1 条回复 最后回复
        0
        • H 离线
          H 离线
          hhyzz
          写于 最后由 编辑
          #4

          我仍然建议你用第一种方案,如果会没有特殊技能,至少会有基本技能的,用正则写法
          r"┠─ (特殊|基本)技能 ────────────────────────────┨"

          1 条回复 最后回复
          0
          • T 离线
            T 离线
            terry
            写于 最后由 编辑
            #5

            谢谢各位大佬。
            我在skill item的触发中计数,当计数和总技能数相等的时候开启end触发,算是绕过去了。

            from pymud import Command, Trigger, IConfig, DotDict,trigger,async_exception
            import traceback
            import re, cn2an
            
            class CmdSkills(Command, IConfig):
                _help = """
                通过命令行查看技能的命令:
                    正常指令      含义
                    skills:         查看角色所有技能
                    skills xxx:    查看npc'xxx'的所有技能
                """
                def __init__(self, session, *args, **kwargs):
                    pattern = r"^(?:skills|sk)\s*(.*)$"        
                    kwargs.setdefault("id", "cmd_skills")
                    super().__init__(session, patterns = pattern, *args, **kwargs)
                    self.session.setVariable('skills',[])    
                    self.category = ''
                    self.skill_count = 0
            
                def __unload__(self):
                    super().__unload__()
            
                @trigger(id = "cmd.skills.start", patterns = r"^你目前所掌握的技能:((.*?)项)", group = "cmd.skills",enabled = False)
                def start(self, name, line, wildcards): 
                    self.skills = []
                    self.skill_order = 0
                    self.session.info('Start to parse skill on')
                    self.skill_count = cn2an.cn2an(wildcards[0],'normal')
                    self.session.enableGroup(group = "cmd.skills", enabled = True, subgroup = True)  
                
                @trigger(id = "cmd.skills.end", patterns = r'┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛', group = "cmd.skills",enabled = False)
                def end(self, name, line, wildcards):    
                    self.session.info(f'End to parse skills')
                    self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True)        
                
                @trigger(id = "cmd.skills.item", patterns = r'^\s*┃\s*([□ ]?)\s*([^()]+)\s*\(([^)]+)\)\s*-\s*([^ ]+)\s+(\d+)/\s*(\d+)\s*┃\s*$', group = "cmd.skills",enabled = False)
                def item(self, name, line, wildcards):    
                    skill = {}
                    skill['category'] = self.category
                    skill['enabled'] = '□' in wildcards[0].strip()
                    skill['cn_name'] = wildcards[1].strip()
                    skill['en_name'] = wildcards[2].strip()
                    skill['title'] = wildcards[3].strip()
                    skill['level'] = int(wildcards[4].strip())
                    skill['experience'] = int(wildcards[5].strip())
                    self.skills.append(skill)
                    self.skill_order += 1
                    if self.skill_order == self.skill_count:
                        self.session.tris["cmd.skills.end"].enabled = True 
                
                @trigger(id = "cmd.skills.category", patterns = r'^[┏┠][━─]\s{2}([\u4e00-\u9fa5]+)\s{2}[━─]+.*[┓┨]\s*$', group = "cmd.skills",enabled = False)
                def category(self, name, line, wildcards):
                    self.category = wildcards[0].strip()    
                    self.session.info(f'Skill category: {self.category}')
            
                async def execute(self, cmd = "skills", *args, **kwargs):        
                    try:
                        self.reset()
                        self.session.tris["cmd.skills.start"].enabled = True 
                        await self.session.waitfor(cmd, self.session.tris["cmd.skills.end"].triggered())
                        self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True) 
                        self.session.setVariable('skills',self.skills)    
                        return self.SUCCESS
                    except Exception as e:
                        self.error(f"异步执行中遇到异常, {e}, 类型为 {type(e)}")
                        self.error(f"异常追踪为: {traceback.format_exc()}")
            
            1 条回复 最后回复
            1
            回复
            • 在新帖中回复
            登录后回复
            • 从旧到新
            • 从新到旧
            • 最多赞同


            • 登录

            • 没有帐号? 注册

            • 登录或注册以进行搜索。
            Powered by NodeBB Contributors
            • 第一个帖子
              最后一个帖子
            0
            • 版块
            • 最新
            • 标签
            • 热门
            • 世界
            • 用户
            • 群组