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))
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}" )
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), " 不在线"))
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), " 不在线"))
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))
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}")
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}")
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}")
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))
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)
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")
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))
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))
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))
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))
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}")
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}" )
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}")
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}")
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))
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}")
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}")
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}")
def listall(src, ctx): server, info = __get(src) result = server.rcon_query(f"execute at {info.player} run forceload query") server.reply(info, result)
def welcome_cmd(src, ctx): server, info = __get(src) welcome(server, info.player)
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
def store_30(src, ctx): server, info = __get(src) number = int(ctx.get("number")) server.rcon_query(f"{cmdprefix} {number}")
def shopping_all(src, ctx): server, info = __get(src) number = int(ctx.get("number")) server.rcon_query(f"{CMD} {number}")
def stop(src, ctx): server, info = __get(src) global EXIT EXIT = False server.reply(info, f"自动回血技能结束。")