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

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

PyMUD官方论坛

H

hhyzz

@hhyzz
取消关注 关注
关于
帖子
4
主题
2
分享
0
群组
0
粉丝
0
关注
0

帖子

最新 最佳 有争议的

  • 关于#var命令的bug提交
    H hhyzz
    PyMUD讨论区

    现象:
    1.如果变量的值带ANSI颜色代码,会无法打印。
    2.如果变量的键是数字类型,会无法正常打印。
    修改方案:
    9cd7fe56-2692-4469-9187-cb97c5647650-image.jpeg
    """返回字符串的显示宽度,而不是字符数量

        注意: 字符串中若含有 ANSI 颜色等控制字符,wcswidth 会返回 -1,
        导致 len() 抛出 ValueError。此处先剥离 ANSI 转义序列再计算宽度,
        并对仍返回 -1 的情况兜底为 0。
        """
        from .session import Session
        clean = Session.PLAIN_TEXT_REGX.sub("", self.__str__())
        w = wcswidth(clean)
        return w if w >= 0 else 0
    

    95e7f3d0-79c1-4f02-8eed-8a23482548f6-image.jpeg
    def getMaxLength(self, iter: Iterable):
    return wcswidth(str(sorted(iter, key=lambda s: wcswidth(str(s)), reverse=True)[0]))


  • 关于commands的问题,如何在异步执行的await中添加其他条件?
    H hhyzz
    PyMUD讨论区

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


  • 关于commands的问题,如何在异步执行的await中添加其他条件?
    H hhyzz
    PyMUD讨论区

    有两个思路,你参考下:
    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
    

  • 一个极简COMMAND的演示代码
    H hhyzz
    PyMUD讨论区
    from pymud import Session, Command, exception, IConfig, Trigger
    
    class cha_rbz(Command, IConfig):
        def __init__(self, session, *args, **kwargs):
            kwargs.setdefault("id", "cmd_id")
            kwargs.setdefault("group", "cmd")
            super().__init__(session, r"^id( here)?$", *args, **kwargs)
    
            self._items = []
            options = {"enabled": False, "group": "cmd.id", "keepEval": True}
            self._tris = {
                "id_here"     : Trigger(self.session, r"^[> ]*你身上携带物品的别称如下|^[> ]*在这个房间中, 生物及物品的\(英文\)名称如下.*", onSuccess = self.id_here, **options),
                "id_item"     : Trigger(self.session, r"^[> ]*([\u4e00-\u9fa5 ]+)\s+ = (.+)$", onSuccess = self.id_item, **options),
                "stop"        : Trigger(self.session, r"^[> ]*系统回馈:id_is_over = 1", onSuccess = self.stop, **options),
            }
            #[╰└]+  [╯┘]+
        @exception
        async def execute(self, cmd, *args, **kwargs):
            self.reset()
            self._items = []
            #指定的触发器使能,也可以是GROUP使能
            self._tris["id_here"].enabled = True
            self._tris["stop"].enabled = True
            self.session.writeline(f"{cmd}")
            #此处插入一个等待,仅为演示脚本的等待,实际使用中无需等待
            await asyncio.sleep(1)
            self.session.writeline(f"response id_is_over 1")
            #等待触发被触发,可以使用任何可等待的对象
            await self._tris["stop"].triggered()
            #command的返回值
            return self._items
    
        def id_here(self, name, line, wildcards):
            #没有在CMD开始就使能整组触发器,防止因为网络卡顿的原因造成误触发
            self._tris["id_item"].enabled = True
        def id_item(self, name, line, wildcards):
            data = list(wildcards)
            data[0] = data[0].strip()
            data[1] = data[1].split(", ")
    
            if not data[0] == self.session.vars.Status["name"]:
                #避免捕获自己的信息,Status为自定义字典
                self._items.append(data)
        def __unload__(self):
            self.session.delObjects(self._tris)
            super().__unload__()
        def reset(self):
            super().reset()
            self.session.enableGroup("cmd.id", False, False, [Trigger])
    
        def start(self, name, line, wildcards):
            self.session.enableGroup("cmd.id", True, False, [Trigger])
    
        def stop(self, name=None, line=None, wildcards=None):
            #cmd流程结束,关闭触发组
            self.session.enableGroup("cmd.id", False, False, [Trigger])
    
  • 登录

  • 没有帐号? 注册

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