Пример #1
0
def flow_stop(src, ctx):
    server, info = __get(src)
    if PLAYERS.get(info.player):
        server.reply(info, RText(f"停止flow", RColor.yellow))
        PLAYERS.pop(info.player)
    else:
        server.reply(info, RText(f"没有使用flow", RColor.yellow))
Пример #2
0
def store(src, ctx):
    server, info = __get(src)

    number = int(ctx.get("number"))

    if number <= 0:
        server.reply(info, RText("不能这样存储经验", RColor.red))
        return

    xp_total = __get_xp_total(server, info.player)

    server.logger.debug(f"玩家 {info.player} 当前总经验 {xp_total}")

    number_all, _ = __store_space(xp_total)

    if number_all < number:
        server.reply(info, RText(f"当前最多只能存储{number_all}瓶", RColor.red))
    else:
        reduce_xp = number * EXPERIENCE_BOTTLE
        server.rcon_query(
            f"execute at {info.player} run experience add {info.player} -{reduce_xp} points"
        )
        server.rcon_query(
            f"execute at {info.player} run give {info.player} minecraft:experience_bottle {number}"
        )
Пример #3
0
def invite(src, ctx):
    server, info = __get(src)

    invite_player = ctx["player"]

    if invite_player == info.player:
        server.reply(info, RText("不能向你自已发送邀请", RColor.red))
        return

    # 邀请的玩家是否在线
    if player_online(server, invite_player):

        if check_level(server, info):

            # 查看邀请信息
            k = info.player + "_" + invite_player
            v = int(time.time())
            INVITE[k] = v

            server.tell(invite_player, click_invite(info.player,
                                                    invite_player))
            server.reply(
                info,
                RTextList("向玩家 ", RText(f"{invite_player}", RColor.yellow),
                          " 发送tp邀请"))
            playsound(server, info.player)

    else:
        server.reply(
            info,
            RTextList("玩家 ", RText(f"{invite_player}", RColor.red), " 不在线"))
Пример #4
0
def accept(src, ctx):
    server, info = __get(src)

    accept_player = ctx["player"]

    # 对方是否在线
    if player_online(server, accept_player):

        # 查看邀请信息
        k = accept_player + "_" + info.player

        t = int(time.time()) - INVITE.get(k, 0)

        if t < 180:
            server.rcon_query(
                f"execute at {info.player} run teleport {info.player} {accept_player}"
            )
            server.rcon_query(
                f"execute at {info.player} run playsound minecraft:item.chorus_fruit.teleport player {info.player}"
            )
        else:
            server.reply(info, RText("玩家没有邀请你或邀请已超过3分钟", RColor.yellow))
            #playsound(server, info.player)

        pop_invite(k)

    else:
        server.reply(
            info,
            RTextList("玩家 ", RText(f"{accept_player}", RColor.red), " 不在线"))
Пример #5
0
def help_and_run(src):
    server, info = __get(src)

    line1 = f"{'='*10} 使用方法 {'='*10}"
    line2 = f"{cmdprefix}                      查看方法和使用"
    line3 = f"{cmdprefix} store <number>       存储number瓶经验(7经验/瓶)"
    line4 = RText(f"{cmdprefix} store-all            存储全部经验", RColor.yellow)
    line5 = RText(f"{cmdprefix} store-30             存储多出30级的经验",
                  RColor.yellow)

    xp_total = __get_xp_total(server, info.player)

    number_all, space_all = __store_space(xp_total)

    number_30, space_30 = __store_space(xp_total - LEVEL30TOTAL)

    line4.set_hover_text(
        RTextList("当前能存:", RText(f"{number_all}", RColor.green), "瓶(",
                  RText(f"{space_all}", RColor.blue), ")格"))
    if number_all > 0:
        line4.set_click_event(RAction.run_command,
                              f"{cmdprefix} store {number_all}")

    line5.set_hover_text(
        RTextList("当前能存:", RText(f"{number_30}", RColor.green), "瓶(",
                  RText(f"{space_30}", RColor.blue), ")格"))
    if number_30 > 0:
        line5.set_click_event(RAction.run_command,
                              f"{cmdprefix} store {number_30}")

    server.reply(info, "\n".join([line1, line2, line3]))
    server.reply(info, RTextList(line4, "\n", line5))
Пример #6
0
def remove(src, ctx):
    server, info = __get(src)

    u = USERTP.get(info.player)

    if u is None:
        server.tell(info.player, RText(f"当前没有收藏点.", RColor.red))
    else:
        label_name = ctx.get("label_name")

        label = u.get(label_name)

        if label is None:
            server.reply(
                info,
                RTextList(RText("没有 "), RText(label_name, RColor.yellow),
                          RText(" 收藏点")))
            return

        u.pop(label_name)

        player_save(info.player, u)

        server.reply(
            info,
            RTextList("地点: ",
                      RText(label_name, RColor.yellow, RStyle.strikethrough),
                      " 删除成功"))
        playsound(server, info.player)

    server.logger.debug(f"remove ctx -------------->\n{ctx}")
Пример #7
0
def teleport(src, ctx):
    server, info = __get(src)
    msg = [
        f"{'='*10} 当前没有收藏点, 快使用下面命令收藏一个吧。 {'='*10}",
        f"{CMD} add <收藏点名>",
    ]

    server.logger.debug(
        f"tp() 执行了。src --------->\n{src} ctx ------------>\n{ctx}")

    u = USERTP.get(info.player)
    if u is None:
        server.reply(info, "\n".join(msg))
    else:
        label_name = ctx.get("label_name")
        label = u.get(label_name)

        if label is None:
            server.reply(info, f"没有 {label_name} 收藏点")
        else:
            world = label["world"]
            x, y, z = label["x"], label["y"], label["z"]

            if check_level(server, info):
                server.rcon_query(
                    f"execute at {info.player} in {world} run teleport {info.player} {x} {y} {z}"
                )
                #playsound(server, info.player)
                server.rcon_query(
                    f"execute at {info.player} run playsound minecraft:item.chorus_fruit.teleport player {info.player}"
                )

        server.logger.debug(f"label_name: {label_name} 收藏点:  {label}")
Пример #8
0
def add(src, ctx):
    server, info = __get(src)

    # 查看玩家的等级够不够
    if not check_level(server, info):
        server.reply(info, RText(f"当前等级不足,至少需要1级。", RColor.red))
        return

    # 查询坐标
    rcon_result = server.rcon_query(f"data get entity {info.player} Pos")
    position = re.search(
        f"{info.player} has the following entity data: \[(-?[0-9\.]+)d, (-?[0-9.]+)d, (-?[0-9.]+)d\]",
        rcon_result)
    x, y, z = position.group(1), position.group(2), position.group(3)
    x, y, z = round(float(x)), round(float(y)), round(float(z))

    rcon_result = server.rcon_query(f"forceload add {x} {z}")
    load = re.match(
        f"Marked chunk \[(-?[0-9]+), (-?[0-9]+)\] in (.*) to be force loaded",
        rcon_result)

    if load is None:
        check = re.match("No chunks were marked for force loading",
                         rcon_result)
        server.logger.error(f"{rcon_result=}")

        if check is None:
            server.reply(info, RText(f"未知错误,请报告服主。", RColor.red))
            server.logger.error(f"{check=}")
        else:
            server.reply(info, RText(f"当前区块已经强制加载!(可能是其他人加载)", RColor.yellow))

    else:

        #
        world = load.group(3)

        label_name = ctx["label_name"]

        u = player_load(info.player)

        u[label_name] = {"world": world, "x": x, "y": y, "z": z}

        server.tell(
            info.player,
            RTextList("强制加载区块: ", RText(label_name, RColor.yellow), " 添加成功"))

        player_save(info.player, u)

        if len(u) > PLAYER_MAX_BLOCK:
            server.reply(
                info,
                RText(f"强制加载区块已到最大数: {PLAYER_MAX_BLOCK} 请删除后添加", RColor.red))
            return

    server.logger.debug(f"add ctx -------------->\n{ctx}")
Пример #9
0
def help_and_run(src):
    server, info = __get(src)

    line = [
        f"{'='*10} 使用方法 {'='*10}",
        "可使用背包里的:面包,鸡肉,牛肉,猪肉,自动回血3分钟或者没有食物为止。",
        f"{CMD}                      查看方法和使用(一次回复2心,4点血。)",
        f"{CMD} <百分比>              血量低于多少时开始回血(建议0.8,后面需要添加上时间限制)",
        f"{CMD} stop                 结束技能",
    ]

    server.reply(info, "\n".join(line))
Пример #10
0
def flow_cmd(src, ctx):
    server, info = __get(src)
    player2 = ctx.get("player")
    if info.player == player2:
        server.reply(info, RText(f"你不需要flow你自己", RColor.red))
    else:
        if PLAYERS.get(info.player):
            server.reply(info, RText(f"不用重复开flow功能", RColor.red))
        else:
            PLAYERS[info.player] = player2
            server.reply(info, RText(f"开始flow {player2}", RColor.yellow))
            flow_thread(server, info.player, player2)
Пример #11
0
def auto(src, ctx):
    server, info = __get(src)
    number = float(ctx.get("number"))

    global EXIT
    if EXIT is True:
        server.reply(info, f"自动回血技能已经发动,可以stop后重新发动。")
    else:
        EXIT = True
        if 0.01 <= number <= 0.99:
            add_health(server, info.player, number)
        else:
            server.reply(info, f"number的有效范围: 0.01<= number < 0.99")
Пример #12
0
def help(src):
    server, info = __get(src)

    msg = [
        f"{'='*10} 使用方法 {'='*10}",
        f"{CMD}                          查看使用方法",
        f"{CMD} list                     列出所有强制加载区块",
        f"{CMD} add <名字>                添加或修改当前位置的区块为强制加载区块",
        f"{CMD} remove <名字>             删除当前强制加载区块",
        f"{CMD} rename <旧名字> <新名字>   修改名字",
        f"{CMD} listall                  列出所有加载区块(管理员)",
    ]
    server.reply(info, "\n".join(msg))
Пример #13
0
def help_and_run(src):
    server, info = __get(src)

    line = [
        f"{'='*10} 说明 {'='*10}",
        f"1. ←↑→↓↖↗↘↙: 目标相对你的方向",
        f"2. ⤬: 目标你和不在同一维度",
        f"{'='*10} 使用方法 {'='*10}",
        f"{CMD}                    查看帮忙信息",
        f"{CMD} <玩家>              你想要跟随的玩家",
        f"{CMD}stop               停止flow",
    ]

    server.reply(info, "\n".join(line))
Пример #14
0
def help(src):
    server, info = __get(src)

    msg = [
        f"{'='*10} 使用说明 {'='*10}",
        f"",
        f"{'='*10} 使用方法 {'='*10}",
        f"{CMD}                    查看使用方法",
        f"{CMD} list               列出所有备份",
        f"{CMD} backup             手动触发创建备份",
        f"{CMD} backupmsg <备注>    手动触发创建备份, 添加注释",
        f"{CMD} rollback <序号>     恢复到指定备份",
    ]
    server.reply(info, "\n".join(msg))
Пример #15
0
def help(src):
    server, info = __get(src)

    msg = [
        f"{'='*10} 使用方法 {'='*10}",
        f"{CMD}                               查看使用方法",
        f"{CMD} <收藏点>                       tp 到收藏点",
        f"{CMD} list                          列出所有收藏点",
        f"{CMD} add <收藏点名字>                添加或修改当前位置为收藏点",
        f"{CMD} remove <收藏点名字>             删除收藏点",
        f"{CMD} rename <收藏点名字> <新名字>     修改收藏点名字",
        f"{CMD} invite <玩家>                  邀请玩家到你当前的位置",
        f"{CMD} accept <玩家>                  接收一个玩家对你的邀请(时效3分钟)",
    ]
    server.reply(info, "\n".join(msg))
Пример #16
0
def add(src, ctx):
    server, info = __get(src)

    # 查询世界
    rcon_result = server.rcon_query(f"data get entity {info.player} Dimension")

    if rcon_result is None:
        prompt = RText("rcon 没有开启, 请分别server.properties, MCDR/config.yml 开启。",
                       RColor.red)
        server.logger.warning(prompt)
        server.tell(info.player, RText(f"{CMD} 插件没有配置成功,请联系服主。", RColor.red))

    world = re.match(
        '{} has the following entity data: "(.*)"'.format(info.player),
        rcon_result).group(1)

    # 查询坐标
    rcon_result = server.rcon_query(f"data get entity {info.player} Pos")
    position = re.search(
        f"{info.player} has the following entity data: \[(-?[0-9\.]+)d, (-?[0-9.]+)d, (-?[0-9.]+)d\]",
        rcon_result)
    x, y, z = position.group(1), position.group(2), position.group(3)
    x, y, z = round(float(x), 1), round(float(y), 1), round(float(z), 1)

    u = USERTP.get(info.player)
    if u is None:
        u = {}
        USERTP[info.player] = u
    elif len(u) > PLAYER_MAX_POINT:
        server.reply(info,
                     RText(f"收藏点已到最大数: {PLAYER_MAX_POINT} 请删除后添加", RColor.red))
        return

    # 查看玩家的等级够不够
    if check_level(server, info):
        label_name = ctx["label_name"]

        u[label_name] = {"world": world, "x": x, "y": y, "z": z}

        server.tell(
            info.player,
            RTextList("地点: ", RText(label_name, RColor.yellow), " 收藏成功"))
        playsound(server, info.player)

        player_save(info.player, u)

    server.logger.debug(f"add ctx -------------->\n{ctx}")
Пример #17
0
def shopping(src, ctx):
    server, info = __get(src)
    number = int(ctx.get("number"))

    emerald_total = emerald(server, info.player)

    number_all, _ = divmod(emerald_total, UNIT_PRICE)

    if number > number_all:
        server.reply(info, RText(f"当前最多只能买{number_all}个", RColor.red))
    else:
        reduce_emerald = number * UNIT_PRICE
        server.rcon_query(
            f"execute at {info.player} run clear {info.player} minecraft:emerald {reduce_emerald}"
        )
        server.rcon_query(
            f"execute at {info.player} run give {info.player} minecraft:totem_of_undying {number}"
        )
Пример #18
0
def remove(src, ctx):
    server, info = __get(src)

    u = player_load(info.player)

    if u == {}:
        server.tell(info.player, RText(f"当前没有强制加载区块.", RColor.red))
    else:
        label_name = ctx.get("label_name")

        label = u.get(label_name)

        if label is None:
            server.reply(
                info,
                RTextList(RText("没有 "), RText(label_name, RColor.yellow),
                          RText("强制加载区块")))
            return

        position = u.pop(label_name)
        world = position["world"]
        x, z = position["x"], position["z"]

        #
        rcon_result = server.rcon_query(
            f"execute in {world} run forceload remove {x} {z}")
        unload = re.match(
            f"Unmarked chunk \[(-?[0-9]+), (-?[0-9]+)\] in (.*) for force loading",
            rcon_result)

        if unload is None:
            server.reply(info, RText(f"未知错误,请报告服主。", RColor.red))
            server.logger.error(f"{rcon_result=}")

        else:
            player_save(info.player, u)
            server.reply(
                info,
                RTextList(
                    "强制加载区块: ",
                    RText(label_name, RColor.yellow, RStyle.strikethrough),
                    " 删除成功"))

    server.logger.debug(f"remove ctx -------------->\n{ctx}")
Пример #19
0
def rename(src, ctx):
    server, info = __get(src)

    u = player_load(info.player)

    if u == {}:
        server.tell(info.player, RText(f"当前没有强制加载区块.", RColor.red))
    else:
        label_name = ctx["label_name"]
        label = u.get(label_name)

        if label is None:
            server.reply(info, RText(f"没有 {label_name} 强制加载区块", RColor.red))
        else:
            if check_level(server, info):
                v = u.pop(label_name)
                u[ctx["label_name2"]] = v
                player_save(info.player, u)
                server.reply(info, RText("修改名称成功", RColor.green))

    server.logger.debug(f"rename ctx -------------->\n{ctx}")
Пример #20
0
def help_and_run(src):
    server, info = __get(src)

    line1 = f"{'='*10} 使用方法 {'='*10}"
    line2 = f"{CMD}                      查看方法和使用"
    line3 = f"{CMD} <number>             购买number个不死图腾(7绿宝石/个)"
    line4 = RText(f"{CMD} all                   使用背包全部的绿宝石购买", RColor.yellow)

    total = emerald(server, info.player)

    number_all, _ = divmod(total, UNIT_PRICE)

    line4.set_hover_text(
        RTextList("当前能购买:", RText(f"{number_all}", RColor.green), "/个"))
    if number_all > 0:
        line4.set_click_event(RAction.run_command, f"{CMD} {number_all}")
    else:
        server.reply(info, RText("你当前背包绿宝石不够", RColor.red))

    server.reply(info, "\n".join([line1, line2, line3]))
    server.reply(info, RTextList(line4))
Пример #21
0
def rename(src, ctx):
    server, info = __get(src)

    if USERTP.get(info.player) is None:
        server.tell(info.player, RText(f"当前没有收藏点.", RColor.red))
    else:
        u = USERTP.get(info.player)

        label_name = ctx["label_name"]
        label = u.get(label_name)

        if label is None:
            server.reply(info, RText(f"没有 {label_name} 收藏点", RColor.red))
        else:
            if check_level(server, info):
                v = u.pop(label_name)
                u[ctx["label_name2"]] = v
                player_save(info.player, u)
                playsound(server, info.player)
                server.reply(info, RText("修改名称成功", RColor.green))

    server.logger.debug(f"rename ctx -------------->\n{ctx}")
Пример #22
0
def ls(src, ctx):
    server, info = __get(src)

    u = USERTP.get(info.player)

    msg = [
        f"{'='*10} 当前没有收藏点, 快使用下面命令收藏一个吧。 {'='*10}",
        f"{CMD} add <收藏点名>",
    ]

    if u is None:
        server.reply(info, "\n".join(msg))
    else:
        msg1 = [RText(f"{'='*10} 收藏点 {'='*10}\n", RColor.white)]
        msg2 = []
        for label_name, data in u.items():
            msg2.append(
                click_text(info.player, label_name, data["world"], data["x"],
                           data["y"], data["z"]))

        msg = msg1 + fmt(msg2)
        server.reply(info, RTextList(*msg))

    server.logger.debug(f"list ctx -------------->\n{ctx}")
Пример #23
0
def ls(src, ctx):
    server, info = __get(src)

    u = player_load(info.player)

    msg = [
        f"{'='*10} 当前没有强制加载区块, 快使用下面命令添加一个吧。 {'='*10}",
        f"{CMD} add <名字>",
    ]

    if u == {}:
        server.reply(info, "\n".join(msg))
    else:
        msg1 = [RText(f"{'='*10} 强制加载区块 {'='*10}\n", RColor.white)]
        msg2 = []
        for label_name, data in u.items():
            msg2.append(
                click_text(info.player, label_name, data["world"], data["x"],
                           data["y"], data["z"]))

        msg = msg1 + fmt(msg2)
        server.reply(info, RTextList(*msg))

    server.logger.debug(f"list ctx -------------->\n{ctx}")
Пример #24
0
def listall(src, ctx):
    server, info = __get(src)
    result = server.rcon_query(f"execute at {info.player} run forceload query")
    server.reply(info, result)
Пример #25
0
def welcome_cmd(src, ctx):
    server, info = __get(src)
    welcome(server, info.player)
Пример #26
0
def soul(src, ctx):
    server, info = __get(src)

    if not condition(server, info):
        return

    # 查询游戏模式
    rcon_result = server.rcon_query(
        f"data get entity {info.player} playerGameType")

    if rcon_result is None:
        prompt = "rcon 没有开启, 请分别server.properties, MCDR/config.yml 开启。"
        server.logger.warning(prompt)
        server.reply(info, RText(f"{CMD} 插件没有配置成功,请联系服主。", RColor.red))

        return

    gamemode = re.match(
        f"{info.player} has the following entity data: ([0-9]+)",
        rcon_result).group(1)

    # "Survival" == "0"
    # "Creative" == "1"
    # "Adventure" == "2"
    # "Spectator" == "3"
    if gamemode == "0":

        # 查询等级
        result = server.rcon_query(f"experience query {info.player} levels")
        level = int(
            re.search(f"{info.player} has ([0-9]+) experience levels",
                      result).group(1))
        if level < 1:
            server.reply(info, RText("经验不足,至少需要1级", RColor.red))
            return

        # 查询世界
        rcon_result = server.rcon_query(
            f"data get entity {info.player} Dimension")

        world = re.match(
            '{} has the following entity data: "(.*)"'.format(info.player),
            rcon_result).group(1)

        # 查询坐标
        rcon_result = server.rcon_query(f"data get entity {info.player} Pos")
        position = re.search(
            f"{info.player} has the following entity data: \[(-?[0-9\.]+)d, (-?[0-9.]+)d, (-?[0-9.]+)d\]",
            rcon_result)
        x, y, z = position.group(1), position.group(2), position.group(3)

        #x, y, z = round(float(x), 1), round(float(y), 1), round(float(z), 1)
        # 向上加0.5格,修复返回原地时,可能从不完整方块下落。
        x, y, z = round(float(x),
                        1), round(float(y), 1) + 0.3, round(float(z), 1)

        set_soul_info(info.player, {
            "timestamp": timestamp(),
            "world": world,
            "x": x,
            "y": y,
            "z": z
        })

        # 扣掉1级
        server.rcon_query(f"experience add {info.player} -1 levels")

        server.rcon_query(
            f"execute at {info.player} run gamemode spectator {info.player}")
        server.rcon_query(
            f"execute at {info.player} run effect give {info.player} minecraft:night_vision {SOUL_TIME} 0 true"
        )
        server.rcon_query(
            f"execute at {info.player} run playsound minecraft:entity.player.levelup player {info.player}"
        )

        server.reply(info, RText("注意!3分钟后会回到你的身体!(输入指令可提前返回)", RColor.yellow))
        timing(server, info.player)

    elif gamemode == "3":
        player_soul = get_soul_info(info.player)
        if player_soul:
            world = player_soul["world"]
            x = player_soul["x"]
            y = player_soul["y"]
            z = player_soul["z"]

            server.rcon_query(
                f"execute at {info.player} in {world} run teleport {info.player} {x} {y} {z}"
            )
            server.rcon_query(
                f"execute at {info.player} run effect clear {info.player} minecraft:night_vision"
            )
            server.rcon_query(
                f"execute at {info.player} run gamemode survival {info.player}"
            )

        else:
            server.reply(info, RText("出了点问题,请联系管理员。", RColor.red))
            server.logger.warning(f"玩家 {info.player} 被卡在灵魂模式了。。。")

    else:
        return
Пример #27
0
def store_30(src, ctx):
    server, info = __get(src)
    number = int(ctx.get("number"))
    server.rcon_query(f"{cmdprefix} {number}")
Пример #28
0
def shopping_all(src, ctx):
    server, info = __get(src)
    number = int(ctx.get("number"))
    server.rcon_query(f"{CMD} {number}")
Пример #29
0
def stop(src, ctx):
    server, info = __get(src)
    global EXIT
    EXIT = False
    server.reply(info, f"自动回血技能结束。")