├── .deepsource.toml ├── .github ├── ISSUE_TEMPLATE │ ├── bug-提交.md │ └── 功能建议.md └── workflows │ └── generate_directory_json.yml ├── .gitignore ├── 00榛缈插件性能分析 ├── __init__.py └── datas.json ├── 32k盒子显示 ├── __init__.py └── datas.json ├── @玩家 ├── __init__.py └── datas.json ├── LICENSE ├── MCFunction计划任务 ├── __init__.py ├── datas.json └── examples │ ├── 示例-定时任务.mcfunction │ ├── 示例-系统启动.mcfunction │ └── 示例-触发词.mcfunction ├── MySQL连接器 ├── __init__.py └── datas.json ├── README.md ├── ZBasic_Lang_中文编程 ├── __init__.py ├── basic_codes.py ├── basic_types.py ├── compiler.py ├── datas.json ├── err_str.py ├── executor.py ├── readme.txt ├── syntax_compile.py ├── syntax_lib.py ├── type_checker.py └── 示例代码 │ ├── 玩家转账 │ └── 玩家发言.txt │ └── 进服欢迎 │ ├── 玩家进入.txt │ └── 玩家退出.txt ├── [pkg]新手插件包 ├── datas.json └── 插件配置文件 │ ├── 聊天栏菜单.json │ └── 自定义聊天栏菜单.json ├── [pkg]防挂插件包 └── datas.json ├── [pkg]音乐杂合包 ├── datas.json └── 插件数据文件 │ ├── 点歌台 │ └── 音乐列表 │ │ ├── Pvz水池.midseq │ │ ├── Tokyovania墨水.midseq │ │ ├── Undertale.midseq │ │ ├── see you again.midseq │ │ ├── 三重审判.midseq │ │ ├── 下坠Falling.midseq │ │ ├── 世界末日(ARMAGEDN).midseq │ │ ├── 世界末日(Il mondo).midseq │ │ ├── 以父之名.midseq │ │ ├── 你干吗嗨嗨呦.midseq │ │ ├── 你瞒我瞒.midseq │ │ ├── 僵王博士.midseq │ │ ├── 兰亭序.midseq │ │ ├── 决心鱼.midseq │ │ ├── 千本樱.midseq │ │ ├── 卡农.midseq │ │ ├── 原神大厅音乐.midseq │ │ ├── 名侦探柯南.midseq │ │ ├── 哆啦A梦.midseq │ │ ├── 坏苹果.midseq │ │ ├── 天空之城.midseq │ │ ├── 子弹地狱.midseq │ │ ├── 宝贝别哭.midseq │ │ ├── 小埋单轨.midseq │ │ ├── 彩虹猫.midseq │ │ ├── 怪物-原神.midseq │ │ ├── 恋爱循环.midseq │ │ ├── 我的世界.midseq │ │ ├── 我落泪情绪零碎.midseq │ │ ├── 新闻联播.midseq │ │ ├── 新鸳鸯蝴蝶梦.midseq │ │ ├── 旋转鸡块.midseq │ │ ├── 星茶会.midseq │ │ ├── 春节序曲.midseq │ │ ├── 极乐净土.midseq │ │ ├── 某科学的超电磁炮.midseq │ │ ├── 桃源恋歌.midseq │ │ ├── 浪人琵琶.midseq │ │ ├── 海阔天空.midseq │ │ ├── 灌篮高手.midseq │ │ ├── 爬行者.midseq │ │ ├── 爱情故事.midseq │ │ ├── 狂妄之人.midseq │ │ ├── 玄武国.midseq │ │ ├── 甩葱歌.midseq │ │ ├── 百年孤寂.midseq │ │ ├── 稻香.midseq │ │ ├── 空白.midseq │ │ ├── 突然好想你.midseq │ │ ├── 苏公提.midseq │ │ ├── 苹果香.midseq │ │ ├── 蒲公英的约定.midseq │ │ ├── 蜡笔小新.midseq │ │ ├── 解开.midseq │ │ ├── 诀别书.midseq │ │ ├── 转身即心痛.midseq │ │ ├── 退后.midseq │ │ ├── 银行不妙曲.midseq │ │ ├── 雪花竞技场[请不要外传].schem │ │ ├── 雷欧奥特曼.midseq │ │ ├── 鱼宴Plus.midseq │ │ ├── 鸟之诗.midseq │ │ └── 默哀.midseq │ └── 音乐播放器 │ ├── Pvz水池.midseq │ ├── Tokyovania墨水.midseq │ ├── Undertale.midseq │ ├── see you again.midseq │ ├── 三重审判.midseq │ ├── 下坠Falling.midseq │ ├── 世界末日(ARMAGEDN).midseq │ ├── 世界末日(Il mondo).midseq │ ├── 以父之名.midseq │ ├── 你干吗嗨嗨呦.midseq │ ├── 你瞒我瞒.midseq │ ├── 僵王博士.midseq │ ├── 兰亭序.midseq │ ├── 决心鱼.midseq │ ├── 千本樱.midseq │ ├── 卡农.midseq │ ├── 原神大厅音乐.midseq │ ├── 名侦探柯南.midseq │ ├── 哆啦A梦.midseq │ ├── 坏苹果.midseq │ ├── 天空之城.midseq │ ├── 子弹地狱.midseq │ ├── 宝贝别哭.midseq │ ├── 小埋单轨.midseq │ ├── 彩虹猫.midseq │ ├── 怪物-原神.midseq │ ├── 恋爱循环.midseq │ ├── 我的世界.midseq │ ├── 我落泪情绪零碎.midseq │ ├── 新闻联播.midseq │ ├── 新鸳鸯蝴蝶梦.midseq │ ├── 旋转鸡块.midseq │ ├── 星茶会.midseq │ ├── 春节序曲.midseq │ ├── 极乐净土.midseq │ ├── 某科学的超电磁炮.midseq │ ├── 桃源恋歌.midseq │ ├── 浪人琵琶.midseq │ ├── 海阔天空.midseq │ ├── 灌篮高手.midseq │ ├── 爬行者.midseq │ ├── 爱情故事.midseq │ ├── 狂妄之人.midseq │ ├── 玄武国.midseq │ ├── 甩葱歌.midseq │ ├── 百年孤寂.midseq │ ├── 稻香.midseq │ ├── 空白.midseq │ ├── 突然好想你.midseq │ ├── 苏公提.midseq │ ├── 苹果香.midseq │ ├── 蒲公英的约定.midseq │ ├── 蜡笔小新.midseq │ ├── 解开.midseq │ ├── 诀别书.midseq │ ├── 转身即心痛.midseq │ ├── 退后.midseq │ ├── 银行不妙曲.midseq │ ├── 雪花竞技场[请不要外传].schem │ ├── 雷欧奥特曼.midseq │ ├── 鱼宴Plus.midseq │ ├── 鸟之诗.midseq │ └── 默哀.midseq ├── _workflow.py ├── admin命令 ├── __init__.py └── datas.json ├── ai聊天 ├── __init__.py └── datas.json ├── bdx导入器Pro ├── __init__.py ├── bdx_operation.py ├── datas.json ├── lib.py ├── libbdxbuilder_linux_amd64.so └── thisutils.py ├── bdx导出器 ├── __init__.py ├── bdx_utils │ ├── construct_file.py │ ├── structs.py │ └── writer.py ├── datas.json ├── progress_bar.py ├── scanner.py ├── state_dump.py ├── struct_loader.py └── utils.py ├── bdx导出器Pro-急眼版 ├── __init__.py ├── bdx_utils.py ├── datas.json ├── lib.py ├── libbdxexporter.so └── scanner.py ├── demo-商店系统 ├── __init__.py └── datas.json ├── desperated_plugins ├── 性能管理 │ ├── __init__.py │ └── datas.json └── 睡觉统计 │ ├── __init__.py │ └── datas.json ├── directory.json ├── directory_tree.json ├── latest_versions.json ├── market_tree.json ├── pip模块支持 ├── __init__.py └── datas.json ├── plugin_ids_map.json ├── 『Orion System』违规与作弊行为综合反制系统 ├── README.md ├── __init__.py ├── ban_system.py ├── ban_utils.py ├── config.py ├── core.py └── datas.json ├── 世界の记忆 ├── __init__.py ├── datas.json └── readme.txt ├── 世界备份 ├── __init__.py └── datas.json ├── 世界备份v2 ├── __init__.py ├── datas.json ├── define.py ├── on_chat.py ├── readme.txt ├── recover.py ├── recover_tool_name.py └── world_backup.py ├── 举报系统 ├── Readme.md ├── __init__.py └── datas.json ├── 云计分板API ├── __init__.py ├── datas.json └── 云计分板API.md ├── 五子棋小游戏 ├── __init__.py └── datas.json ├── 井字棋 ├── __init__.py └── datas.json ├── 任务系统 ├── __init__.py ├── datas.json └── readme.txt ├── 传送点设置 ├── __init__.py └── datas.json ├── 信任玩家互传 ├── __init__.py └── datas.json ├── 兑换码 ├── __init__.py ├── datas.json └── file.py ├── 兑换码系统 ├── __init__.py └── datas.json ├── 入服欢迎 ├── __init__.py └── datas.json ├── 全服喇叭 ├── __init__.py └── datas.json ├── 公告栏[Mono] ├── __init__.py ├── datas.json └── pytz │ ├── __init__.py │ ├── exceptions.py │ ├── lazy.py │ ├── reference.py │ ├── tzfile.py │ ├── tzinfo.py │ └── zoneinfo │ └── Asia │ └── Shanghai ├── 前置_Cb2Bot通信 ├── __init__.py ├── datas.json └── readme.txt ├── 前置_MIDI播放器 ├── Musicreater │ ├── __init__.py │ ├── constants.py │ ├── exceptions.py │ ├── main.py │ ├── subclass.py │ ├── types.py │ └── utils.py ├── __init__.py ├── datas.json └── mido │ ├── __init__.py │ ├── frozen.py │ ├── messages │ ├── __init__.py │ ├── checks.py │ ├── decode.py │ ├── encode.py │ ├── messages.py │ ├── specs.py │ └── strings.py │ ├── midifiles │ ├── __init__.py │ ├── meta.py │ ├── midifiles.py │ ├── tracks.py │ └── units.py │ ├── parser.py │ ├── ports.py │ ├── syx.py │ └── tokenizer.py ├── 前置_ToolDeltaFlet ├── __init__.py ├── app.py ├── datas.json ├── forwarder.py └── lib │ ├── colorsys.py │ ├── configparser.py │ └── logging │ ├── __init__.py │ ├── config.py │ └── handlers.py ├── 前置_tps计算器 ├── __init__.py └── datas.json ├── 前置_世界交互 ├── __init__.py └── datas.json ├── 前置_主动区块请求 ├── __init__.py ├── api.py ├── datas.json ├── define.py ├── requet_queue.py └── sub_chunk_process.py ├── 前置_基本插件功能库 ├── __init__.py └── datas.json ├── 前置_大字替换 ├── __init__.py └── datas.json ├── 前置_循环获取玩家坐标 ├── __init__.py └── datas.json ├── 前置_玩家XUID获取 ├── __init__.py └── datas.json ├── 前置_统一消息风格 ├── __init__.py └── datas.json ├── 前置_聊天栏菜单 ├── __init__.py ├── config_getter.py ├── datas.json └── 使用方法.md ├── 区块显示器 ├── __init__.py └── datas.json ├── 单方块空岛系统 ├── __init__.py ├── data_operation.py ├── datas.json └── player_exchange.py ├── 发言频率限制 ├── __init__.py └── datas.json ├── 发言频率限制v2 ├── __init__.py └── datas.json ├── 可升级云仓库 ├── __init__.py ├── data.json ├── datas.json └── readme.txt ├── 命令发送监视器 ├── __init__.py └── datas.json ├── 命令方块代发言支持 ├── __init__.py └── datas.json ├── 商店系统 ├── __init__.py ├── datas.json └── 配置.json ├── 基础聊天栏菜单 ├── Readme.md ├── __init__.py ├── datas.json └── kimi.py ├── 多功能玩家互传 ├── __init__.py └── datas.json ├── 多服聊天互通 ├── README.txt ├── __init__.py └── datas.json ├── 大范围fill ├── __init__.py └── datas.json ├── 头衔系统 ├── __init__.py └── datas.json ├── 定时任务 ├── __init__.py ├── datas.json ├── readme.txt └── 示例定时任务 │ └── 扫地姬.mcfunction ├── 宠物背包清理 ├── __init__.py └── datas.json ├── 封禁系统 ├── __init__.py └── datas.json ├── 巡逻 ├── __init__.py └── datas.json ├── 循环替换拒绝方块 ├── __init__.py └── datas.json ├── 指令调试器 ├── __init__.py └── datas.json ├── 控制台一键更新插件 ├── __init__.py └── datas.json ├── 控制台执行MC指令 ├── __init__.py └── datas.json ├── 插件接口获取修复 ├── __init__.py └── datas.json ├── 时间同步计分板 ├── __init__.py └── datas.json ├── 暴击检测 ├── __init__.py └── datas.json ├── 更好的公告栏 ├── __init__.py └── datas.json ├── 更好的钓鱼 ├── __init__.py ├── data_operation.py ├── datas.json ├── readme.txt └── 属性.json ├── 服服互通 ├── __init__.py └── datas.json ├── 木桶玩家商店-试验版 ├── __init__.py ├── datas.json └── shop_lib.py ├── 机器人发言 ├── __init__.py └── datas.json ├── 权限管理 ├── __init__.py └── datas.json ├── 死亡点返回 ├── __init__.py └── datas.json ├── 活塞限速 ├── __init__.py └── datas.json ├── 清空全部玩家末影箱 ├── __init__.py └── datas.json ├── 游戏内显示插件报错 ├── __init__.py └── datas.json ├── 点歌台 ├── GetFile.py ├── __init__.py └── datas.json ├── 物品制作器 ├── __init__.py ├── datas.json └── readme.txt ├── 猫七街云黑封禁 ├── __init__.py ├── datas.json └── server │ ├── server.py │ └── 官方云黑列表 │ └── blacklist.json ├── 猫七街玩家互传 ├── __init__.py └── datas.json ├── 玩家交易所 ├── __init__.py ├── data_operation.py └── datas.json ├── 玩家人数限制 ├── __init__.py └── datas.json ├── 玩家数据管理 ├── __init__.py └── datas.json ├── 玩家记录 ├── __init__.py └── datas.json ├── 玩家转账 ├── __init__.py └── datas.json ├── 番茄小说 ├── TomatoNovelAPI.py ├── __init__.py └── datas.json ├── 白名单&管理员检测 ├── __init__.py └── datas.json ├── 空岛分配 ├── __init__.py └── datas.json ├── 空岛系统 ├── __init__.py ├── datas.json └── readme.txt ├── 等级检测 ├── __init__.py └── datas.json ├── 签到系统 ├── __init__.py └── datas.json ├── 简单世界导入 ├── __init__.py ├── datas.json └── readme.txt ├── 简单世界恢复 ├── __init__.py ├── datas.json └── readme.txt ├── 简易建造-Pro ├── __init__.py ├── datas.json └── readme.txt ├── 简易建造 ├── __init__.py ├── datas.json └── readme.txt ├── 类式插件创建器 ├── __init__.py └── datas.json ├── 系统上线提示[Mono] ├── __init__.py └── datas.json ├── 群服互通云链版 ├── __init__.py ├── datas.json └── websocket │ ├── __init__.py │ ├── _abnf.py │ ├── _app.py │ ├── _cookiejar.py │ ├── _core.py │ ├── _exceptions.py │ ├── _handshake.py │ ├── _http.py │ ├── _logging.py │ ├── _socket.py │ ├── _ssl_compat.py │ ├── _url.py │ ├── _utils.py │ ├── _wsdump.py │ ├── py.typed │ └── tests │ ├── __init__.py │ ├── data │ ├── header01.txt │ ├── header02.txt │ └── header03.txt │ ├── echo-server.py │ ├── test_abnf.py │ ├── test_app.py │ ├── test_cookiejar.py │ ├── test_http.py │ ├── test_url.py │ └── test_websocket.py ├── 聊天历史记录 ├── __init__.py └── datas.json ├── 自定义聊天栏菜单 ├── __init__.py └── datas.json ├── 获取全服玩家皮肤 ├── __init__.py └── datas.json ├── 计分板支持 └── __init__.py ├── 计分板重置 ├── __init__.py ├── data_operation.py └── datas.json ├── 设置栏钢琴师 ├── __init__.py ├── datas.json └── readme.txt ├── 超频刷屏反制 ├── __init__.py └── datas.json ├── 进服一言 ├── __init__.py └── datas.json ├── 进服验证 ├── __init__.py └── datas.json ├── 违规名称踢出 ├── __init__.py ├── datas.json └── 词库.json ├── 重启 ├── __init__.py └── datas.json ├── 雪球菜单 ├── __init__.py └── datas.json ├── 音乐播放器 ├── __init__.py ├── datas.json └── readme.txt └── 音效播放器 ├── __init__.py ├── datas.json └── readme.txt /.deepsource.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | [[analyzers]] 4 | name = "python" 5 | 6 | [analyzers.meta] 7 | runtime_version = "3.x.x" -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-提交.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug 提交 3 | about: 提交关于插件功能的 bug。 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **产生 Bug 的插件的插件名** 11 | 12 | 13 | **Bug 描述** 14 | 15 | 16 | **报错截图(如果产生了报错)** 17 | 18 | 19 | **改进建议(可选)** 20 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/功能建议.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 功能建议 3 | about: 对于插件功能的建议。 4 | title: '' 5 | labels: 功能 6 | assignees: '' 7 | 8 | --- 9 | 10 | **为哪个插件提供建议?** 11 | 12 | 13 | **你希望有/升级哪些功能?** 14 | 15 | 16 | **你对该功能的思路(可选)** 17 | -------------------------------------------------------------------------------- /.github/workflows/generate_directory_json.yml: -------------------------------------------------------------------------------- 1 | name: Generate Directory JSON 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | workflow_dispatch: {} 7 | 8 | jobs: 9 | generate_json: 10 | runs-on: ubuntu-latest 11 | strategy: 12 | matrix: 13 | os: [ubuntu-latest] 14 | python-version: ["3.12"] 15 | steps: 16 | - name: Checkout Code 17 | uses: actions/checkout@v4 18 | 19 | - name: Setup Python 20 | uses: actions/setup-python@v5 21 | with: 22 | python-version: "3.12" # 你想要使用的 Python 版本 23 | 24 | - name: Generate JSON 25 | run: python _workflow.py 26 | 27 | - name: Submit Changes 28 | uses: EndBug/add-and-commit@v9 29 | with: 30 | default_author: github_actions 31 | message: "[AUTO] Generate Directory JSON" 32 | add: '*' 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # neccessary ignore 2 | __pycache__ 3 | .vscode 4 | 5 | # pylints 6 | .pylintrc 7 | pyproject.toml -------------------------------------------------------------------------------- /00榛缈插件性能分析/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Hazelmeow", 3 | "version": "0.1.1", 4 | "plugin-type": "classic", 5 | "description": "在控制台显示插件执行时间 (发送 'perf start' 开始分析)", 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.3.6" 8 | }, 9 | "plugin-id": "榛缈插件性能分析", 10 | "enabled": true 11 | } -------------------------------------------------------------------------------- /32k盒子显示/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.5", 4 | "description": "自动对任何放置在服内的32k盒子进行反制和保存", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.1.13", 8 | "封禁系统": "0.0.1", 9 | "基本插件功能库": "0.0.1" 10 | }, 11 | "plugin-type": "classic", 12 | "plugin-id": "32k盒子显示" 13 | } -------------------------------------------------------------------------------- /@玩家/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Plugin, Chat, ToolDelta, plugin_entry 2 | 3 | display = "§a§l@提醒 §7>>> §r" 4 | 5 | 6 | def find_mentions(text, player_list): 7 | return [player for player in player_list if f"@{player}" in text] 8 | 9 | 10 | class AtPlayer(Plugin): 11 | name = "@玩家" 12 | author = "wling" 13 | version = (0, 0, 5) 14 | description = "当有人提及你时,会收到提醒" 15 | 16 | def __init__(self, frame: ToolDelta): 17 | super().__init__(frame) 18 | self.ListenChat(self.on_chat) 19 | 20 | def on_chat(self, chat: Chat): 21 | message = chat.msg 22 | playername = chat.player.name 23 | # 如果文字包含@ 24 | if "@" in message: 25 | mentioned_players = find_mentions(message, self.game_ctrl.allplayers) 26 | for i in mentioned_players: 27 | self.game_ctrl.say_to(i, display + "§l§a有人提及了你!") 28 | self.game_ctrl.player_title(i, "§b§l有人提及了你") 29 | self.game_ctrl.player_subtitle(i, f"§7{playername} > §e§l{message}") 30 | self.game_ctrl.sendcmd( 31 | r"""/execute """ 32 | + i 33 | + """ ~ ~ ~ playsound block.bell.hit @s ~ ~ ~ 1 1 1""" 34 | ) 35 | 36 | 37 | entry = plugin_entry(AtPlayer) 38 | -------------------------------------------------------------------------------- /@玩家/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "wling", 3 | "version": "0.0.5", 4 | "description": "让@更有效果!", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "@玩家" 9 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2024, ToolDelta 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, 12 | this list of conditions and the following disclaimer in the documentation 13 | and/or other materials provided with the distribution. 14 | 15 | 3. Neither the name of the copyright holder nor the names of its 16 | contributors may be used to endorse or promote products derived from 17 | this software without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 23 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 25 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 26 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 | -------------------------------------------------------------------------------- /MCFunction计划任务/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "用计划任务执行mcfunction中的指令!支持传参", 6 | "pre-plugins": {}, 7 | "plugin-id": "mcfunction-tasks" 8 | } -------------------------------------------------------------------------------- /MCFunction计划任务/examples/示例-定时任务.mcfunction: -------------------------------------------------------------------------------- 1 | # 事件: 定时执行 2 | # 间隔: 300 3 | -------------------------------------------------------------------------------- /MCFunction计划任务/examples/示例-系统启动.mcfunction: -------------------------------------------------------------------------------- 1 | # 事件:系统启动 2 | tellraw @a {{"rawtext":[{"text": "§7[§a!§7] §aToolDelta已启动"}]}} -------------------------------------------------------------------------------- /MCFunction计划任务/examples/示例-触发词.mcfunction: -------------------------------------------------------------------------------- 1 | # 事件: 触发词 2 | # 触发词: 蔡徐坤 3 | execute as [玩家名] at @s run playsound mob.chicken.hurt @s 4 | tellraw [玩家名] {"rawtext":[{"text": "§f不许鸡叫!"}]} -------------------------------------------------------------------------------- /MySQL连接器/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "小虫虫", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "作为前置插件支持连接到一个MySQL服务器存取数据, 也可以通过 Tool 控制台访问数据库服务器. ", 6 | "pre-plugins": { 7 | "pip":"0.0.1" 8 | }, 9 | "plugin-id": "MySQL", 10 | "enabled": true 11 | } -------------------------------------------------------------------------------- /ZBasic_Lang_中文编程/basic_codes.py: -------------------------------------------------------------------------------- 1 | from typing import Any 2 | from basic_types import REGISTER 3 | 4 | 5 | class OPs: 6 | END = 1 7 | SET = 2 8 | ENDIF = 5 9 | ENDLOOP = 7 10 | PRINT = 8 11 | EXECMD = 9 12 | SAYTO = 10 13 | IGNORE_NULL = 11 14 | SLEEP = 12 15 | 16 | 17 | class CodeUnit: 18 | # 代码单元 19 | def __init__(self, cid: int, *args): 20 | self.id = cid 21 | self.args = args 22 | 23 | 24 | class CustomCodeUnit(CodeUnit): 25 | def __init__(self, *args): 26 | super().__init__(-1, *args) 27 | 28 | 29 | class CompiledCode: 30 | # 代码块 31 | def __init__(self, code_seq: list[CodeUnit], out_namespace: REGISTER | None = None, at_line: int = -1): 32 | self.out_namespace = out_namespace or {} 33 | self.code_seq = code_seq 34 | self.cache1: Any = None 35 | self.cache2: Any = None 36 | self.cache3: Any = None 37 | self.at_ln = at_line 38 | 39 | def add_code(self, op: CodeUnit): 40 | self.code_seq.append(op) 41 | 42 | def add_namespace(self, ns: REGISTER): 43 | self.out_namespace.update(ns) 44 | 45 | def clear_cache(self): 46 | self.cache1 = self.cache2 = self.cache3 = None 47 | 48 | def __repr__(self): 49 | return f"" 50 | 51 | 52 | class CodeSyntaxError(SyntaxError): 53 | def __init__(self, msg: str) -> None: 54 | super().__init__(msg) 55 | self.msg = msg 56 | 57 | def __repr__(self): 58 | return self.msg 59 | -------------------------------------------------------------------------------- /ZBasic_Lang_中文编程/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.1.1", 4 | "plugin-type": "classic", 5 | "description": "使用中文进行ToolDelta插件的编写! 教程请查看 ToolDelta Wiki (https:\/\/td-wiki.dqyt.online\/)", 6 | "pre-plugins": {}, 7 | "plugin-id": "TD-ZBasic", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /ZBasic_Lang_中文编程/err_str.py: -------------------------------------------------------------------------------- 1 | USE_COMMA_OUTSIDE_FUNC = "在非函数给参时使用了逗号: \"%s\", 是否应为分号?" 2 | USE_COMMA_OUTSIDE_FUNC_AT_END = "在非函数给参时使用了逗号(在表达式结尾)" 3 | NOT_OP_BEFORE_COMMA = "括号前只能为运算符或函数, 而不是 %s" 4 | BRACKET_NOT_CLOSED = "括号未正确闭合" 5 | BRACKET_CANT_BE_EMPTY = "括号内容不能为空" 6 | NOT_SYNTAX_BRFORE_BRACKET = "逗号分隔符前需要表达式" 7 | OP_NOT_VALID = "运算符不正确: %s" 8 | FUNC_ARGS_NOT_FUNC = "在为函数提供参数时若想在参数表达式内使用函数, 请使用括号将函数调用的部分括起来" 9 | NEGATIVE_NOT_SUPPORTED = "暂不支持直接在数值前加正负号; 请在正负号前加一个0, 如 0-1" 10 | 11 | MULTI_OP_STRING = "存在多重连在一起的运算符" 12 | MULTI_ARGS_WITHOUT_OP = "两个项之间需要运算符" 13 | END_WITH_OP = "不能以运算符作为表达式结尾" 14 | 15 | OP_NOT_SUPPORTED = "不支持这么运算: %s %s %s " 16 | FUNC_ARGS_LEN_WRONG = "函数 %s 传入的参数长度不正确, 传入了 %d 个" 17 | FUNC_ARGS_TYPE_INVALID = "函数 %s 传入的参数类型不正确: (%s), 需要 (%s)" 18 | UNKNOWN_TYPE = "无法将 %s 识别为特定类型" 19 | UNKNOWN_OP = "未知的运算符: %s" 20 | -------------------------------------------------------------------------------- /ZBasic_Lang_中文编程/readme.txt: -------------------------------------------------------------------------------- 1 | 教程可前往 ToolDelta Wiki 查看 2 | 0.0.3版本修复: 正负号前缀无法正常识别 -------------------------------------------------------------------------------- /ZBasic_Lang_中文编程/示例代码/玩家转账/玩家发言.txt: -------------------------------------------------------------------------------- 1 | @导入变量 玩家名 字符串 2 | @导入变量 消息 字符串 3 | 4 | # 触发命令是:转账 <玩家名> <钱数> 5 | # /w @s 转账 FSkyBlueBot 1 6 | 7 | # 检测触发词 8 | 如果 以字符串开头 消息, "转账" 那么 9 | # 切割消息,获取参数 10 | 设置 触发词参数 为 切割字符串 消息, " " 11 | 如果 列表长度 触发词参数 = 3 那么 12 | 设置 转账目标 为 转换为非空变量 (获取列表项 触发词参数, 1) 13 | 如果 非 (玩家在线 转账目标) 那么 14 | 聊天栏显示 玩家名; "§c目标不在线" 15 | 结束 16 | 结束如果 17 | 设置 转账钱数 为 转换为非空变量 (转换为整数 (转换为非空变量 (获取列表项 触发词参数, 2), "-1")), -1 18 | 如果 转账钱数 < 0 那么 19 | 聊天栏显示 玩家名; "§c错误的转账数额" 20 | 结束 21 | 结束如果 22 | 设置 钱数 为 转换为非空变量 (获取计分板分数 "money", 玩家名), 0 23 | 如果 转账钱数 > 钱数 那么 24 | 聊天栏显示 玩家名; "§c金币数额不够: 你只有 " + 钱数 + " 金币" 25 | 结束 26 | 否则 27 | 执行 "/scoreboard players remove " + 玩家名 + " money " + 转账钱数 28 | 执行 "/scoreboard players add " + 转账目标 + " money " + 转账钱数 29 | 聊天栏显示 玩家名; "§a转账成功, 转账了§e$" + 转账钱数 + "金币" 30 | 结束如果 31 | 否则 32 | 聊天栏显示 玩家名; "§c转账命令格式错误" 33 | 结束如果 34 | 结束如果 -------------------------------------------------------------------------------- /ZBasic_Lang_中文编程/示例代码/进服欢迎/玩家进入.txt: -------------------------------------------------------------------------------- 1 | @导入变量 玩家名 字符串 2 | 聊天栏显示 "@a"; "§a@" + 玩家名 + " §f欢迎回来!" -------------------------------------------------------------------------------- /ZBasic_Lang_中文编程/示例代码/进服欢迎/玩家退出.txt: -------------------------------------------------------------------------------- 1 | @导入变量 玩家名 字符串 2 | 聊天栏显示 "@a"; "§a@" + 玩家名 + " §f下次再见!" -------------------------------------------------------------------------------- /[pkg]新手插件包/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugin-ids": [ 3 | "聊天栏菜单", 4 | "自定义聊天栏菜单", 5 | "入服欢迎", 6 | "better-announcebar", 7 | "gobang_game", 8 | "choose-song", 9 | "插件接口获取修复" 10 | ], 11 | "description": "入门ToolDelta的插件包, 提供了ToolDelta的经典插件集\n包括一些实用插件和娱乐插件", 12 | "author": "SuperScript", 13 | "version": "0.0.2" 14 | } -------------------------------------------------------------------------------- /[pkg]新手插件包/插件配置文件/聊天栏菜单.json: -------------------------------------------------------------------------------- 1 | { 2 | "配置版本": "0.0.1", 3 | "配置项": { 4 | "help菜单样式": { 5 | "菜单头": "§7>>> §l§bToolDelta\n§r§l===============================", 6 | "菜单列表": " - [菜单指令][参数提示] §7§o[菜单功能说明]", 7 | "菜单尾": "§r§l==========[[当前页数] §7\/ [总页数]§f]===========\n§r>>> §7输入 .help <页数> 可以跳转到该页" 8 | }, 9 | "\/help触发词": [ 10 | ".help" 11 | ], 12 | "被识别为触发词的前缀(不填则为无命令前缀)": [ 13 | ".", 14 | "。", 15 | "·" 16 | ], 17 | "单页内最多显示数": 8 18 | } 19 | } -------------------------------------------------------------------------------- /[pkg]新手插件包/插件配置文件/自定义聊天栏菜单.json: -------------------------------------------------------------------------------- 1 | { 2 | "配置版本": "0.0.5", 3 | "配置项": { 4 | "菜单项": [ 5 | { 6 | "说明": "返回主城", 7 | "触发词": [ 8 | "hub", 9 | "spawn", 10 | "main", 11 | "回城", 12 | "返回主城" 13 | ], 14 | "需要的参数数量": 0, 15 | "参数提示": "", 16 | "功能简介": "返回重生点", 17 | "触发后执行的指令": [ 18 | "/w [玩家名] 管理员还没有设定主城坐标 (前往 自定义聊天栏菜单.json 配置文件更改)" 19 | ], 20 | "仅OP可用": false 21 | }, 22 | { 23 | "说明": "设置重生点", 24 | "触发词": [ 25 | "spawnpoint", 26 | "设置重生点" 27 | ], 28 | "需要的参数数量": 0, 29 | "参数提示": "", 30 | "功能简介": "返回重生点", 31 | "触发后执行的指令": [ 32 | "/execute as [玩家名] at @s run spawnpoint", 33 | "td:/show §a已设置重生点" 34 | ], 35 | "仅OP可用": false 36 | }, 37 | { 38 | "说明": "返回重生点", 39 | "触发词": [ 40 | "kill", 41 | "自尽" 42 | ], 43 | "需要的参数数量": 0, 44 | "参数提示": "", 45 | "功能简介": "返回重生点", 46 | "触发后执行的指令": [ 47 | "/kill [玩家名]", 48 | "/title @a[name=玩家名] actionbar 自尽成功" 49 | ], 50 | "仅OP可用": false 51 | }, 52 | { 53 | "说明": "查看个人档案", 54 | "触发词": [ 55 | "个人档案", 56 | "prof" 57 | ], 58 | "需要的参数数量": 0, 59 | "参数提示": "", 60 | "功能简介": "查看个人档案", 61 | "触发后执行的指令": [ 62 | "td:/show §e| §lProfile§r§e |", 63 | "td:/show §7▶ §e金币: [计分板:money]", 64 | "td:/show §7▶ §d在线时长: [计分板:在线时长]", 65 | "td:/show §7查看更多, 请前往 义聊天栏菜单.json 配置文件更改" 66 | ], 67 | "仅OP可用": false 68 | } 69 | ] 70 | } 71 | } -------------------------------------------------------------------------------- /[pkg]防挂插件包/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugin-ids": [ 3 | "『Orion System』违规与作弊行为综合反制系统", 4 | "暴击限制", 5 | "超频刷屏反制", 6 | "等级限制", 7 | "reportsystem", 8 | "云黑", 9 | "违规名称踢出", 10 | "32k盒子显示" 11 | ], 12 | "description": "收录常用的防挂插件", 13 | "author": "ToolDelta", 14 | "version": "0.0.2" 15 | } -------------------------------------------------------------------------------- /[pkg]音乐杂合包/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugin-ids": [ 3 | ], 4 | "description": "为音乐播放器和点歌台增加了几十首曲目,曲目适用于全年龄段(bushi", 5 | "author": "NearKai", 6 | "version": "0.0.1" 7 | } -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/Pvz水池.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/Pvz水池.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/Tokyovania墨水.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/Tokyovania墨水.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/Undertale.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/Undertale.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/see you again.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/see you again.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/三重审判.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/三重审判.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/下坠Falling.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/下坠Falling.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/世界末日(ARMAGEDN).midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/世界末日(ARMAGEDN).midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/世界末日(Il mondo).midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/世界末日(Il mondo).midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/以父之名.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/以父之名.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/你干吗嗨嗨呦.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/你干吗嗨嗨呦.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/你瞒我瞒.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/你瞒我瞒.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/僵王博士.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/僵王博士.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/兰亭序.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/兰亭序.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/决心鱼.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/决心鱼.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/千本樱.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/千本樱.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/卡农.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/卡农.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/原神大厅音乐.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/原神大厅音乐.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/名侦探柯南.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/名侦探柯南.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/哆啦A梦.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/哆啦A梦.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/坏苹果.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/坏苹果.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/天空之城.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/天空之城.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/子弹地狱.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/子弹地狱.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/宝贝别哭.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/宝贝别哭.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/小埋单轨.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/小埋单轨.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/彩虹猫.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/彩虹猫.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/怪物-原神.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/怪物-原神.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/恋爱循环.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/恋爱循环.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/我的世界.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/我的世界.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/我落泪情绪零碎.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/我落泪情绪零碎.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/新闻联播.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/新闻联播.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/新鸳鸯蝴蝶梦.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/新鸳鸯蝴蝶梦.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/旋转鸡块.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/旋转鸡块.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/星茶会.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/星茶会.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/春节序曲.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/春节序曲.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/极乐净土.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/极乐净土.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/某科学的超电磁炮.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/某科学的超电磁炮.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/桃源恋歌.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/桃源恋歌.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/浪人琵琶.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/浪人琵琶.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/海阔天空.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/海阔天空.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/灌篮高手.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/灌篮高手.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/爬行者.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/爬行者.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/爱情故事.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/爱情故事.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/狂妄之人.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/狂妄之人.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/玄武国.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/玄武国.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/甩葱歌.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/甩葱歌.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/百年孤寂.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/百年孤寂.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/稻香.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/稻香.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/空白.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/空白.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/突然好想你.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/突然好想你.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/苏公提.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/苏公提.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/苹果香.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/苹果香.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/蒲公英的约定.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/蒲公英的约定.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/蜡笔小新.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/蜡笔小新.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/解开.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/解开.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/诀别书.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/诀别书.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/转身即心痛.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/转身即心痛.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/退后.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/退后.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/银行不妙曲.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/银行不妙曲.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/雪花竞技场[请不要外传].schem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/雪花竞技场[请不要外传].schem -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/雷欧奥特曼.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/雷欧奥特曼.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/鱼宴Plus.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/鱼宴Plus.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/鸟之诗.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/鸟之诗.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/默哀.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/点歌台/音乐列表/默哀.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/Pvz水池.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/Pvz水池.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/Tokyovania墨水.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/Tokyovania墨水.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/Undertale.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/Undertale.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/see you again.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/see you again.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/三重审判.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/三重审判.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/下坠Falling.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/下坠Falling.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/世界末日(ARMAGEDN).midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/世界末日(ARMAGEDN).midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/世界末日(Il mondo).midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/世界末日(Il mondo).midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/以父之名.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/以父之名.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/你干吗嗨嗨呦.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/你干吗嗨嗨呦.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/你瞒我瞒.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/你瞒我瞒.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/僵王博士.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/僵王博士.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/兰亭序.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/兰亭序.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/决心鱼.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/决心鱼.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/千本樱.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/千本樱.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/卡农.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/卡农.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/原神大厅音乐.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/原神大厅音乐.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/名侦探柯南.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/名侦探柯南.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/哆啦A梦.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/哆啦A梦.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/坏苹果.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/坏苹果.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/天空之城.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/天空之城.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/子弹地狱.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/子弹地狱.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/宝贝别哭.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/宝贝别哭.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/小埋单轨.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/小埋单轨.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/彩虹猫.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/彩虹猫.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/怪物-原神.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/怪物-原神.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/恋爱循环.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/恋爱循环.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/我的世界.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/我的世界.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/我落泪情绪零碎.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/我落泪情绪零碎.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/新闻联播.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/新闻联播.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/新鸳鸯蝴蝶梦.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/新鸳鸯蝴蝶梦.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/旋转鸡块.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/旋转鸡块.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/星茶会.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/星茶会.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/春节序曲.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/春节序曲.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/极乐净土.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/极乐净土.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/某科学的超电磁炮.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/某科学的超电磁炮.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/桃源恋歌.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/桃源恋歌.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/浪人琵琶.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/浪人琵琶.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/海阔天空.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/海阔天空.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/灌篮高手.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/灌篮高手.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/爬行者.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/爬行者.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/爱情故事.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/爱情故事.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/狂妄之人.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/狂妄之人.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/玄武国.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/玄武国.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/甩葱歌.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/甩葱歌.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/百年孤寂.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/百年孤寂.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/稻香.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/稻香.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/空白.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/空白.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/突然好想你.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/突然好想你.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/苏公提.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/苏公提.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/苹果香.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/苹果香.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/蒲公英的约定.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/蒲公英的约定.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/蜡笔小新.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/蜡笔小新.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/解开.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/解开.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/诀别书.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/诀别书.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/转身即心痛.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/转身即心痛.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/退后.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/退后.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/银行不妙曲.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/银行不妙曲.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/雪花竞技场[请不要外传].schem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/雪花竞技场[请不要外传].schem -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/雷欧奥特曼.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/雷欧奥特曼.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/鱼宴Plus.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/鱼宴Plus.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/鸟之诗.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/鸟之诗.midseq -------------------------------------------------------------------------------- /[pkg]音乐杂合包/插件数据文件/音乐播放器/默哀.midseq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/[pkg]音乐杂合包/插件数据文件/音乐播放器/默哀.midseq -------------------------------------------------------------------------------- /admin命令/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "wling/Hadwin", 3 | "version": "0.0.3", 4 | "description": "管理的好帮手!", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.2.7" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "admin_cmd" 11 | } -------------------------------------------------------------------------------- /ai聊天/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "机入", 3 | "version": "0.0.2", 4 | "plugin-type": "classic", 5 | "description": "接入deepseek进行租赁服聊天", 6 | "pre-plugins": {}, 7 | "plugin-id": "ai聊天" 8 | } -------------------------------------------------------------------------------- /bdx导入器Pro/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.1.3", 4 | "plugin-type": "classic", 5 | "description": "导入bdx文件 (目前支持导入命令方块指令, 暂不支持导入NBT)", 6 | "pre-plugins": { 7 | "前置-世界交互": "0.0.4", 8 | "pip": "0.0.1" 9 | }, 10 | "plugin-id": "bdx-builder-pro" 11 | } -------------------------------------------------------------------------------- /bdx导入器Pro/libbdxbuilder_linux_amd64.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/bdx导入器Pro/libbdxbuilder_linux_amd64.so -------------------------------------------------------------------------------- /bdx导入器Pro/thisutils.py: -------------------------------------------------------------------------------- 1 | def render_bar( 2 | current: float, total: float, left_color: str, right_color: str, length: int = 90 3 | ): 4 | render_blocks = ["", "▍", "▌", "▋", "▊", "▉"] # "▍", "▌", "▋", "▊", "▉" 5 | biggest_block_len_max = length // 6 6 | biggest_block_eq = len(render_blocks) - 1 7 | progress1 = current / total 8 | prgs = int(biggest_block_len_max * biggest_block_eq * progress1) 9 | prgs_rest = biggest_block_len_max * biggest_block_eq - prgs 10 | square_count, render_block_index = divmod(prgs, biggest_block_eq) 11 | square_rest_count, render_block_rest_index = divmod(prgs_rest, biggest_block_eq) 12 | output_1 = "ࡇ" * square_count + render_blocks[render_block_index] 13 | output_rest = "ࡇ" * square_rest_count + render_blocks[render_block_rest_index] 14 | final_output = left_color + output_1 + right_color + output_rest 15 | return final_output 16 | -------------------------------------------------------------------------------- /bdx导出器/bdx_utils/construct_file.py: -------------------------------------------------------------------------------- 1 | from io import BytesIO, BufferedWriter 2 | from brotli import compress 3 | 4 | 5 | def write_bdx_file(writer: BufferedWriter, author: str, bdx_content_reader: BytesIO): 6 | writer.seek(0, 2) 7 | writer.write( 8 | b"BD@" 9 | + compress( 10 | b"BDX\x00" 11 | + author.encode() 12 | + b"\x00" 13 | + bdx_content_reader.getvalue() 14 | + b"XE" 15 | ) 16 | ) 17 | -------------------------------------------------------------------------------- /bdx导出器/bdx_utils/structs.py: -------------------------------------------------------------------------------- 1 | from io import BytesIO 2 | from struct import pack 3 | 4 | 5 | class ChestSlot: 6 | def __init__( 7 | self, 8 | itemName: str, 9 | count: int, 10 | data: int, 11 | slotID: int, 12 | ): 13 | self.itemName = itemName 14 | self.count = count 15 | self.data = data 16 | self.slotID = slotID 17 | 18 | def marshal( 19 | self, 20 | writer: BytesIO, 21 | ): 22 | writer.write( 23 | self.itemName.encode(encoding="utf-8") 24 | + b"\x00" 25 | + self.count.to_bytes(length=1, byteorder="big") 26 | + pack(">H", self.data) 27 | + self.slotID.to_bytes(length=1, byteorder="big") 28 | ) 29 | 30 | 31 | class ChestData: 32 | def __init__(self, chestData: list[ChestSlot]): 33 | self.chestData = chestData 34 | 35 | def marshal(self, writer: BytesIO): 36 | for i in self.chestData: 37 | i.marshal(writer) 38 | -------------------------------------------------------------------------------- /bdx导出器/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.2", 4 | "plugin-type": "classic", 5 | "description": "导出 bdx 文件\n控制台输入 export help 查看帮助\n目前支持导入: 普通建筑、命令方块、箱子内无 NBT 物品", 6 | "pre-plugins": { 7 | "前置-世界交互": "0.0.1" 8 | }, 9 | "plugin-id": "bdx-exporter", 10 | "enabled": true 11 | } -------------------------------------------------------------------------------- /bdx导出器/progress_bar.py: -------------------------------------------------------------------------------- 1 | from tooldelta import fmts 2 | 3 | 4 | def progress_bar( 5 | current: float, 6 | total: float, 7 | length: float = 20, 8 | color1: str = "§f", 9 | color2: str = "§b", 10 | ) -> str: 11 | """执行进度条 12 | 13 | Args: 14 | current (float | int): 当前进度值 15 | total (float | int): 总进度值 16 | length (int): 进度条长度. 17 | color1 (str): 进度条颜色 1. 18 | color2 (str): 进度条颜色 2. 19 | 20 | Returns: 21 | str: 格式化后的进度条字符串 22 | """ 23 | pc = round(min(1, current / total) * length) 24 | return fmts.colormode_replace( 25 | color1 + " " * pc + color2 + " " * (20 - pc) + f"§r {current}/{total}", 7 26 | ) 27 | -------------------------------------------------------------------------------- /bdx导出器/state_dump.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | 4 | def bool_func(x): 5 | return ("false", "true")[x] 6 | 7 | 8 | SPECIAL_KTYPE = { 9 | "door_hinge_bit": bool_func, 10 | "brewing_stand_slot_c_bit": bool_func, 11 | "infiniburn_bit": bool_func, 12 | "coral_hang_type_bit": bool_func, 13 | "attached_bit": bool_func, 14 | "button_pressed_bit": bool_func, 15 | "open_bit": bool_func, 16 | "age_bit": bool_func, 17 | "head_piece_bit": bool_func, 18 | "color_bit": bool_func, 19 | "persistent_bit": bool_func, 20 | "stripped_bit": bool_func, 21 | "disarmed_bit": bool_func, 22 | "rail_data_bit": bool_func, 23 | "brewing_stand_slot_a_bit": bool_func, 24 | "end_portal_eye_bit": bool_func, 25 | "update_bit": bool_func, 26 | "item_frame_photo_bit": bool_func, 27 | "item_frame_map_bit": bool_func, 28 | "stability_check": bool_func, 29 | "covered_bit": bool_func, 30 | "brewing_stand_slot_b_bit": bool_func, 31 | "upper_block_bit": bool_func, 32 | "upside_down_bit": bool_func, 33 | "triggered_bit": bool_func, 34 | "output_lit_bit": bool_func, 35 | "explode_bit": bool_func, 36 | "allow_underwater_bit": bool_func, 37 | "wall_post_bit": bool_func, 38 | "in_wall_bit": bool_func, 39 | "dead_bit": bool_func, 40 | "powered_bit": bool_func, 41 | "suspended_bit": bool_func, 42 | "occupied_bit": bool_func, 43 | "toggle_bit": bool_func, 44 | "drag_down": bool_func, 45 | "extinguished": bool_func, 46 | "conditional_bit": bool_func, 47 | "hanging": bool_func, 48 | "output_subtract_bit": bool_func, 49 | } 50 | 51 | 52 | def to_string(val: str): 53 | return json.dumps(val) 54 | 55 | 56 | def to_key(key: str): 57 | return to_string(key) 58 | 59 | 60 | def to_val_default(val: str): 61 | return json.dumps(val) 62 | 63 | 64 | def dump_block_states(states: dict): 65 | states_strs = [] 66 | for k, b in states.items(): 67 | k_str = to_key(k) 68 | if k in SPECIAL_KTYPE: 69 | states_strs.append(f"{k_str}={SPECIAL_KTYPE[k](b)}") 70 | else: 71 | states_strs.append(f"{k_str}={to_string(b)}") 72 | return "[" + ",".join(states_strs) + "]" 73 | -------------------------------------------------------------------------------- /bdx导出器/utils.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | 4 | def snake_folding(size_x: int, size_y: int, size_z: int): 5 | x = 0 6 | y = 0 7 | z = 0 8 | dx = 1 9 | dz = 1 10 | while y < size_y: 11 | yield x, y, z 12 | x += dx 13 | if x >= size_x or x < 0: 14 | dx *= -1 15 | x += dx 16 | z += dz 17 | if z >= size_z or z < 0: 18 | dz *= -1 19 | z += dz 20 | y += 1 21 | 22 | 23 | def snake_folding_xz(size_x: int, size_z: int): 24 | x = 0 25 | z = 0 26 | dx = 1 27 | while z < size_z: 28 | yield x, z 29 | x += dx 30 | if x >= size_x or x < 0: 31 | dx *= -1 32 | x += dx 33 | z += 1 34 | 35 | 36 | def yield_4chunks(startx: int, startz: int, endx: int, endz: int): 37 | # 枚举区域内每个 2x2 区块的起点 38 | dx = endx - startx 39 | dz = endz - startz 40 | f_chunk_x_count = math.ceil(dx / 64) 41 | f_chunk_z_count = math.ceil(dz / 64) 42 | for x, z in snake_folding_xz(f_chunk_x_count, f_chunk_z_count): 43 | yield startx + x * 64, startz + z * 64, x * 64, z * 64 44 | -------------------------------------------------------------------------------- /bdx导出器Pro-急眼版/bdx_utils.py: -------------------------------------------------------------------------------- 1 | import math 2 | from tooldelta import fmts 3 | 4 | 5 | def snake_folding_xz(size_x: int, size_z: int): 6 | x = 0 7 | z = 0 8 | dx = 1 9 | while z < size_z: 10 | yield x, z 11 | x += dx 12 | if x >= size_x or x < 0: 13 | dx *= -1 14 | x += dx 15 | z += 1 16 | 17 | 18 | def yield_chunks(startx: int, startz: int, endx: int, endz: int): 19 | # 枚举区域内每个 2x2 区块的起点 20 | dx = endx - startx 21 | dz = endz - startz 22 | f_chunk_x_count = math.ceil(dx / 16) 23 | f_chunk_z_count = math.ceil(dz / 16) 24 | for x, z in snake_folding_xz(f_chunk_x_count, f_chunk_z_count): 25 | yield startx + x * 16, startz + z * 16, x * 16, z * 16 26 | 27 | def get_chunks_num(startx: int, startz: int, endx: int, endz: int): 28 | # 获取总区块数 29 | dx = endx - startx 30 | dz = endz - startz 31 | f_chunk_x_count = math.ceil(dx / 16) 32 | f_chunk_z_count = math.ceil(dz / 16) 33 | return f_chunk_x_count * f_chunk_z_count 34 | 35 | 36 | def progress_bar( 37 | current: float, 38 | total: float, 39 | length: float = 20, 40 | color1: str = "§f", 41 | color2: str = "§b", 42 | ) -> str: 43 | """执行进度条 44 | 45 | Args: 46 | current (float | int): 当前进度值 47 | total (float | int): 总进度值 48 | length (int): 进度条长度. 49 | color1 (str): 进度条颜色 1. 50 | color2 (str): 进度条颜色 2. 51 | 52 | Returns: 53 | str: 格式化后的进度条字符串 54 | """ 55 | pc = round(min(1, current / total) * length) 56 | return fmts.colormode_replace( 57 | color1 + " " * pc + color2 + " " * (20 - pc) + f"§r {current}/{total}", 7 58 | ) 59 | -------------------------------------------------------------------------------- /bdx导出器Pro-急眼版/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.2", 4 | "plugin-type": "classic", 5 | "description": "导出 bdx 文件\n控制台输入 export help 查看帮助\n目前支持导入: 普通建筑、命令方块、箱子内无 NBT 物品", 6 | "pre-plugins": { 7 | "前置-世界交互": "0.0.1" 8 | }, 9 | "plugin-id": "bdx-exporter", 10 | "enabled": true 11 | } -------------------------------------------------------------------------------- /bdx导出器Pro-急眼版/lib.py: -------------------------------------------------------------------------------- 1 | import os 2 | import ctypes 3 | import msgpack 4 | from tooldelta import fmts 5 | 6 | lib_file = os.path.join(os.path.dirname(__file__), "libbdxexporter.so") 7 | 8 | try: 9 | LIB = ctypes.cdll.LoadLibrary(lib_file) 10 | except Exception as e: 11 | fmts.print_err(f"BDX 导出库加载失败: {e}") 12 | raise e 13 | 14 | 15 | class LockGetterAndReleaser: 16 | def __enter__(self): 17 | return AcquireLock() 18 | 19 | def __exit__(self, exc_type, exc_val, exc_tb): 20 | ReleaseLock() 21 | 22 | 23 | def pyString(s: bytes): 24 | return s.decode() 25 | 26 | 27 | def cgoString(s: str): 28 | return s.encode() 29 | 30 | 31 | def assert_return(msg: bytes): 32 | if msg: 33 | raise RuntimeError(pyString(msg)) 34 | 35 | 36 | def AcquireLock() -> bool: 37 | return LIB.AcquireLock() 38 | 39 | 40 | def ReleaseLock(): 41 | LIB.ReleaseLock() 42 | 43 | 44 | def LoadStructure(structure, relative_x: int, absolute_y: int, relative_z: int): 45 | bts: bytes = msgpack.packb(structure) # type: ignore 46 | bts_len = len(bts) 47 | 48 | # bts_disp = "[" + ",".join(map(str, bts[:50])) + "]" 49 | 50 | # print(f"bts len={len(bts)}, first={bts_disp}") 51 | assert_return(LIB.LoadStructure(bts, bts_len, relative_x, absolute_y, relative_z)) 52 | 53 | 54 | def StructuresToBDX(): 55 | assert_return(LIB.StructuresToBDX()) 56 | 57 | 58 | def DumpBDX(filepath: str): 59 | assert_return(LIB.DumpBDX(cgoString(filepath))) 60 | 61 | 62 | LIB.AcquireLock.argtypes = () 63 | LIB.ReleaseLock.argtypes = () 64 | LIB.LoadStructure.argtypes = ( 65 | ctypes.c_char_p, 66 | ctypes.c_int, 67 | ctypes.c_int32, 68 | ctypes.c_int32, 69 | ctypes.c_int32, 70 | ) 71 | LIB.LoadStructure.restype = ctypes.c_char_p 72 | LIB.StructuresToBDX.argtypes = () 73 | LIB.StructuresToBDX.restype = ctypes.c_char_p 74 | LIB.DumpBDX.argtypes = (ctypes.c_char_p,) 75 | LIB.DumpBDX.restype = ctypes.c_char_p 76 | -------------------------------------------------------------------------------- /bdx导出器Pro-急眼版/libbdxexporter.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/bdx导出器Pro-急眼版/libbdxexporter.so -------------------------------------------------------------------------------- /bdx导出器Pro-急眼版/scanner.py: -------------------------------------------------------------------------------- 1 | from tooldelta import fmts 2 | from . import lib, bdx_utils 3 | 4 | if 0: 5 | from . import BDXExporter 6 | 7 | """ 8 | 9 | 10 | export set -4 -4 -3 11 | export setend 85 75 76 12 | export bd.bdx 13 | 14 | 15 | 16 | 17 | export set 74 -60 -117 18 | export setend 426 115 72 19 | export bd.bdx 20 | 21 | """ 22 | 23 | 24 | def get_and_load_structure( 25 | sys: "BDXExporter", 26 | x: int, 27 | y: int, 28 | z: int, 29 | sizex: int, 30 | sizey: int, 31 | sizez: int, 32 | relative_x: int, 33 | absolute_y: int, 34 | relative_z: int, 35 | progress_now: int, 36 | progress_max: int, 37 | ): 38 | sys.game_ctrl.sendwscmd(f"tp {x} 0 {z}") 39 | # res = sys.game_ctrl.sendwscmd_with_resp(f"tp {x} 0 {z}") 40 | # if res.SuccessCount == 0: 41 | # raise ValueError("Error RequestStructure: TP") 42 | progress_bar = bdx_utils.progress_bar(progress_now, progress_max) 43 | progress_text = f"{progress_bar} 区块 [{x}, {y}, {z}] ~ [{x + sizex}, {y + sizey}, {z + sizez}]" 44 | fmts.print_inf( 45 | f"正在获取 {progress_text} ", 46 | end="\r", 47 | ) 48 | r = sys.intr._request_structure_and_get((x, y, z), (sizex, sizey, sizez)) 49 | fmts.print_inf( 50 | f"正在解析 {progress_text} ", 51 | end="\r", 52 | ) 53 | lib.LoadStructure(r, relative_x, absolute_y, relative_z) 54 | fmts.print_inf( 55 | f"解析完成 {progress_text} ", 56 | end="\r", 57 | ) 58 | 59 | 60 | def export_to_structures( 61 | sys: "BDXExporter", 62 | startx: int, 63 | starty: int, 64 | startz: int, 65 | endx: int, 66 | endy: int, 67 | endz: int, 68 | ): 69 | startx, endx = min(startx, endx), max(startx, endx) 70 | starty, endy = min(starty, endy), max(starty, endy) 71 | startz, endz = min(startz, endz), max(startz, endz) 72 | dy = endy - starty + 1 73 | chunks_count = bdx_utils.get_chunks_num(startx, startz, endx, endz) 74 | steps = 0 75 | for x, z, rel_x, rel_z in bdx_utils.yield_chunks(startx, startz, endx, endz): 76 | sizex, sizez = min(16, endx - x + 1), min(16, endz - z + 1) 77 | get_and_load_structure( 78 | sys, 79 | x, 80 | starty, 81 | z, 82 | sizex, 83 | dy, 84 | sizez, 85 | rel_x, 86 | starty, 87 | rel_z, 88 | steps, 89 | chunks_count, 90 | ) 91 | steps += 1 92 | -------------------------------------------------------------------------------- /demo-商店系统/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "ToolDelta Demo", 3 | "version": "0.0.2", 4 | "plugin-type": "classic", 5 | "description": "ToolDelta 的示例教学插件 - 可以在配置文件自定义出售和收购的商品", 6 | "pre-plugins": { 7 | "前置-世界交互": "0.0.4" 8 | }, 9 | "plugin-id": "demo-plugin-shop", 10 | "enabled": true 11 | } -------------------------------------------------------------------------------- /desperated_plugins/性能管理/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.4", 4 | "description": "使用控制台命令对系统进行实时的cpu内存等监测, 更多方法请在安装插件后输入 top 命令", 5 | "plugin-type": "classic", 6 | "pre-plugins": {}, 7 | "limit_launcher": null, 8 | "plugin-id": "prof_manager" 9 | } -------------------------------------------------------------------------------- /desperated_plugins/睡觉统计/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "权威-马牛逼", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "本插件,是生存服务器类型的必备,因为在游戏中机器人的原因,无法跳过夜晚,导致非常的苦恼,本插件优化了此bug", 6 | "pre-plugins": {}, 7 | "plugin-id": "睡觉统计", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /pip模块支持/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.5", 4 | "plugin-type": "classic", 5 | "description": "提供了 pip 安装模块的支持\n你也可以在控制台输入 pip-install 来手动安装模块\n 为 ToolDelta 额外安装第三方库", 6 | "pre-plugins": {}, 7 | "plugin-id": "pip", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /『Orion System』违规与作弊行为综合反制系统/README.md: -------------------------------------------------------------------------------- 1 | # 『Orion System 猎户座系统』违规与作弊行为综合反制系统 2 | ## 1.功能 3 | I 拥有精美UI页面的控制台封禁/解封系统 4 | II 拥有精美UI页面的游戏内封禁/解封系统 5 | III 可通过游戏内记分板命令接入本封禁系统 6 | IV 机器人IP外进反制 7 | V 皮肤数据异常反制(base64解码) 8 | VI Steve/Alex/4D皮肤反制 9 | VII 账号等级限制 10 | VIII 网易屏蔽词名称反制 11 | IX 自定义违禁词名称反制 12 | X 网易MC客户端玩家数据检查 13 | XI 禁止游戏内私聊(tell,msg,w命令) 14 | XII 禁止游戏内me命令 15 | XIII 发言黑名单词检测 16 | XIV 发言频率限制 17 | XV 发言长度限制 18 | XVI 重复消息刷屏限制 19 | XVII 记录玩家XUID/设备号/现有名称与历史改名记录 20 | XVIII 对上述行为执行自动封禁 21 | XIX 玩家能力权限管理器(如自动设置访客) 22 | 23 | ## 2.注意事项 24 | ① 如果您需要“禁止游戏内私聊(tell,msg,w命令)”,请将机器人踢出游戏后启用sendcommandfeedback,命令为/gamerule sendcommandfeedback true 25 | ② 请注意修改您的配置文件,部分配置项要求的类型为“表”,如["白墙","跑路","runaway"],请注意格式规范 26 | ```python 27 | self.blacklist_word_list = ["白墙","跑路","runaway"] 28 | ``` 29 | ③ 发言字数、条数限制要求的类型为“正整数”,请不要输入小数或负数 30 | ④ 如果您需要封禁触发上述行为的用户,请在相关配置下按照以下格式输入: 31 | ```python 32 | class OrionConfig: 33 | CONFIG_DEFAULT = { 34 | "封禁时间_机器人IP外进反制": -1, 35 | "封禁时间_账号等级限制": 0, 36 | "封禁时间_发言频率检测": "0年0月0日0时10分0秒", 37 | "封禁时间_发言字数检测": 60, 38 | } 39 | ``` 40 | · 封禁时间 = -1 代表永久封禁 41 | · 封禁时间 = 0 仅踢出游戏,不作封禁,玩家可以立即重进 42 | · 封禁时间 = 60 代表封禁60秒,即1分钟 43 | · 封禁时间 = 86400 代表封禁86400秒,即1日 44 | · 封禁时间 = "0年0月0日0时10分0秒" 代表封禁10分钟 45 | 46 | ★ 请注意:在本插件中,1月=30日,1年=360日,不考虑闰年、夏令时、冬令时、月份之间日期数量不等的情况 47 | ★ 您只能输入"-1","0","正整数","字符串"中的其中一种。如果您输入了正整数,封禁时间单位为“秒”;如果您输入了字符串,请确保符合上述格式规范;如果您输入的内容无法被解析,程序将会抛出异常 48 | 49 | ⑤ 如果您无法在控制台/游戏内聊天栏菜单唤起封禁/解封系统,请检查您是否安装了多个封禁系统插件,它们之间可能存在相同的触发词 50 | ⑥ 关于玩家权限管理器:可以在玩家进入游戏时自动修改玩家权限,或者将玩家权限与记分板进行绑定,您可以通过游戏内命令方块调用 51 | ```python 52 | class OrionConfig: 53 | CONFIG_DEFAULT = { 54 | "进入游戏权限组": "123456", 55 | "记分板权限组": { 56 | "123456": 0, 57 | "": 1, 58 | "3456": 2, 59 | } 60 | } 61 | ``` 62 | · 放置方块 = 1 63 | · 采集方块 = 2 64 | · 使用门和开关 = 3 65 | · 打开容器 = 4 66 | · 攻击玩家 = 5 67 | · 攻击生物 = 6 68 | · 操作员命令 = 7 69 | · 使用传送 = 8 70 | 71 | ★ 请将上述权限后的数字进行组合,并按照以下格式组成<权限组> 72 | ★ 如<正常玩家>为123456,<访客>为空字符串,<操作员>为12345678,<地铁服推荐权限组>为3456 73 | ★ 请在<进入游戏权限组>的后面直接填写<权限组> 74 | ★ 请在<记分板权限组>的后面填写<权限组: 记分板分数> 75 | 76 | ⑦ BUG反馈:如有任何疑问或BUG反馈,请发送邮件至 485429738@qq.com ,或前往ToolDelta用户群进行咨询 77 | -------------------------------------------------------------------------------- /『Orion System』违规与作弊行为综合反制系统/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "style_天枢『猎户座』", 3 | "version": "0.3.4", 4 | "plugin-type": "classic", 5 | "description": "\n§d✧✦§f〓〓§b〓〓〓§9〓〓〓〓§1〓〓〓〓〓〓§9〓〓〓〓§b〓〓〓§f〓〓§d✦✧\n§l§d❐§f 『§6Orion System §d猎户座§f』 §b违规与作弊行为§e综合§a反制§d系统\n§l§b[ §e1§b ] §r§e拥有精美UI页面的控制台封禁/解封系统\n§l§b[ §e2§b ] §r§e拥有精美UI页面的游戏内封禁/解封系统\n§l§b[ §e3§b ] §r§e可通过游戏内记分板命令接入本封禁系统\n§l§b[ §e4§b ] §r§e机器人IP外进反制\n§l§b[ §e5§b ] §r§e皮肤数据异常反制(base64解码)\n§l§b[ §e6§b ] §r§eSteve/Alex/4D皮肤反制\n§l§b[ §e7§b ] §r§e账号等级限制\n§l§b[ §e8§b ] §r§e网易屏蔽词名称反制\n§l§b[ §e9§b ] §r§e自定义违禁词名称反制\n§l§b[ §e10§b ] §r§e网易MC客户端玩家数据检查\n§l§b[ §e11§b ] §r§e禁止游戏内私聊(tell,msg,w命令)\n§l§b[ §e12§b ] §r§e禁止游戏内me命令\n§l§b[ §e13§b ] §r§e发言黑名单词检测\n§l§b[ §e14§b ] §r§e发言频率限制\n§l§b[ §e15§b ] §r§e发言长度限制\n§l§b[ §e16§b ] §r§e重复消息刷屏限制\n§l§b[ §e17§b ] §r§e记录玩家XUID/设备号/现有名称与历史改名记录\n§l§b[ §e18§b ] §r§e对上述行为执行自动封禁\n§l§b[ §e19§b ] §r§e玩家能力权限管理器(如自动设置访客)\n§d✧✦§f〓〓§b〓〓〓§9〓〓〓〓§1〓〓〓〓〓〓§9〓〓〓〓§b〓〓〓§f〓〓§d✦✧", 6 | "pre-plugins": { 7 | "XUID获取": "0.0.7", 8 | "聊天栏菜单": "0.3.2" 9 | }, 10 | "plugin-id": "『Orion System』违规与作弊行为综合反制系统", 11 | "enabled": true 12 | } -------------------------------------------------------------------------------- /世界の记忆/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "9S, Meteora·Österreich, Altair and Echidna", 3 | "version": "0.0.6", 4 | "plugin-type": "classic", 5 | "description": "保留世界的记忆,总是将机器人周围区域保存到一个 “世界的映像(镜像存档)” 中", 6 | "pre-plugins": { 7 | "pip": "0.0.1", 8 | "主动区块请求": "0.1.2" 9 | }, 10 | "plugin-id": "世界の记忆", 11 | "enabled": true 12 | } -------------------------------------------------------------------------------- /世界の记忆/readme.txt: -------------------------------------------------------------------------------- 1 | YoRHa | Chapter 24 | the [E]nd of YoRHa 2 | 3 | 4 | 5 | 6 | 7 | 溢れる緑 8 | 零れる命 9 | 風は 10 | 今も遠く 11 | Nasico whosh pier wan nei wananba ri na qua lei 12 | Sila schmer ya pit pa lu 13 | 14 | 15 | 16 | 17 | 18 | 你见证并经历了无数战斗和冒险。 19 | 20 | 那是大地的慈悲,那是天上的喜悦。 21 | 22 | 你将从钢铁的桎梏中解放出来,那是我们的灵魂。 23 | 24 | 但,我们能得到拯救吗? 25 | 但,我们还有以后吗? 26 | 但,这就是我们的终局吗? 27 | 28 | 虽然,在得知我们的造物主早已不复存在,即便得知我们的敌人也是如此,那我们的挣扎,是为了什么呢? 29 | 30 | 我已经不再想和人造人争斗了。 31 | 32 | 33 | 34 | 35 | 36 | 我想我已经尽我所能奉上了一切,那你将得到什么呢? 37 | 38 | 那是多年来的记忆,还是临别前的最后一丝余韵吗? 39 | 40 | 或者,你或许只是个不真正在意一切的旅者吧。 41 | 42 | 43 | 44 | 45 | 46 | My final project, maybe, for those who want to leave something. 47 | To bring some hope, to bring some light. 48 | Maybe, just to leave something, just to make something “loom”. 49 | I don't know if you really care those things... But listen to me, just leave something. 50 | 51 | 52 | 53 | 54 | 55 | 56 | Yea, this is our end.. ? 57 | 58 | 砕けたcry & dream 扉だけの理想 59 | 街が雑音に溺れ はしゃいでも 60 | 僕は歌い 舵を捨てよう 61 | だからサイレンス 響くためと 62 | Don't be afraid daybreak has come. 63 | Don't be afraid daybreak has come.. 64 | Don't be afraid daybreak has come... 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | Reference List 76 | 77 | Aimer and SawanoHiroyuki[nZk] (2017). ninelie . [online] NetEase cloudmusic. Available at: https://music.163.com/song?id=507114412&uct2=U2FsdGVkX18i7ywRW+vlc5CoNXis/Xpn21nf021YRYs= [Accessed 30 Apr. 2025]. 78 | 79 | YoRHa (2017). Weight of the World/the End of YoRHa. [online] NetEase cloudmusic. Available at: https://music.163.com/song?id=468490608&uct2=U2FsdGVkX1+DoxmndPBHUYSfuBWjfFguDOgnmRTKDtg= [Accessed 30 Apr. 2025]. -------------------------------------------------------------------------------- /世界备份/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "YoRHa and RATH", 3 | "version": "0.0.3", 4 | "plugin-type": "classic", 5 | "description": "按需保留前几天的镜像存档数据,以便服务器地图损坏后可以修复", 6 | "pre-plugins": { 7 | "pip": "0.0.1", 8 | "世界の记忆": "0.0.4" 9 | }, 10 | "plugin-id": "世界备份", 11 | "enabled": true 12 | } -------------------------------------------------------------------------------- /世界备份v2/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import ( 2 | Plugin, 3 | Frame, 4 | plugin_entry, 5 | ) 6 | from .world_backup import WorldBackupMain 7 | from .define import WorldBackupBase 8 | from .on_chat import WorldBackupOnChat 9 | from .recover import WorldBackupRecover 10 | 11 | 12 | class WorldBackupNextGen(Plugin): 13 | name = "世界备份第二世代" 14 | author = "YoRHa and RATH" 15 | version = (1, 3, 1) 16 | 17 | def __init__(self, frame: Frame) -> None: 18 | super().__init__(frame) 19 | 20 | self.world_backup_base = WorldBackupBase(self) 21 | self.world_backup_main = WorldBackupMain(self.world_backup_base) 22 | self.world_backup_recover = WorldBackupRecover(self.world_backup_base) 23 | self.world_backup_on_chat = WorldBackupOnChat( 24 | self.world_backup_main, self.world_backup_recover 25 | ) 26 | 27 | self.ListenPreload(self.on_def) 28 | self.ListenActive(self.world_backup_main.on_inject) 29 | self.ListenFrameExit(self.world_backup_main.on_close) 30 | self.ListenInternalBroadcast( 31 | "scq:publish_chunk_data", self.world_backup_main.on_chunk_data 32 | ) 33 | self.ListenChat(self.world_backup_on_chat.on_chat) 34 | 35 | def on_def(self) -> None: 36 | self.world_backup_recover.recover() 37 | self.world_backup_main.on_def() 38 | 39 | 40 | entry = plugin_entry(WorldBackupNextGen, "世界备份第二世代") 41 | -------------------------------------------------------------------------------- /世界备份v2/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "YoRHa and RATH", 3 | "version": "1.3.1", 4 | "plugin-type": "classic", 5 | "description": "保存多个时间点的存档数据,并使用专业工具恢复到对应时刻的存档", 6 | "pre-plugins": { 7 | "pip": "0.0.1", 8 | "世界の记忆": "0.0.4", 9 | "简单世界恢复": "0.0.4" 10 | }, 11 | "plugin-id": "世界备份第二世代", 12 | "enabled": true 13 | } -------------------------------------------------------------------------------- /世界备份v2/define.py: -------------------------------------------------------------------------------- 1 | import threading 2 | from tooldelta import Plugin 3 | from tooldelta import cfg as config 4 | 5 | 6 | class WorldBackupBase: 7 | plugin: Plugin 8 | 9 | def __init__(self, plugin: Plugin) -> None: 10 | self.plugin = plugin 11 | self.game_ctrl = plugin.game_ctrl 12 | 13 | CFG_DEFAULT = { 14 | "数据库名称": "world_timeline.db", 15 | "数据库跳过截断调用": False, 16 | "数据库跳过 fsync 调用": False, 17 | "启用调试": False, 18 | "每多少秒保存一次存档": 86400, 19 | "单个区块允许的最多时间点数量": 7, 20 | "如果区块未更改则不新增时间点": True, 21 | "存档恢复触发词": ".存档恢复", 22 | "管理员列表(这些人可以请求将数据库恢复为存档)": ["Happy2018new"], 23 | } 24 | cfg, _ = config.get_plugin_config_and_version( 25 | "世界备份第二世代", 26 | config.auto_to_std(CFG_DEFAULT), 27 | CFG_DEFAULT, 28 | self.plugin.version, 29 | ) 30 | 31 | self.db_name = str(cfg["数据库名称"]) 32 | self.no_grow_sync = bool(cfg["数据库跳过截断调用"]) 33 | self.no_sync = bool(cfg["数据库跳过 fsync 调用"]) 34 | self.enable_debug = bool(cfg["启用调试"]) 35 | self.sync_delta_time = int(cfg["每多少秒保存一次存档"]) 36 | self.max_time_point_count = int(cfg["单个区块允许的最多时间点数量"]) 37 | self.no_change_when_no_change = bool(cfg["如果区块未更改则不新增时间点"]) 38 | self.recover_trigger_str = str(cfg["存档恢复触发词"]) 39 | self.ops_list = set(cfg["管理员列表(这些人可以请求将数据库恢复为存档)"]) 40 | 41 | self.should_close = False 42 | self.running_mutex = threading.Lock() 43 | 44 | self.plugin.make_data_path() 45 | -------------------------------------------------------------------------------- /世界备份v2/recover_tool_name.py: -------------------------------------------------------------------------------- 1 | import platform 2 | import sys 3 | 4 | 5 | def get_tool_name() -> str | None: 6 | recover_tool_name = None 7 | system = platform.system().lower() 8 | arch = platform.machine().lower() 9 | 10 | format_arch = "" 11 | if sys.maxsize == 2**63 - 1: 12 | if arch in ("x86_64", "amd64"): 13 | format_arch = "amd64" 14 | elif arch in ("arm64", "aarch64"): 15 | format_arch = "arm64" 16 | else: 17 | if arch in ("x86", "i686"): 18 | format_arch = "x86" 19 | 20 | match system: 21 | case "windows": 22 | if format_arch == "amd64": 23 | recover_tool_name = "recover-tool_windows_amd64.exe" 24 | elif format_arch == "x86": 25 | recover_tool_name = "recover-tool_windows_x86.exe" 26 | case "darwin": 27 | if format_arch == "amd64": 28 | recover_tool_name = "recover-tool_macos_amd64" 29 | elif format_arch == "arm64": 30 | recover_tool_name = "recover-tool_macos_arm64" 31 | case _: 32 | if format_arch == "amd64": 33 | recover_tool_name = "recover-tool_linux_amd64" 34 | elif format_arch == "arm64": 35 | if arch == "aarch64": 36 | recover_tool_name = "recover-tool_android_arm64" 37 | else: 38 | recover_tool_name = "recover-tool_linux_arm64" 39 | 40 | return recover_tool_name 41 | -------------------------------------------------------------------------------- /举报系统/Readme.md: -------------------------------------------------------------------------------- 1 | # 举报系统 2 | ## 1.功能 3 | 玩家输入`.r`可以举报一个玩家,举报的玩家会被记录在一个文件中,管理员可以查看这个文件,查看举报的玩家。 4 | 举报次数达到一定次数的玩家会被封禁。 5 | 6 | ## 2.自定义举报达到几次后踢出 7 | 在__init__.py中修改number_of_players的值即可 8 | ```python 9 | number_of_players = 3 10 | ``` 11 | -------------------------------------------------------------------------------- /举报系统/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugin-id": "reportsystem", 3 | "author": "帥気的男主角", 4 | "version": "0.0.2", 5 | "description": "玩家可以自行举报并踢出玩家的系统,举报的玩家会被记录在日志中,可以在日志中查看举报记录", 6 | "plugin-type": "classic", 7 | "pre-plugins": {} 8 | } -------------------------------------------------------------------------------- /云计分板API/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫七街", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "用于将计分板全部储存云端的API操作", 6 | "pre-plugins": {}, 7 | "plugin-id": "云计分板API", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /五子棋小游戏/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.5", 4 | "plugin-type": "classic", 5 | "description": "输入 .wzq <对手名> 开始一局五子棋小游戏!", 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.0.4" 8 | }, 9 | "plugin-id": "gobang_game" 10 | } -------------------------------------------------------------------------------- /井字棋/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.7", 4 | "description": "娱乐小游戏: 3x3井字棋", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "井字棋" 9 | } -------------------------------------------------------------------------------- /任务系统/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "任务系统", 3 | "version": "0.0.4", 4 | "plugin-type": "classic", 5 | "description": "为租赁服添加一套自定义的任务!", 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.0.1" 8 | }, 9 | "plugin-id": "QuestSystem" 10 | } -------------------------------------------------------------------------------- /任务系统/readme.txt: -------------------------------------------------------------------------------- 1 | 插件数据存放在 插件数据文件/任务系统/ 文件夹内。 2 | 3 | 任务数据的路径应当如下: 4 | 5 | 插件数据文件/ 6 | 任务系统/ 7 | 任务组xxxx/ 8 | 任务1.json 9 | 任务2.json 10 | yyyyyyyyy/ 11 | 任务1.json 12 | xxxx任务.json 13 | 14 | 任务的标签名就是 任务组文件夹名/任务文件名 15 | 16 | 标准的任务配置文件: 17 | 18 | { 19 | "显示名": "空岛の源初日", 20 | "描述": "获取10个树苗和1组圆石", 21 | "检测的指令": [], 22 | "需要的物品": { 23 | "树苗": [ 24 | "sapling", 25 | 10 26 | ], 27 | "圆石": [ 28 | "cobblestone", 29 | 64 30 | ] 31 | }, 32 | "只能由命令方块触发完成": false, 33 | "任务模式(-1=一次性 0=可重复做 >0为任务冷却秒数)": -1, 34 | "任务完成": { 35 | "执行的指令": [ 36 | "xp 1L [玩家名]" 37 | ], 38 | "给予的物品": {}, 39 | "开启的新任务": [ 40 | "开局任务/刷怪" 41 | ] 42 | } 43 | } -------------------------------------------------------------------------------- /传送点设置/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.2", 4 | "plugin-type": "classic", 5 | "description": "使玩家像 /sethome /home 设置传送点; 在配置文件更改传送点设置命令", 6 | "pre-plugins": { 7 | "基本插件功能库": "0.0.1", 8 | "聊天栏菜单": "0.0.1", 9 | "雪球菜单v2": "0.0.1", 10 | "XUID获取": "0.0.1" 11 | }, 12 | "plugin-id": "home-point-setter", 13 | "enabled": false 14 | } -------------------------------------------------------------------------------- /信任玩家互传/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Ka3mora", 3 | "version": "0.0.2", 4 | "plugin-type": "classic", 5 | "description": "简化互传,受信任玩家免同意传送", 6 | "pre-plugins": {}, 7 | "plugin-id": "信任玩家互传", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /兑换码/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "机入", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "输入兑换码 执行指令", 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.0.1" 8 | }, 9 | "plugin-id": "兑换码" 10 | } -------------------------------------------------------------------------------- /兑换码/file.py: -------------------------------------------------------------------------------- 1 | def read(name=None): 2 | try: 3 | if not name: 4 | return 5 | else: 6 | with open(name,'r',encoding='utf-8') as f: 7 | data = f.read() 8 | return data 9 | except FileNotFoundError: 10 | print("文件不存在") 11 | return 12 | 13 | 14 | def write(name=None, data=None): 15 | try: 16 | if not name: 17 | return 18 | else: 19 | with open(name, "r+",encoding='utf-8') as f: 20 | f.write(data) 21 | return 22 | except FileNotFoundError: 23 | print("文件不存在") 24 | return 25 | -------------------------------------------------------------------------------- /兑换码系统/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "权威-马牛逼", 3 | "version": "0.0.3", 4 | "plugin-type": "classic", 5 | "description": "1", 6 | "pre-plugins": {}, 7 | "plugin-id": "兑换码系统" 8 | } 9 | -------------------------------------------------------------------------------- /入服欢迎/__init__.py: -------------------------------------------------------------------------------- 1 | import time 2 | from tooldelta import ToolDelta, cfg as config, utils, Player, Plugin, plugin_entry 3 | 4 | 5 | class JoinWelcome(Plugin): 6 | name = "入服欢迎" 7 | author = "wling" 8 | version = (0, 0, 4) 9 | 10 | def __init__(self, frame: ToolDelta): 11 | super().__init__(frame) 12 | STD_BAN_CFG = { 13 | "登出时发送指令": list, 14 | "登录时发送指令": list, 15 | "登录时延迟发送": int, 16 | } 17 | DEFAULT_BAN_CFG: dict[str, list[str] | int] = { 18 | "登出时发送指令": [ 19 | """/tellraw @a {\"rawtext\":[{\"text\":\"§a§lBye~ @[target_player]\"}]}""" 20 | ], 21 | "登录时发送指令": [ 22 | """/tellraw [target_player] {\"rawtext\":[{\"text\":\"§a您可以使用在聊天栏发送 §b.help §a以调出系统面板§f.\"}]}""" 23 | ], 24 | "登录时延迟发送": 10, 25 | } 26 | self.cfg, _ = config.get_plugin_config_and_version( 27 | self.name, 28 | STD_BAN_CFG, 29 | DEFAULT_BAN_CFG, 30 | self.version, 31 | ) 32 | self.ListenPlayerJoin(self.on_player_join) 33 | self.ListenPlayerLeave(self.on_player_leave) 34 | 35 | @utils.thread_func("入服欢迎") 36 | def on_player_join(self, player: Player) -> None: 37 | time.sleep(self.cfg["登录时延迟发送"]) 38 | for i in self.cfg["登录时发送指令"]: 39 | self.game_ctrl.sendwocmd(i.replace("[target_player]", player.name)) 40 | 41 | def on_player_leave(self, player: Player) -> None: 42 | for i in self.cfg["登出时发送指令"]: 43 | self.game_ctrl.sendwocmd(i.replace("[target_player]", player.name)) 44 | 45 | 46 | entry = plugin_entry(JoinWelcome) 47 | -------------------------------------------------------------------------------- /入服欢迎/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "wling", 3 | "version": "0.0.4", 4 | "description": "来欢迎一下玩家吧", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.1.13" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "入服欢迎" 11 | } 12 | -------------------------------------------------------------------------------- /全服喇叭/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Player, Plugin, ToolDelta, plugin_entry 2 | 3 | 4 | class 全服喇叭(Plugin): 5 | name = "全服喇叭" 6 | author = "wling" 7 | version = (0, 0, 6) 8 | 9 | def __init__(self, frame: ToolDelta): 10 | super().__init__(frame) 11 | self.ListenPreload(self.on_preload) 12 | 13 | def on_preload(self): 14 | # TODO: 目前无法在消息里使用空格 15 | self.GetPluginAPI("聊天栏菜单").add_new_trigger( 16 | ["喇叭"], [("消息", str, None)], "管理广播消息", self.onLaba, op_only=True 17 | ) 18 | 19 | def onLaba(self, player: Player, args: tuple): 20 | msg = " ".join(args) 21 | if player.is_op(): 22 | player.show( 23 | f"§l§b{player.name} §r§7>>> §l§b{msg.replace('.喇叭', '').strip()}", 24 | ) 25 | self.game_ctrl.player_title("@a", f"§l§b{player.name}§f:") 26 | self.game_ctrl.player_subtitle( 27 | "@a", f"§l§e{msg.replace('.喇叭', '').strip()}" 28 | ) 29 | self.game_ctrl.sendwocmd( 30 | "execute as @a run playsound firework.launch @s ~~~ 10" 31 | ) 32 | else: 33 | player.show("§c只有管理员可使用全服喇叭") 34 | 35 | 36 | entry = plugin_entry(全服喇叭) 37 | -------------------------------------------------------------------------------- /全服喇叭/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "wling", 3 | "version": "0.0.6", 4 | "description": "全体请注意!身为管理的我要装*了!", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.1.13" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "全服喇叭" 11 | } -------------------------------------------------------------------------------- /公告栏[Mono]/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Mono", 3 | "version": "1.0.2", 4 | "description": "无", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "tpscalculator": "0.0.1" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "ad", 11 | "enabled": true 12 | } -------------------------------------------------------------------------------- /公告栏[Mono]/pytz/exceptions.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Custom exceptions raised by pytz. 3 | ''' 4 | 5 | __all__ = [ 6 | 'UnknownTimeZoneError', 'InvalidTimeError', 'AmbiguousTimeError', 7 | 'NonExistentTimeError', 8 | ] 9 | 10 | 11 | class Error(Exception): 12 | '''Base class for all exceptions raised by the pytz library''' 13 | 14 | 15 | class UnknownTimeZoneError(KeyError, Error): 16 | '''Exception raised when pytz is passed an unknown timezone. 17 | 18 | >>> isinstance(UnknownTimeZoneError(), LookupError) 19 | True 20 | 21 | This class is actually a subclass of KeyError to provide backwards 22 | compatibility with code relying on the undocumented behavior of earlier 23 | pytz releases. 24 | 25 | >>> isinstance(UnknownTimeZoneError(), KeyError) 26 | True 27 | 28 | And also a subclass of pytz.exceptions.Error, as are other pytz 29 | exceptions. 30 | 31 | >>> isinstance(UnknownTimeZoneError(), Error) 32 | True 33 | 34 | ''' 35 | pass 36 | 37 | 38 | class InvalidTimeError(Error): 39 | '''Base class for invalid time exceptions.''' 40 | 41 | 42 | class AmbiguousTimeError(InvalidTimeError): 43 | '''Exception raised when attempting to create an ambiguous wallclock time. 44 | 45 | At the end of a DST transition period, a particular wallclock time will 46 | occur twice (once before the clocks are set back, once after). Both 47 | possibilities may be correct, unless further information is supplied. 48 | 49 | See DstTzInfo.normalize() for more info 50 | ''' 51 | 52 | 53 | class NonExistentTimeError(InvalidTimeError): 54 | '''Exception raised when attempting to create a wallclock time that 55 | cannot exist. 56 | 57 | At the start of a DST transition period, the wallclock time jumps forward. 58 | The instants jumped over never occur. 59 | ''' 60 | -------------------------------------------------------------------------------- /公告栏[Mono]/pytz/zoneinfo/Asia/Shanghai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/公告栏[Mono]/pytz/zoneinfo/Asia/Shanghai -------------------------------------------------------------------------------- /前置_Cb2Bot通信/__init__.py: -------------------------------------------------------------------------------- 1 | import json 2 | from typing import Any 3 | from collections.abc import Callable 4 | from tooldelta import Plugin, plugin_entry 5 | from tooldelta.constants import PacketIDS 6 | 7 | AVALIABLE_CB = Callable[[list[str]], bool | Any] 8 | 9 | 10 | class TellrawCb2Bot(Plugin): 11 | name = "前置-命令方块与机器人数据通信" 12 | author = "ToolDelta" 13 | version = (0, 0, 2) 14 | 15 | def __init__(self, frame): 16 | super().__init__(frame) 17 | self._registered_msg_prefixs: dict[str, dict[int, list[AVALIABLE_CB]]] = {} 18 | self.ListenPacket(PacketIDS.IDText, self.evt_handler) 19 | 20 | ########################## API ############################### 21 | def regist_message_cb(self, prefix: str, cb: AVALIABLE_CB, priority: int = 1): 22 | """ 23 | 注册一个消息监听器 24 | Args: 25 | prefix (str): 消息前缀 (tellraw 第一个 rawtext文本) 26 | cb (AVALIABLE_CB): 监听回调 (返回 True 代表需要拦截) 27 | priority (int): 优先级, 优先级越高越先被执行且阻拦 (建议基本优先级为1) 28 | """ 29 | self._registered_msg_prefixs.setdefault(prefix, {}) 30 | self._registered_msg_prefixs[prefix].setdefault(priority, []) 31 | self._registered_msg_prefixs[prefix][priority].append(cb) 32 | 33 | ############################################################## 34 | 35 | def evt_handler(self, pkt): 36 | if pkt["TextType"] == 9: 37 | try: 38 | messages = json.loads(pkt["Message"].strip("\n"))["rawtext"] 39 | except Exception: 40 | self.game_ctrl.say_to("@a", f"无法处理数据: {pkt['Message']}") 41 | return False 42 | msg_table = [i["text"] for i in messages if i.get("text")] 43 | if not msg_table: 44 | # 极端特殊的情况 或者 不是 rawtext msg 或者 敏感词 45 | return False 46 | prefix = msg_table[0] 47 | if prefix in self._registered_msg_prefixs.keys(): 48 | for _, funcs in sorted( 49 | self._registered_msg_prefixs[prefix].items(), 50 | key=lambda x: x[0], 51 | reverse=True, 52 | ): 53 | for func in funcs: 54 | blocked = func(msg_table[1:]) 55 | if blocked is True: 56 | return True 57 | return True 58 | return False 59 | 60 | 61 | entry = plugin_entry(TellrawCb2Bot, "Cb2Bot通信") 62 | -------------------------------------------------------------------------------- /前置_Cb2Bot通信/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.2", 4 | "description": "所有使用命令方块与机器人通信的插件的前置", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | }, 8 | "plugin-type": "classic", 9 | "plugin-id": "Cb2Bot通信" 10 | } -------------------------------------------------------------------------------- /前置_Cb2Bot通信/readme.txt: -------------------------------------------------------------------------------- 1 | 让命令方块借助 tellraw 向机器人发送数据。 2 | 3 | 示例: 4 | 放置一个命令方块, 设置内容: 5 | tellraw @a[tag=robot] {"rawtext":[{"text":"example-trigger"}]} 6 | 7 | 编写一个示例的接受函数: 8 | def _cb(args: list[str]): 9 | print("I have been called!") 10 | # print(args) 11 | 然后使用该插件的 api: regist_message_cb("example-trigger", _cb) 注册回调函数 12 | 那么当每次激活命令方块时, 此回调函数都会执行一遍。 13 | 其中, "example-trigger" 这个参数对应 tellraw 第一项的内容。 14 | 15 | Q: 如果需要传递参数怎么办? 16 | 17 | 将刚刚的命令方块内容改成: 18 | tellraw @a[tag=robot] { 19 | "rawtext":[{ 20 | "text":"example-trigger" 21 | },{ 22 | "text":"nihao" 23 | },{ 24 | "selector":"@p" 25 | },{"score":{ 26 | "name":"@p","objective":"money" 27 | }} 28 | ]} 29 | 再将回调函数(只需要改回调): 30 | def _cb(args: list[str]): 31 | print("I have been called with:", args) 32 | 假设离此命令方块最近的玩家名为 Art, 他的计分板分数 money 为 99. 33 | 这样, args 就会是一个有三个成员的字符串列表, 34 | 第一项为 "nihao", 35 | 第二项为 "Art", 36 | 第三项为 "99". -------------------------------------------------------------------------------- /前置_MIDI播放器/Musicreater/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """一个简单的我的世界音频转换库 3 | 音·创 (Musicreater) 4 | 是一款免费开源的针对《我的世界》的midi音乐转换库 5 | Musicreater(音·创) 6 | A free open source library used for convert midi file into formats that is suitable for **Minecraft**. 7 | 8 | 版权所有 © 2024 音·创 开发者 9 | Copyright © 2024 all the developers of Musicreater 10 | 11 | 开源相关声明请见 仓库根目录下的 License.md 12 | Terms & Conditions: License.md in the root directory 13 | """ 14 | 15 | # 睿乐组织 开发交流群 861684859 16 | # Email TriM-Organization@hotmail.com 17 | # 若需转载或借鉴 许可声明请查看仓库目录下的 License.md 18 | 19 | __version__ = "2.0.0" 20 | __vername__ = "全新组织架构" 21 | __author__ = ( 22 | ("金羿", "Eilles Wan"), 23 | ("诸葛亮与八卦阵", "bgArray"), 24 | ("偷吃不是Touch", "Touch"), 25 | ("鱼旧梦", "ElapsingDreams"), 26 | ) 27 | __all__ = [ 28 | # 主要类 29 | "MusicSequence", 30 | "MidiConvert", 31 | # 附加类 32 | "SingleNote", 33 | "MineNote", 34 | "MineCommand", 35 | "SingleNoteBox", 36 | "ProgressBarStyle", 37 | # "TimeStamp", 未来功能 38 | # 默认值 39 | "DEFAULT_PROGRESSBAR_STYLE", 40 | "MM_INSTRUMENT_RANGE_TABLE", 41 | "MM_CLASSIC_PITCHED_INSTRUMENT_TABLE", 42 | "MM_CLASSIC_PERCUSSION_INSTRUMENT_TABLE", 43 | "MM_TOUCH_PITCHED_INSTRUMENT_TABLE", 44 | "MM_TOUCH_PERCUSSION_INSTRUMENT_TABLE", 45 | ] 46 | 47 | from .main import * 48 | -------------------------------------------------------------------------------- /前置_MIDI播放器/Musicreater/types.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | 存放数据类型的定义 5 | """ 6 | 7 | """ 8 | 版权所有 © 2024 音·创 开发者 9 | Copyright © 2024 all the developers of Musicreater 10 | 11 | 开源相关声明请见 仓库根目录下的 License.md 12 | Terms & Conditions: License.md in the root directory 13 | """ 14 | 15 | # 睿乐组织 开发交流群 861684859 16 | # Email TriM-Organization@hotmail.com 17 | # 若需转载或借鉴 许可声明请查看仓库目录下的 License.md 18 | 19 | from typing import ( 20 | Any, 21 | Dict, 22 | List, 23 | Literal, 24 | Optional, 25 | Tuple, 26 | Union, 27 | Iterable, 28 | Sequence, 29 | Mapping, 30 | Callable, 31 | ) 32 | 33 | 34 | MidiNoteNameTableType = Mapping[int, Tuple[str, ...]] 35 | """ 36 | Midi音符名称对照表类型 37 | """ 38 | 39 | MidiInstrumentTableType = Mapping[int, str] 40 | """ 41 | Midi乐器对照表类型 42 | """ 43 | 44 | FittingFunctionType = Callable[[float], float] 45 | """ 46 | 声像偏移音量拟合函数类型 47 | """ 48 | 49 | ChannelType = Dict[ 50 | int, 51 | Dict[ 52 | int, 53 | List[ 54 | Union[ 55 | Tuple[Literal["PgmC"], int, int], 56 | Tuple[Literal["NoteS"], int, int, int], 57 | Tuple[Literal["NoteE"], int, int], 58 | ] 59 | ], 60 | ], 61 | ] 62 | """ 63 | 以字典所标记的频道信息类型(已弃用) 64 | 65 | Dict[int,Dict[int,List[Union[Tuple[Literal["PgmC"], int, int],Tuple[Literal["NoteS"], int, int, int],Tuple[Literal["NoteE"], int, int],]],],] 66 | """ 67 | -------------------------------------------------------------------------------- /前置_MIDI播放器/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.2.6", 4 | "description": "所有使用解析和播放midi音乐功能的插件的前置组件", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "MC-MIDIPlayer" 9 | } -------------------------------------------------------------------------------- /前置_MIDI播放器/mido/messages/__init__.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2016 Ole Martin Bjorndalen 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from .checks import check_time 6 | from .messages import ( 7 | BaseMessage, 8 | Message, 9 | format_as_string, 10 | parse_string, 11 | parse_string_stream, 12 | ) 13 | from .specs import ( 14 | MAX_PITCHWHEEL, 15 | MAX_SONGPOS, 16 | MIN_PITCHWHEEL, 17 | MIN_SONGPOS, 18 | SPEC_BY_STATUS, 19 | SPEC_BY_TYPE, 20 | SPEC_LOOKUP, 21 | ) 22 | 23 | __all__ = [ 24 | "BaseMessage", 25 | "MAX_PITCHWHEEL", 26 | "MAX_SONGPOS", 27 | "MIN_PITCHWHEEL", 28 | "MIN_SONGPOS", 29 | "Message", 30 | "SPEC_BY_STATUS", 31 | "SPEC_BY_TYPE", 32 | "SPEC_LOOKUP", 33 | "check_time", 34 | "format_as_string", 35 | "parse_string", 36 | "parse_string_stream", 37 | ] 38 | -------------------------------------------------------------------------------- /前置_MIDI播放器/mido/messages/encode.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2016 Ole Martin Bjorndalen 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from .specs import CHANNEL_MESSAGES, MIN_PITCHWHEEL, SPEC_BY_TYPE 6 | 7 | 8 | def _encode_pitchwheel(msg): 9 | pitch = msg["pitch"] - MIN_PITCHWHEEL 10 | return [0xE0 | msg["channel"], pitch & 0x7F, pitch >> 7] 11 | 12 | 13 | def _encode_sysex(msg): 14 | return [0xF0] + list(msg["data"]) + [0xF7] 15 | 16 | 17 | def _encode_quarter_frame(msg): 18 | return [0xF1, msg["frame_type"] << 4 | msg["frame_value"]] 19 | 20 | 21 | def _encode_songpos(data): 22 | pos = data["pos"] 23 | return [0xF2, pos & 0x7F, pos >> 7] 24 | 25 | 26 | def _encode_note_off(msg): 27 | return [0x80 | msg["channel"], msg["note"], msg["velocity"]] 28 | 29 | 30 | def _encode_note_on(msg): 31 | return [0x90 | msg["channel"], msg["note"], msg["velocity"]] 32 | 33 | 34 | def _encode_control_change(msg): 35 | return [0xB0 | msg["channel"], msg["control"], msg["value"]] 36 | 37 | 38 | _SPECIAL_CASES = { 39 | "pitchwheel": _encode_pitchwheel, 40 | "sysex": _encode_sysex, 41 | "quarter_frame": _encode_quarter_frame, 42 | "songpos": _encode_songpos, 43 | # These are so common that they get special cases to speed things up. 44 | "note_off": _encode_note_off, 45 | "note_on": _encode_note_on, 46 | "control_change": _encode_control_change, 47 | } 48 | 49 | 50 | def encode_message(msg): 51 | """Encode msg dict as a list of bytes. 52 | 53 | TODO: Add type and value checking. 54 | (Can be turned off with keyword argument.) 55 | 56 | This is not a part of the public API. 57 | """ 58 | 59 | encode = _SPECIAL_CASES.get(msg["type"]) 60 | if encode: 61 | return encode(msg) 62 | else: 63 | spec = SPEC_BY_TYPE[msg["type"]] 64 | status_byte = spec["status_byte"] 65 | 66 | if status_byte in CHANNEL_MESSAGES: 67 | status_byte |= msg["channel"] 68 | 69 | data = [msg[name] for name in spec["value_names"] if name != "channel"] 70 | 71 | return [status_byte] + data 72 | -------------------------------------------------------------------------------- /前置_MIDI播放器/mido/messages/strings.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2016 Ole Martin Bjorndalen 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from .specs import SPEC_BY_TYPE, make_msgdict 6 | 7 | 8 | def msg2str(msg, include_time=True): 9 | type_ = msg["type"] 10 | spec = SPEC_BY_TYPE[type_] 11 | 12 | words = [type_] 13 | 14 | for name in spec["value_names"]: 15 | value = msg[name] 16 | 17 | if name == "data": 18 | value = "({})".format(",".join(str(byte) for byte in value)) 19 | words.append(f"{name}={value}") 20 | 21 | if include_time: 22 | words.append("time={}".format(msg["time"])) 23 | 24 | return str.join(" ", words) 25 | 26 | 27 | def _parse_time(value): 28 | # Convert to int if possible. 29 | try: 30 | return int(value) 31 | except ValueError: 32 | pass 33 | 34 | try: 35 | return float(value) 36 | except ValueError: 37 | pass 38 | 39 | raise ValueError(f"invalid time {value!r}") 40 | 41 | 42 | def _parse_data(value): 43 | if not value.startswith("(") and value.endswith(")"): 44 | raise ValueError("missing parentheses in data message") 45 | 46 | try: 47 | return [int(byte) for byte in value[1:-1].split(",")] 48 | except ValueError as ve: 49 | raise ValueError("unable to parse data bytes") from ve 50 | 51 | 52 | def str2msg(text): 53 | """Parse str format and return message dict. 54 | 55 | No type or value checking is done. The caller is responsible for 56 | calling check_msgdict(). 57 | """ 58 | words = text.split() 59 | type_ = words[0] 60 | args = words[1:] 61 | 62 | msg = {} 63 | 64 | for arg in args: 65 | name, value = arg.split("=", 1) 66 | if name == "time": 67 | value = _parse_time(value) 68 | elif name == "data": 69 | value = _parse_data(value) 70 | else: 71 | value = int(value) 72 | 73 | msg[name] = value 74 | 75 | return make_msgdict(type_, msg) 76 | -------------------------------------------------------------------------------- /前置_MIDI播放器/mido/midifiles/__init__.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2016 Ole Martin Bjorndalen 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from .meta import KeySignatureError, MetaMessage, UnknownMetaMessage 6 | from .midifiles import MidiFile 7 | from .tracks import MidiTrack, merge_tracks 8 | from .units import bpm2tempo, second2tick, tempo2bpm, tick2second 9 | 10 | __all__ = [ 11 | "KeySignatureError", 12 | "MetaMessage", 13 | "MidiFile", 14 | "MidiTrack", 15 | "UnknownMetaMessage", 16 | "bpm2tempo", 17 | "merge_tracks", 18 | "second2tick", 19 | "tempo2bpm", 20 | "tick2second", 21 | ] 22 | -------------------------------------------------------------------------------- /前置_MIDI播放器/mido/midifiles/units.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2017 Ole Martin Bjorndalen 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | 6 | def tick2second(tick, ticks_per_beat, tempo): 7 | """Convert absolute time in ticks to seconds. 8 | 9 | Returns absolute time in seconds for a chosen MIDI file time resolution 10 | (ticks/pulses per quarter note, also called PPQN) and tempo (microseconds 11 | per quarter note). 12 | """ 13 | scale = tempo * 1e-6 / ticks_per_beat 14 | return tick * scale 15 | 16 | 17 | def second2tick(second, ticks_per_beat, tempo): 18 | """Convert absolute time in seconds to ticks. 19 | 20 | Returns absolute time in ticks for a chosen MIDI file time resolution 21 | (ticks/pulses per quarter note, also called PPQN) and tempo (microseconds 22 | per quarter note). Normal rounding applies. 23 | """ 24 | scale = tempo * 1e-6 / ticks_per_beat 25 | return int(round(second / scale)) 26 | 27 | 28 | def bpm2tempo(bpm, time_signature=(4, 4)): 29 | """Convert BPM (beats per minute) to MIDI file tempo (microseconds per 30 | quarter note). 31 | 32 | Depending on the chosen time signature a bar contains a different number of 33 | beats. These beats are multiples/fractions of a quarter note, thus the 34 | returned BPM depend on the time signature. Normal rounding applies. 35 | """ 36 | return int(round(60 * 1e6 / bpm * time_signature[1] / 4.0)) 37 | 38 | 39 | def tempo2bpm(tempo, time_signature=(4, 4)): 40 | """Convert MIDI file tempo (microseconds per quarter note) to BPM (beats 41 | per minute). 42 | 43 | Depending on the chosen time signature a bar contains a different number of 44 | beats. The beats are multiples/fractions of a quarter note, thus the 45 | returned tempo depends on the time signature denominator. 46 | """ 47 | return 60 * 1e6 / tempo * time_signature[1] / 4.0 48 | -------------------------------------------------------------------------------- /前置_MIDI播放器/mido/syx.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2014 Ole Martin Bjorndalen 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | """ 6 | Read and write SYX file format 7 | """ 8 | 9 | import re 10 | 11 | from .parser import Parser 12 | 13 | 14 | def read_syx_file(filename): 15 | """Read sysex messages from SYX file. 16 | 17 | Returns a list of sysex messages. 18 | 19 | This handles both the text (hexadecimal) and binary 20 | formats. Messages other than sysex will be ignored. Raises 21 | ValueError if file is plain text and byte is not a 2-digit hex 22 | number. 23 | """ 24 | with open(filename, "rb") as infile: 25 | data = infile.read() 26 | 27 | if len(data) == 0: 28 | # Empty file. 29 | return [] 30 | 31 | parser = Parser() 32 | 33 | if data[0] == 240: 34 | # Binary format. 35 | parser.feed(data) 36 | else: 37 | text = data.decode("latin1") 38 | data = bytearray.fromhex(re.sub(r"\s", " ", text)) 39 | parser.feed(data) 40 | 41 | return [msg for msg in parser if msg.type == "sysex"] 42 | 43 | 44 | def write_syx_file(filename, messages, plaintext=False): 45 | """Write sysex messages to a SYX file. 46 | 47 | Messages other than sysex will be skipped. 48 | 49 | By default this will write the binary format. Pass 50 | ``plaintext=True`` to write the plain text format (hex encoded 51 | ASCII text). 52 | """ 53 | messages = [m for m in messages if m.type == "sysex"] 54 | 55 | if plaintext: 56 | with open(filename, "w") as outfile: 57 | for message in messages: 58 | outfile.write(message.hex()) 59 | outfile.write("\n") 60 | else: 61 | with open(filename, "wb") as outfile: 62 | for message in messages: 63 | outfile.write(message.bin()) 64 | -------------------------------------------------------------------------------- /前置_ToolDeltaFlet/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Hazelmeow", 3 | "version": "0.0.4", 4 | "plugin-type": "classic", 5 | "description": "ToolDeltaFlet (TDF) - 租赁服远程管理网页", 6 | "pre-plugins": { 7 | "pip": "0.0.4" 8 | }, 9 | "plugin-id": "ToolDeltaFlet", 10 | "enabled": true 11 | } -------------------------------------------------------------------------------- /前置_tps计算器/__init__.py: -------------------------------------------------------------------------------- 1 | import time 2 | from tooldelta import Plugin, constants, plugin_entry 3 | 4 | 5 | class TPSCalculator(Plugin): 6 | name = "前置-TPS计算器" 7 | author = "SuperScript" 8 | version = (0, 0, 1) 9 | lt = time.time() 10 | lt1 = 0 11 | _tps = 20 12 | 13 | def __init__(self, frame): 14 | super().__init__(frame) 15 | self.ListenPacket(constants.PacketIDS.IDTickSync, self.listener) 16 | 17 | def listener(self, pkt): 18 | self.calc_tps(pkt) 19 | return False 20 | 21 | def calc_tps(self, pkt): 22 | ntime = time.time() 23 | servert = pkt["ServerReceptionTimestamp"] 24 | self._tps = min(20, (servert - self.lt1) / (ntime - self.lt)) 25 | self.lt = ntime 26 | self.lt1 = servert 27 | 28 | def get_tps(self): 29 | if time.time() - self.lt > 40: 30 | # server maybe dead 31 | return 0 32 | else: 33 | return self._tps 34 | 35 | 36 | entry = plugin_entry(TPSCalculator, "tps计算器") 37 | -------------------------------------------------------------------------------- /前置_tps计算器/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.1", 4 | "description": "提供了获取tps的接口", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "tpscalculator" 9 | } -------------------------------------------------------------------------------- /前置_世界交互/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "1.0.2", 4 | "description": "所有使用世界交互的插件的前置", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.0.1", 8 | "pip": "0.0.1" 9 | }, 10 | "plugin-type": "classic", 11 | "plugin-id": "前置-世界交互" 12 | } -------------------------------------------------------------------------------- /前置_主动区块请求/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "2B", 3 | "version": "0.2.4", 4 | "plugin-type": "classic", 5 | "description": "自动请求区块数据,并将二进制化的数据分发给任何需要的插件", 6 | "pre-plugins": { 7 | "循环获取玩家坐标": "0.0.4" 8 | }, 9 | "plugin-id": "主动区块请求", 10 | "enabled": true 11 | } -------------------------------------------------------------------------------- /前置_基本插件功能库/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.11", 4 | "description": "所有使用基本组件API的插件的前置", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "基本插件功能库" 9 | } -------------------------------------------------------------------------------- /前置_大字替换/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Plugin, utils, plugin_entry 2 | 3 | 4 | class BigCharReplace(Plugin): 5 | author = "SuperScript" 6 | name = "前置-大字替换" 7 | 8 | @staticmethod 9 | def replaceBig(t: str): 10 | """ 11 | 将给定的字符串中的所有可替换符号替换为大字符号 12 | Args: 13 | t (str): _description_ 14 | Returns: 15 | _type_: _description_ 16 | """ 17 | return utils.simple_fmt( 18 | { 19 | "0": "0", 20 | "1": "1", 21 | "2": "2", 22 | "3": "3", 23 | "4": "4", 24 | "5": "5", 25 | "6": "6", 26 | "7": "7", 27 | "8": "8", 28 | "9": "9", 29 | "a": "a", 30 | "b": "b", 31 | "c": "c", 32 | "d": "d", 33 | "e": "e", 34 | "f": "f", 35 | "g": "g", 36 | "h": "h", 37 | "i": "i", 38 | "j": "j", 39 | "k": "k", 40 | "l": "l", 41 | "m": "m", 42 | "n": "n", 43 | "o": "o", 44 | "p": "p", 45 | "q": "q", 46 | "r": "r", 47 | "s": "s", 48 | "t": "t", 49 | "u": "u", 50 | "v": "v", 51 | "w": "w", 52 | "x": "x", 53 | "y": "y", 54 | "z": "z", 55 | "A": "A", 56 | "B": "B", 57 | "C": "C", 58 | "D": "D", 59 | "E": "E", 60 | "F": "F", 61 | "G": "G", 62 | "H": "H", 63 | "I": "I", 64 | "J": "J", 65 | "K": "K", 66 | "L": "L", 67 | "M": "M", 68 | "N": "N", 69 | "O": "O", 70 | "P": "P", 71 | "Q": "Q", 72 | "R": "R", 73 | "S": "S", 74 | "T": "T", 75 | "U": "U", 76 | "V": "V", 77 | "W": "W", 78 | "X": "X", 79 | "Y": "Y", 80 | "Z": "Z", 81 | }, 82 | t, 83 | ) 84 | 85 | 86 | entry = plugin_entry(BigCharReplace, "大字替换") 87 | -------------------------------------------------------------------------------- /前置_大字替换/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "ToolDelta", 3 | "version": "0.0.2", 4 | "description": "所有使用大字替换API的插件的前置", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "bigchar-replace" 9 | } -------------------------------------------------------------------------------- /前置_循环获取玩家坐标/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "ToolDelta", 3 | "version": "0.0.5", 4 | "description": "前置插件, 通过此插件的 1s 更新一次(可更改)玩家坐标可获取全服玩家的坐标", 5 | "plugin-type": "classic", 6 | "pre-plugins": {}, 7 | "limit_launcher": null, 8 | "plugin-id": "循环获取玩家坐标" 9 | } -------------------------------------------------------------------------------- /前置_玩家XUID获取/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "System", 3 | "version": "0.0.7", 4 | "description": "通过 XUID 获取玩家名或通过玩家名获取 XUID", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.0.1" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "XUID获取" 11 | } -------------------------------------------------------------------------------- /前置_统一消息风格/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "ToolDelta", 3 | "version": "0.0.2", 4 | "plugin-type": "classic", 5 | "description": "统一对玩家显示的消息的风格 (如成功、失败、报错等)", 6 | "pre-plugins": {}, 7 | "plugin-id": "统一消息风格", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /前置_聊天栏菜单/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.3.7", 4 | "description": "新聊天栏菜单, 支持参数类型检测等", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "聊天栏菜单" 9 | } -------------------------------------------------------------------------------- /前置_聊天栏菜单/使用方法.md: -------------------------------------------------------------------------------- 1 | 添加聊天栏菜单(旧式方法): 2 | 3 | --- 4 | ## chatbar.add_new_trigger 5 | 6 | | 参数 | 类型 | 描述 | 7 | | --- | --- | --- | 8 | | **triggers** | list[str] | 触发词列表 | 9 | | **argument_hint** | tuple | 参数提示和类型等 | 10 | | **usage** | str | 触发词提示信息 | 11 | | **func** | (Player, tuple) | 回调函数,传入玩家对象和参数列表 | 12 | | **op_only** | bool | 是否仅限管理员触发 | 13 | 14 | - 触发词列表: 15 | - 可以用多种触发词以使用该菜单项 16 | - 如:`["help", "帮助"]` 意为输入 `.help` 或 `.帮助` 都可以触发该菜单项。 17 | 18 | - 参数提示和类型: 19 | - 类型:`list[tuple[str, VALID_ARGUMENT_HINT_TYPES, VALID_ARG_VALUE], ...]` 20 | - 为一个元组列表,其中列表里的每个元组中: 21 | - 第一项:参数提示名 `str` 22 | - 第二项:参数类型,可以为 `str`、`int`、`float`、`bool` 23 | - 第三项:参数默认值,如果为 None 则表示该项没有默认值,也就是不能为空 24 | 25 | - 回调函数: 26 | - 在该菜单项被触发时调用的函数。 27 | - 接受两个参数: 28 | - `Player`: 使用菜单的玩家对象 29 | - `tuple`: 玩家提供的参数项,按照你给定的参数类型进行传入。 30 | 31 | 示例: 32 | 33 | ```python 34 | def on_buy_test(player: Player, args: tuple): 35 | buy_item: str = args[0] 36 | buy_count: int = args[1] 37 | print(f"玩家 {player.name} 购买了 {buy_count} 个 {buy_item}") 38 | 39 | chatbar.add_new_trigger( 40 | ["buy", "购买"], 41 | [ 42 | ("物品名", str, None), 43 | ("数量", int, 1), 44 | ], 45 | "购买物品", 46 | on_buy_test 47 | ) 48 | 49 | # 玩家A说: .buy apple 3 50 | # print: 玩家 A 购买了 3 个 apple 51 | 52 | # 玩家B说: .buy apple 53 | # print: 玩家 B 购买了 1 个 apple 54 | 55 | # 玩家C说: .buy banana foo 56 | # 玩家C收到错误信息: foo 不是一个整数 57 | 58 | # 玩家D说: .buy banana 1.5 59 | # 玩家D收到错误信息: 1.5 不是一个整数 60 | 61 | # 玩家E说: .buy 62 | # 玩家E收到错误信息: 参数个数错误, 至少需要 1 个参数 63 | 64 | # 玩家F说: .buy apple 1 2 65 | # 玩家F收到错误信息: 参数个数错误, 最多 2 个参数 66 | ``` 67 | --- 68 | 69 | ## chatbar.add_trigger 70 | 71 | | 参数 | 类型 | 描述 | 72 | | --- | --- | --- | 73 | | **triggers** | list[str] | 触发词列表 | 74 | | **argument_hint** | str \| None | 参数提示信息,为 None 时不显示参数提示信息 | 75 | | **usage** | str | 触发词提示信息 | 76 | | **func** | `(str, list[str]) -> None` | 触发时执行的函数,传入:玩家名,菜单参数列表 | 77 | | (可选)**args_pd** | `(int) -> bool` | 参数个数校验,传入参数数量,返回是否合法。默认为 `lambda _: True` | 78 | | (可选)**op_only** | bool | 是否仅管理员可用。默认为 `False` | 79 | 80 | 示例: 81 | ```python 82 | def menu_cb(playername: str, args: list): 83 | print(f"玩家名: {playername}") 84 | print(f"参数列表: {args}") 85 | 86 | chatbar.add_trigger(["test"], "[参数1] [参数2]..", "测试菜单触发词", menu_cb) 87 | 88 | # 玩家A: .test 1 2 3 89 | # 输出: 90 | # 玩家名: 玩家A 91 | # 参数列表: ['1', '2', '3'] 92 | 93 | ``` -------------------------------------------------------------------------------- /区块显示器/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Player, Plugin, ToolDelta, TYPE_CHECKING, plugin_entry 2 | from tooldelta.game_utils import getPosXYZ 3 | 4 | 5 | class ChunkShow(Plugin): 6 | name = "区块显示器" 7 | author = "SnowLotus" 8 | version = (0, 0, 3) 9 | 10 | def __init__(self, frame: ToolDelta): 11 | super().__init__(frame) 12 | self.ListenPreload(self.on_def) 13 | self.ListenActive(self.on_inject) 14 | 15 | def on_def(self): 16 | self.chatbar_menu = self.GetPluginAPI("聊天栏菜单") 17 | if TYPE_CHECKING: 18 | from 前置_聊天栏菜单 import ChatbarMenu 19 | 20 | self.chatbar_menu: ChatbarMenu 21 | 22 | def on_inject(self): 23 | self.chatbar_menu.add_new_trigger( 24 | ["显示区块", "区块范围"], 25 | [], 26 | "显示当前所在区块的起始点和终止点", 27 | self.show_chunk, 28 | ) 29 | self.chatbar_menu.add_new_trigger( 30 | ["地图画起点"], [], "显示当前可用作地图画区域的起点", self.get_map_chunk 31 | ) 32 | 33 | def show_chunk(self, player: Player, _): 34 | x, _, z = getPosXYZ(player.name) 35 | chunk_start_x = int(x // 8) * 8 36 | chunk_start_z = int(z // 8) * 8 37 | player.show(f"§7§l[§f>] §r§f当前区块起始点: ({chunk_start_x}, {chunk_start_z})") 38 | player.show( 39 | f"§7§l[§f>] §r§f当前区块终止点: ({chunk_start_x + 7}, {chunk_start_z + 7})", 40 | ) 41 | 42 | def get_map_chunk(self, player: Player, _): 43 | x, y, z = getPosXYZ(player.name) 44 | chunk_start_x = int(x // 128) * 128 45 | chunk_start_z = int(z // 128) * 128 46 | player.show( 47 | f"§7§l[§f>] §r§f当前地图画区块起始点: ({chunk_start_x}, {chunk_start_z})", 48 | ) 49 | 50 | entry = plugin_entry(ChunkShow) -------------------------------------------------------------------------------- /区块显示器/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SnowLotus", 3 | "version": "0.0.3", 4 | "description": "使用 显示区块 聊天栏指令来查看区块范围, 使用 地图画起点 指令来查看地图画起点", 5 | "plugin-type": "classic", 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.0.1" 8 | }, 9 | "limit_launcher": null, 10 | "plugin-id": "chunk-show" 11 | } -------------------------------------------------------------------------------- /单方块空岛系统/data_operation.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | 4 | def save_data(data_path, data): 5 | bat_path = data_path + ".bat" 6 | try: 7 | with open(data_path, "r", encoding="utf-8") as f: 8 | old_data = json.load(f) 9 | 10 | with open(bat_path, "w", encoding="utf-8") as f: 11 | json.dump(old_data, f) 12 | 13 | with open(data_path, "w", encoding="utf-8") as f: 14 | json.dump(data, f) 15 | 16 | except: 17 | with open(data_path, "w", encoding="utf-8") as f: 18 | json.dump(data, f) 19 | 20 | with open(bat_path, "w", encoding="utf-8") as f: 21 | json.dump(data, f) 22 | 23 | 24 | def load_data(data_path): 25 | bat_path = data_path + ".bat" 26 | try: 27 | with open(data_path, "r", encoding="utf-8") as f: 28 | data = json.load(f) 29 | 30 | except: 31 | try: 32 | with open(bat_path, "r", encoding="utf-8") as f: 33 | data = json.load(f) 34 | 35 | except: 36 | data = {} 37 | 38 | return data 39 | -------------------------------------------------------------------------------- /单方块空岛系统/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫七街", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "单方块空岛", 6 | "pre-plugins": {}, 7 | "plugin-id": "单方块空岛系统" 8 | } -------------------------------------------------------------------------------- /发言频率限制/__init__.py: -------------------------------------------------------------------------------- 1 | import time 2 | from tooldelta import ToolDelta, cfg, Chat, Player, Plugin, plugin_entry, TYPE_CHECKING 3 | 4 | 5 | class ChatFreqLimit(Plugin): 6 | name = "发言频率限制v1" 7 | author = "wling/7912" 8 | version = (0, 0, 6) 9 | 10 | def __init__(self, frame: ToolDelta): 11 | super().__init__(frame) 12 | STD_BAN_CFG = {"时间内": int, "在时间内达到多少条": int} 13 | DEFAULT_BAN_CFG = { 14 | "时间内": 3, 15 | "在时间内达到多少条": 6, 16 | } 17 | self.cfg, _ = cfg.get_plugin_config_and_version( 18 | self.name, STD_BAN_CFG, DEFAULT_BAN_CFG, self.version 19 | ) 20 | self.playerMsgTimeDict = {} 21 | self.msgSendNunMaxPerTime = self.cfg["时间内"] 22 | self.msgSendNumMax = self.cfg["在时间内达到多少条"] 23 | self.ListenPreload(self.on_preload) 24 | self.ListenChat(self.on_chat) 25 | self.ListenPlayerLeave(self.on_player_leave) 26 | 27 | def on_preload(self): 28 | ban_plugin = self.GetPluginAPI("封禁系统") 29 | if TYPE_CHECKING: 30 | from 封禁系统 import BanSystem 31 | 32 | ban_plugin: BanSystem 33 | self.ban = ban_plugin.ban 34 | 35 | def on_chat(self, chat: Chat): 36 | playername = chat.player.name 37 | if not chat.player.is_op(): 38 | msgSendTime = time.time() 39 | if playername not in self.playerMsgTimeDict: 40 | self.playerMsgTimeDict[playername] = [] 41 | for i in self.playerMsgTimeDict[playername][:]: 42 | if i <= msgSendTime - self.msgSendNunMaxPerTime: 43 | self.playerMsgTimeDict[playername].remove(i) 44 | self.playerMsgTimeDict[playername].append(msgSendTime) 45 | if len(self.playerMsgTimeDict[playername]) >= self.msgSendNumMax: 46 | # 生成时间戳,比现在多五分钟,传参给 47 | # ban(playername, int(time.time()) + 300, "发信息过快") 48 | self.ban(playername, int(time.time()) + 300, "发信息过快") 49 | self.playerMsgTimeDict[playername] = [] 50 | 51 | def on_player_leave(self, player: Player): 52 | if player.name in self.playerMsgTimeDict: 53 | del self.playerMsgTimeDict[player.name] 54 | 55 | 56 | entry = plugin_entry(ChatFreqLimit) 57 | -------------------------------------------------------------------------------- /发言频率限制/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "wling/7912", 3 | "version": "0.0.6", 4 | "description": "整治天天刷屏的家伙吧!", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "封禁系统": "0.0.1" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "发言频率限制" 11 | } -------------------------------------------------------------------------------- /发言频率限制v2/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.1.1", 4 | "plugin-type": "classic", 5 | "description": "制裁刷屏玩家;请在配置文件里配置刷屏检测功能", 6 | "pre-plugins": {}, 7 | "plugin-id": "发言频率限制v2" 8 | } -------------------------------------------------------------------------------- /可升级云仓库/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Ka3mora", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "云空间存储物品,仓库共八个等级,可设置", 6 | "pre-plugins": {}, 7 | "plugin-id": "可升级云仓库存储", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /可升级云仓库/readme.txt: -------------------------------------------------------------------------------- 1 | //该仓库可升级,共设计八级,升级开销和物品容量在源码对应自己改 2 | //除不死图腾外不可叠加的物品无法储存 3 | //因为取出使用的give指令,所以需要自己留好背包,不然物品会被吞 4 | //因为作者xuid获取的方法还没看,所以此插件仓库不支持玩家改名,改名后仓库留存数据但是目标玩家无法使用,需要去数据文件player.json手动改 5 | //作者ka3mora,现用qq3940274443,有相关建议可以直接q我 -------------------------------------------------------------------------------- /命令发送监视器/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "ToolDelta", 3 | "version": "0.0.1", 4 | "description": "在控制台使用 §ecmdt§r 命令来开启监听或者取消监听 ToolDelta 发送的所有指令", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "cmdsender-monitor" 9 | } -------------------------------------------------------------------------------- /命令方块代发言支持/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Plugin, plugin_entry, Chat, constants 2 | from tooldelta.utils import packet_transition 3 | 4 | class NewPlugin(Plugin): 5 | name = "命令方块代发言支持" 6 | author = "SuperScript" 7 | version = (0, 0, 1) 8 | 9 | def __init__(self, frame): 10 | super().__init__(frame) 11 | self.ListenPacket(constants.PacketIDS.Text, self.on_chat_pk) 12 | 13 | def on_chat_pk(self, pk: dict): 14 | sender, msg, verified = packet_transition.get_playername_and_msg_from_text_packet(self.frame, pk) 15 | if sender is None or msg is None or sender not in self.game_ctrl.allplayers: 16 | return False 17 | player = self.frame.get_players().getPlayerByName(sender) 18 | if player is None: 19 | return False 20 | if not verified: 21 | self.frame.plugin_group.execute_chat(Chat(player, msg), self.frame.on_plugin_err) 22 | return False 23 | 24 | 25 | entry = plugin_entry(NewPlugin) 26 | -------------------------------------------------------------------------------- /命令方块代发言支持/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "ToolDelta 在 1.0.4 版本拦截了所有可能伪造的发言。\n会导致一些命令方块 execute 玩家发言全部失效。\n此插件正是修复此问题。\n§c安装此插件后, ToolDelta 将不再对发言进行辨伪!", 6 | "pre-plugins": {}, 7 | "plugin-id": "cb-say-supporter", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /商店系统/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "ToolDelta Demo", 3 | "version": "0.0.2", 4 | "plugin-type": "classic", 5 | "description": "ToolDelta 的示例教学插件 Pro - 可以在配置文件自定义出售和收购的商品", 6 | "pre-plugins": { 7 | "前置-世界交互": "0.0.4" 8 | }, 9 | "plugin-id": "demo-plugin-shop-pro" 10 | } -------------------------------------------------------------------------------- /商店系统/配置.json: -------------------------------------------------------------------------------- 1 | { 2 | "配置版本": "0.0.2", 3 | "配置项": { 4 | "货币计分板名": "猫猫币", 5 | "出售": { 6 | "煤炭": { 7 | "ID": "coal", 8 | "价格": 300 9 | }, 10 | "金锭": { 11 | "ID": "gold_ingot", 12 | "价格": 500 13 | }, 14 | "红石粉": { 15 | "ID": "redstone", 16 | "价格": 500 17 | }, 18 | "青金石": { 19 | "ID": "lapis_lazuli", 20 | "价格": 800 21 | }, 22 | "铁锭": { 23 | "ID": "iron_ingot", 24 | "价格": 800 25 | }, 26 | "钻石": { 27 | "ID": "diamond", 28 | "价格": 1500 29 | }, 30 | "绿宝石": { 31 | "ID": "emerald", 32 | "价格": 1500 33 | }, 34 | "下界石英": { 35 | "ID": "quartz", 36 | "价格": 300 37 | }, 38 | "§r§f普通 §7> §p基础鱼饵": { 39 | "ID": "struct:普通基础饵", 40 | "价格": 20 41 | }, 42 | "§r§f普通 §7> §p爆率鱼饵": { 43 | "ID": "struct:普通爆率饵", 44 | "价格": 25 45 | }, 46 | "§r§f普通 §7> §p连钓鱼饵": { 47 | "ID": "struct:普通连钓饵", 48 | "价格": 25 49 | }, 50 | "§r§f普通 §7> §p空钩鱼饵": { 51 | "ID": "struct:普通空钩饵", 52 | "价格": 25 53 | }, 54 | "§r§f普通 §7> §p综合鱼饵": { 55 | "ID": "struct:普通综合饵", 56 | "价格": 25 57 | } 58 | }, 59 | "收购": { 60 | "煤炭": { 61 | "ID": "coal", 62 | "价格": 150 63 | }, 64 | "金锭": { 65 | "ID": "gold_ingot", 66 | "价格": 300 67 | }, 68 | "红石粉": { 69 | "ID": "redstone", 70 | "价格": 300 71 | }, 72 | "青金石": { 73 | "ID": "lapis_lazuli", 74 | "价格": 450 75 | }, 76 | "铁锭": { 77 | "ID": "iron_ingot", 78 | "价格": 450 79 | }, 80 | "钻石": { 81 | "ID": "diamond", 82 | "价格": 850 83 | }, 84 | "绿宝石": { 85 | "ID": "emerald", 86 | "价格": 850 87 | }, 88 | "下界石英": { 89 | "ID": "quartz", 90 | "价格": 150 91 | } 92 | } 93 | } 94 | } -------------------------------------------------------------------------------- /基础聊天栏菜单/Readme.md: -------------------------------------------------------------------------------- 1 | # 聊天栏菜单 2 | 3 | --- 4 | 5 |
6 |

此插件通过魔改聊天栏菜单_前置插件实现

7 |

安装这个插件无需安装聊天栏菜单_前置插件

8 |

也可以和聊天栏菜单_前置插件一起使用

9 |
10 | 11 | --- 12 | 13 | ## 聊天栏菜单是什么? 14 | 聊天栏菜单是一个可以在聊天栏中显示的菜单,可以通过点击菜单项来执行命令。 15 | 16 | --- 17 | 18 | ## 如何使用? 19 | ### 安装 20 | 放进类插件直接使用就行了 21 | 22 | ### 配置 23 | 在`__init__.py`中修改以下变量为你服务器的配置 24 | ```python 25 | CURRENCY_SCOREBOARD = "金币" # 金币计分板 26 | ONLINE_TIME_SCOREBOARD = "§l§b在§e线§d时§a间" # 在线时间计分板 27 | DEFAULT_HUB_COORDS = [1015, 235, 108] # 主城坐标 28 | DEFAULT_SHOP_COORDS = [928, 235, -81] # 商店坐标 29 | HUB_COORDS_FILE = "hub_coords.json" # 主城坐标文件(可以不管) 30 | SHOP_COORDS_FILE = "shop_coords.json" # 商店坐标文件(可以不管) 31 | MAX_TRANSFER_AMOUNT = 10000 # 最大转账金额 32 | ``` 33 | 34 | 在kimi.py中修改以下变量为你的kimi的api_key 35 | ```python 36 | def askai(text): 37 | # ------------------------------------------------ 38 | api_key = 1234567890 # 请替换成你的Kimi API Key,可以去https://platform.moonshot.cn/docs/guide/start-using-kimi-api获取 39 | # ------------------------------------------------ 40 | ``` 41 | 42 | ### 使用 43 | 在聊天栏输入`.help`即可打开菜单帮助 44 | -------------------------------------------------------------------------------- /基础聊天栏菜单/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "帥気的男主角", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "", 6 | "pre-plugins": {}, 7 | "plugin-id": "基础聊天栏菜单" 8 | } -------------------------------------------------------------------------------- /基础聊天栏菜单/kimi.py: -------------------------------------------------------------------------------- 1 | import http.client 2 | import json 3 | 4 | def askai(text): 5 | # ------------------------------------------------ 6 | api_key = 1234567890 # 请替换成你的Kimi API Key,可以去https://platform.moonshot.cn/docs/guide/start-using-kimi-api获取 7 | # ------------------------------------------------ 8 | conn = http.client.HTTPSConnection("api.moonshot.cn") 9 | payload = json.dumps({ 10 | "model": "moonshot-v1-8k", 11 | "messages": [ 12 | {"role": "system", "content": f"你是一个回答问题的大师,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答,并且不会有相关词汇出现。并且回答的句子每次不超过5句,而且十分简洁,不会使用markdown格式,换行会在行末添加\n"}, 13 | {"role": "user", "content": f"请简要回答我,5句话以内:{text}"} 14 | ], 15 | "temperature": 0.3 16 | }) 17 | headers = { 18 | 'Content-Type': 'application/json', 19 | 'Authorization': f'Bearer {api_key}' 20 | } 21 | conn.request("POST", "/v1/chat/completions", payload, headers) 22 | res = conn.getresponse() 23 | data = res.read() 24 | completion = json.loads(data.decode("utf-8")) 25 | ans = completion['choices'][0]['message'] 26 | return ans['content'] 27 | 28 | -------------------------------------------------------------------------------- /多功能玩家互传/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "wling/SuperScript", 3 | "version": "0.1.3", 4 | "plugin-type": "classic", 5 | "description": "提供了两种玩家互传功能(传送过去和传送到此), 也支持修改自身互传设置", 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.3.7" 8 | }, 9 | "plugin-id": "nice-tpa", 10 | "enabled": true 11 | } -------------------------------------------------------------------------------- /多服聊天互通/README.txt: -------------------------------------------------------------------------------- 1 | 本插件支持java版与租赁服互通,你可以在github上查看源码与释放文件(jar) 2 | https://github.com/WuMing233qwq/MCChatLinker 3 | 4 | 自定义指令 5 | . 6 | 7 | 8 | 思来想去防止有些人看不懂,写这个文件 9 | 废话很多,如果你很聪明,只看配置文件应该都会了 10 | 11 | 如果你不会↓ 12 | 13 | 如何使用? 14 | 最初我是想要做一个插件作为消息的转发服务端的,但是考虑到面板服用户,这个想法就被放弃了 15 | 所以,本插件会通过一个服务器来转发各种消息,我为你们免费提供了一个服务器,他在默认配置中就有了 16 | (如果你有所顾虑,可以获取我的源码自己搭建服务端) 17 | 18 | 既然是公用的,那么就不能把消息全都转发了。所以说,你需要在\插件配置文件\多服聊天互通.json中 19 | 找到"加入的聊天频道",它的默认值是["public"],这是一个公共的聊天频道,你可以随便输入一串字符 20 | 然后另一个服务器也使用这个值,消息才会互相转发 21 | 22 | 例如,你有两个租赁服a, b。 a写了["MyChannel"],b是["HappyChannel"],就不会互通, 23 | 如果a是["MyChannel"] b是["MyChannel", "public"],那么两服消息都会互通,同时b也会接受来自公共频道的消息。 24 | 25 | 当然,我不建议你删除public 26 | 27 | -------------------------------------------------------------------------------- /多服聊天互通/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "WuMing", 3 | "version": "0.0.1", 4 | "description": "多服聊天互通,提供简单,轻量的多服互通", 5 | "limit_launcher": null, 6 | "plugin-type": "classic", 7 | "plugin-id": "MCChatLinker-TD" 8 | } -------------------------------------------------------------------------------- /大范围fill/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "System", 3 | "version": "0.0.2", 4 | "description": "大范围填充方块, 在控制台输入 ? 可查看使用说明", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | }, 8 | "plugin-type": "classic", 9 | "plugin-id": "largefill" 10 | } -------------------------------------------------------------------------------- /头衔系统/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.3", 4 | "description": "在租赁服内多人同显不同称号!\n聊天栏命令:\n .title-set / 。设置称号 以添加删除或给予称号\n .titles 玩家查看或切换称号", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.1.13", 8 | "XUID获取": "0.0.2", 9 | "前置-世界交互": "0.0.1", 10 | "Cb2Bot通信": "0.0.1" 11 | }, 12 | "plugin-type": "classic", 13 | "plugin-id": "头衔系统" 14 | } -------------------------------------------------------------------------------- /定时任务/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "System", 3 | "version": "0.0.5", 4 | "plugin-type": "classic", 5 | "description": "教程请打开插件手册查看", 6 | "pre-plugins": {}, 7 | "plugin-id": "scheduled-task" 8 | } -------------------------------------------------------------------------------- /定时任务/readme.txt: -------------------------------------------------------------------------------- 1 | 在计划任务指令文件的第一行加入 §2# 定时: <时间秒数:正整数> 2 | 如: §2# 定时: 60 3 | 4 | 往下写定时计划任务的指令 5 | 如果在某行写 §asleep <时间秒数:正整数> §r可以在此延迟一会儿再往下执行指令 6 | 7 | 示例文件会在首次启用插件的时候自动安装到插件数据文件夹, 包括 §e扫地姬 等 -------------------------------------------------------------------------------- /定时任务/示例定时任务/扫地姬.mcfunction: -------------------------------------------------------------------------------- 1 | # 定时: 3600 2 | tellraw @a {"rawtext": [{"text": "§e扫地姬 进入了游戏"}] } 3 | sleep 1 4 | tellraw @a {"rawtext": [{"text": "§f<§6扫地姬§f> 30s后就要扫地了, 请保管好掉落物哦"}] } 5 | sleep 20 6 | tellraw @a {"rawtext": [{"text": "§f<§6扫地姬§f> 10s后就要扫地了, 请保管好掉落物哦"}] } 7 | sleep 10 8 | execute as @e[type=minecraft:item] run particle minecraft:basic_flame_particle ~~~ 9 | kill @e[type=minecraft:item] 10 | tellraw @a {"rawtext": [{"text": "§f<§6扫地姬§f> 扫地完成~"}] } 11 | sleep 1 12 | tellraw @a {"rawtext": [{"text": "§e扫地姬 退出了游戏"}] } -------------------------------------------------------------------------------- /宠物背包清理/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Plugin, cfg, fmts, Chat, plugin_entry 2 | 3 | 4 | class NewPlugin(Plugin): 5 | name = "宠物背包清理" 6 | author = "猫七街" 7 | version = (0, 0, 1) 8 | 9 | def __init__(self, frame): 10 | super().__init__(frame) 11 | self._default_cfg = {"提示词": "清理背包"} 12 | self._std_cfg = {"提示词": str} 13 | try: 14 | self._cfg, _ = cfg.get_plugin_config_and_version( 15 | self.name, self._std_cfg, self._default_cfg, self.version 16 | ) 17 | except Exception as e: 18 | fmts.print_err(f"加载配置文件出错: {e}") 19 | self._cfg = self._default_cfg.copy() 20 | self.ListenChat(self.on_player_message) 21 | 22 | def on_player_message(self, chat: Chat): 23 | player_name = chat.player.name 24 | msg = chat.msg 25 | 26 | if msg == self._cfg["提示词"]: 27 | self.game_ctrl.sendwscmd(f"/a {player_name}") 28 | 29 | 30 | entry = plugin_entry(NewPlugin) 31 | -------------------------------------------------------------------------------- /宠物背包清理/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫七街", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "用于清理玩家的宠物背包\n需要放置一个循环命令方块, 延迟20+: execute as @a at @s run w @a[tag=robot] 清理背包", 6 | "pre-plugins": {}, 7 | "plugin-id": "宠物背包清理", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /封禁系统/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "1.0.4", 4 | "description": "在控制台封禁/解禁玩家。记录XUID,不用担心玩家改名!\n在控制台输入 ? 查看使用方法", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.1.13", 8 | "XUID获取": "0.0.1" 9 | }, 10 | "plugin-type": "classic", 11 | "plugin-id": "封禁系统" 12 | } 13 | -------------------------------------------------------------------------------- /巡逻/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Plugin, cfg, fmts, utils, game_utils, plugin_entry, constants 2 | import time 3 | 4 | 5 | class xunluo(Plugin): 6 | name = "巡逻" 7 | author = "猫七街" 8 | version = (0, 0, 8) 9 | 10 | def __init__(self, frame): 11 | super().__init__(frame) 12 | self._default_cfg = { 13 | "间隔时间(秒)": float(15), 14 | } 15 | self._std_cfg = {"间隔时间(秒)": float} 16 | try: 17 | self._cfg, _ = cfg.get_plugin_config_and_version( 18 | self.name, self._std_cfg, self._default_cfg, self.version 19 | ) 20 | self.repeat_time = float(self._cfg["间隔时间(秒)"]) 21 | except Exception as e: 22 | fmts.print_err(f"加载配置文件出错: {e}") 23 | self._cfg = self._default_cfg.copy() 24 | 25 | if self.repeat_time < 5: 26 | raise Exception( 27 | f"巡逻: 最小时间间隔为 5 秒,但实际得到 {self.repeat_time} 秒,请修改配置文件!" 28 | ) 29 | self.repeat_time = max(5, self.repeat_time) 30 | 31 | # 屏蔽 TextType:10 的刷屏。 32 | def on_filter(packet) -> bool: 33 | return packet["TextType"] == 10 34 | 35 | self.ListenActive(self.on_inject) 36 | self.ListenPacket(constants.PacketIDS.Text, on_filter) 37 | 38 | def _patrol_loop(self): 39 | bot_name = self.frame.launcher.get_bot_name() 40 | while True: 41 | try: 42 | players = game_utils.getTarget("@e[type=player]") 43 | for player in players: 44 | if player == bot_name: 45 | continue 46 | if player not in self.game_ctrl.allplayers: 47 | # 由 空白 (1279170334) 赞助 fix 48 | fmts.print_war(f"巡逻插件: 玩家已下线: {player}, 跳过") 49 | continue 50 | # 由 空白 (1279170334) 赞助 fix 51 | self.game_ctrl.sendwocmd( 52 | f'execute as @a[name="{player}"] at @s run tp @a[name="{self.game_ctrl.bot_name}"] ~ 325 ~' 53 | ) 54 | time.sleep(self.repeat_time) 55 | except ValueError as exc: 56 | if "未连接到游戏" == str(exc): 57 | fmts.print_inf("巡逻: 游戏关闭, 线程终止.") 58 | return # Hazelmeow qwq 59 | fmts.print_err(f"巡逻出错: {exc}") 60 | except Exception as exc: 61 | fmts.print_err(f"巡逻出错: {exc}") 62 | 63 | def on_inject(self): 64 | utils.createThread(self._patrol_loop, (), "巡逻") 65 | 66 | 67 | entry = plugin_entry(xunluo, "巡逻") 68 | -------------------------------------------------------------------------------- /巡逻/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫七街", 3 | "version": "0.0.8", 4 | "plugin-type": "classic", 5 | "description": "让机器人在玩家头上巡逻\n§c注意: 此插件为防止刷屏会拦截 TextType=10 的 Text 数据包。", 6 | "pre-plugins": {}, 7 | "plugin-id": "巡逻" 8 | } -------------------------------------------------------------------------------- /循环替换拒绝方块/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Plugin, plugin_entry, utils, fmts, constants 2 | import time 3 | 4 | 5 | class AutoReplaceBedrock(Plugin): 6 | name = "防冒险破坏" 7 | author = "心海" 8 | version = (0, 0, 1) 9 | 10 | def __init__(self, frame): 11 | super().__init__(frame) 12 | self.is_running = False 13 | 14 | # 同款刷屏拦截 15 | def on_filter(packet) -> bool: 16 | return packet["TextType"] == 10 # 拦截TextType=10的刷屏包 17 | 18 | self.ListenPacket(constants.PacketIDS.Text, on_filter) 19 | self.ListenActive(self._command_loop) 20 | self.ListenFrameExit(self.exit) 21 | 22 | @utils.thread_func("基岩填充") 23 | def _command_loop(self): 24 | while self.is_running: 25 | try: 26 | # 核心命令:替换玩家下方基岩 27 | self.game_ctrl.sendwocmd( 28 | "/execute as @a at @s positioned ~ -64 ~ if block ~~~ bedrock run " 29 | "fill ~-10 ~ ~-10 ~10 ~ ~10 deny 0 replace bedrock 0" 30 | ) 31 | except Exception as e: 32 | fmts.print_err(f"命令执行失败: {e}") 33 | time.sleep(0.1) # 固定0.1秒间隔 34 | 35 | def exit(self, _): 36 | self.is_running = False 37 | 38 | entry = plugin_entry(AutoReplaceBedrock, "基岩替换") 39 | -------------------------------------------------------------------------------- /循环替换拒绝方块/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "心海", 3 | "version": "0.0.1", 4 | "description": "将玩家y=-64附近的区域的基岩§6循环替换为拒绝方块§r\n每0.1s执行一次\n 仅限纯冒险服使用, 玩家将不能放置/破坏方块\n 除非基岩层上被放置了允许方块", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "循环替换拒绝方块" 9 | } -------------------------------------------------------------------------------- /指令调试器/__init__.py: -------------------------------------------------------------------------------- 1 | import time 2 | import json 3 | from tooldelta import Plugin, plugin_entry 4 | 5 | 6 | class MCCommandDebugger(Plugin): 7 | name = "指令调试器" 8 | author = "SuperScript" 9 | version = (0, 0, 1) 10 | 11 | def __init__(self, frame): 12 | super().__init__(frame) 13 | self.frame.add_console_cmd_trigger( 14 | ["d/"], "[指令]", "测试普通指令", self.test_common_command 15 | ) 16 | self.frame.add_console_cmd_trigger( 17 | ["dw/"], "[指令]", "测试WebSocket指令", self.test_websocket_command 18 | ) 19 | 20 | def test_common_command(self, args: list[str]): 21 | cmd = " ".join(args) 22 | sendtime = time.time() 23 | try: 24 | res = self.game_ctrl.sendwscmd_with_resp(cmd).as_dict 25 | except TimeoutError: 26 | self.print("§c指令返回获取超时") 27 | return 28 | use_time = time.time() - sendtime 29 | extra_msg = ("§c失败§r", "§a成功§r")[res["SuccessCount"] > 0] 30 | self.print(f"指令结果返回 ({cmd}) | {extra_msg} | 用时 {use_time:.2f}s:") 31 | self.print(json.dumps(res, indent=4, ensure_ascii=False)) 32 | 33 | def test_websocket_command(self, args: list[str]): 34 | cmd = " ".join(args) 35 | sendtime = time.time() 36 | try: 37 | res = self.game_ctrl.sendwscmd_with_resp(cmd).as_dict 38 | except TimeoutError: 39 | self.print("§c指令返回获取超时") 40 | return 41 | use_time = time.time() - sendtime 42 | extra_msg = ("§c失败§r", "§a成功§r")[res["SuccessCount"] > 0] 43 | self.print(f"指令结果返回 ({cmd}) | {extra_msg} | 用时 {use_time:.2f}s:") 44 | self.print(json.dumps(res, indent=4, ensure_ascii=False)) 45 | 46 | 47 | entry = plugin_entry(MCCommandDebugger) 48 | -------------------------------------------------------------------------------- /指令调试器/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.1", 4 | "description": "用于查看普通/WS指令的完整返回, 控制台命令: d/<指令> 或 dw/,如: wd/testfor @a", 5 | "plugin-type": "classic", 6 | "pre-plugins": {}, 7 | "limit_launcher": null, 8 | "plugin-id": "cmd-debugger" 9 | } -------------------------------------------------------------------------------- /控制台一键更新插件/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Plugin, plugin_entry 2 | from tooldelta.utils import fmts, thread_func, ToolDeltaThread 3 | from tooldelta.plugin_manager import plugin_manager 4 | 5 | 6 | class FastUpdatePlugins(Plugin): 7 | name = "控制台一键更新插件" 8 | author = "ToolDelta" 9 | version = (0, 0, 1) 10 | 11 | def __init__(self, frame): 12 | super().__init__(frame) 13 | self.ListenPreload(self.on_def) 14 | 15 | def on_def(self): 16 | self.frame.add_console_cmd_trigger( 17 | ["up"], None, "一键更新所有插件", self.on_update_all_plugins 18 | ) 19 | 20 | def on_update_all_plugins(self, _): 21 | fmts.print_inf("正在获取更新列表..") 22 | plugin_manager.update_all_plugins(plugin_manager.get_all_plugin_datas()) 23 | resp = input(fmts.fmt_info("是否立即重载 (§ay§r/§cn§r)? 请输入: ")) 24 | if resp.strip() == "y": 25 | self.reload_sys() 26 | else: 27 | fmts.print_inf("可以在稍后重载系统以使更新的插件生效。") 28 | 29 | @thread_func("一键更新插件重载", thread_level=ToolDeltaThread.SYSTEM) 30 | def reload_sys(self): 31 | self.frame.reload() 32 | 33 | 34 | entry = plugin_entry(FastUpdatePlugins) 35 | -------------------------------------------------------------------------------- /控制台一键更新插件/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "ToolDelta", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "在控制台输入 up 即可一键更新所有插件", 6 | "pre-plugins": {}, 7 | "plugin-id": "fast-upgrade-plugins", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /控制台执行MC指令/__init__.py: -------------------------------------------------------------------------------- 1 | import json 2 | from tooldelta import Plugin, Frame, fmts, plugin_entry 3 | 4 | 5 | class ConsoleCommands(Plugin): 6 | name = "控制台执行MC指令" 7 | author = "SuperScript" 8 | version = (0, 0, 4) 9 | 10 | def __init__(self, frame: Frame): 11 | self.frame = frame 12 | self.game_ctrl = frame.get_game_control() 13 | self.ListenActive(self.on_inject) 14 | 15 | def on_inject(self): 16 | self.frame.add_console_cmd_trigger( 17 | ["ws/"], "[指令]", "执行WS指令", self.SendWSCmdOnConsole 18 | ) 19 | self.frame.add_console_cmd_trigger( 20 | ["wo/"], "[指令]", "执行控制台权限指令", self.SendWOCmdOnConsole 21 | ) 22 | 23 | def SendWSCmdOnConsole(self, cmd): 24 | try: 25 | result = self.game_ctrl.sendwscmd_with_resp(" ".join(cmd), 5) 26 | except IndexError: 27 | fmts.print_err("缺少指令参数") 28 | return 29 | try: 30 | if (result.OutputMessages[0].Message == "commands.generic.syntax") | ( 31 | result.OutputMessages[0].Message == "commands.generic.unknown" 32 | ): 33 | fmts.print_err("未知的MC指令, 可能是指令格式有误") 34 | else: 35 | jso = json.dumps( 36 | result.as_dict["OutputMessages"], indent=2, ensure_ascii=False 37 | ) 38 | if not result.SuccessCount: 39 | fmts.print_war(f"指令执行失败:\n{jso}") 40 | else: 41 | fmts.print_suc(f"指令执行成功: \n{jso}") 42 | except IndexError: 43 | if result.SuccessCount: 44 | jso = json.dumps( 45 | result.as_dict["OutputMessages"], indent=2, ensure_ascii=False 46 | ) 47 | fmts.print_suc(f"指令执行成功: \n{jso}") 48 | except TimeoutError: 49 | fmts.print_err("[超时] 指令获取结果返回超时") 50 | 51 | def SendWOCmdOnConsole(self, cmd): 52 | self.game_ctrl.sendwocmd(" ".join(cmd)) 53 | 54 | 55 | entry = plugin_entry(ConsoleCommands) 56 | -------------------------------------------------------------------------------- /控制台执行MC指令/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.4", 4 | "description": "可以在控制台让机器人执行特殊指令等, 处于FastBuilder启动模式下还可以快捷使用fb指令", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "控制台执行MC指令" 9 | } -------------------------------------------------------------------------------- /插件接口获取修复/__init__.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from typing import Any 3 | from tooldelta import Plugin, fmts, plugin_entry 4 | from tooldelta.plugin_market import market 5 | from tooldelta.plugin_load.exceptions import ( 6 | PluginAPINotFoundError, 7 | PluginAPIVersionError, 8 | ) 9 | 10 | 11 | class NewPlugin(Plugin): 12 | name = "插件接口获取修复" 13 | author = "ToolDelta" 14 | version = (0, 0, 1) 15 | 16 | def __init__(self, frame): 17 | super().__init__(frame) 18 | self.old_get_plugin_api = self.frame.plugin_group.get_plugin_api 19 | self.inject() 20 | 21 | def plugin_api_not_found_auto_get(self, api_name: str) -> bool: 22 | resp = ( 23 | input(fmts.fmt_info("尝试自动从市场下载插件吗 (§ay§r/§cn§r): ")) 24 | .strip() 25 | .lower() 26 | or "y" 27 | ) 28 | if resp == "y": 29 | try: 30 | plugin = market.get_plugin_data_from_market(api_name) 31 | except requests.RequestException: 32 | fmts.print_err("尝试失败") 33 | return False 34 | fmts.print_suc(f"找到 {plugin.name}, 开始下载..") 35 | market.download_plugin(plugin) 36 | fmts.print_suc("下载完成") 37 | return True 38 | else: 39 | return False 40 | 41 | def get_plugin_api( 42 | self, apiName: str, min_version: tuple[int, int, int] | None = None, force=True 43 | ) -> Any: 44 | try: 45 | return self.old_get_plugin_api(apiName, min_version, force) 46 | except (PluginAPIVersionError, PluginAPINotFoundError) as err: 47 | if isinstance(err, PluginAPINotFoundError): 48 | fmts.print_war(f"插件API {apiName} 未找到") 49 | else: 50 | fmts.print_war(f"插件API {apiName} 版本过低") 51 | res = self.plugin_api_not_found_auto_get(apiName) 52 | if not res: 53 | raise 54 | else: 55 | fmts.print_suc(f"已下载包含接口 {apiName} 的插件, 请重启 ToolDelta") 56 | raise SystemExit 57 | 58 | def inject(self): 59 | self.frame.plugin_group.get_plugin_api = self.get_plugin_api 60 | 61 | 62 | entry = plugin_entry(NewPlugin) 63 | -------------------------------------------------------------------------------- /插件接口获取修复/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "ToolDelta", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "当出现插件 API 不存在的报错时, 将尝试自动下载插件而不是直接报错退出", 6 | "pre-plugins": {}, 7 | "plugin-id": "插件接口获取修复" 8 | } -------------------------------------------------------------------------------- /时间同步计分板/__init__.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | from tooldelta import Plugin, utils, cfg as config, plugin_entry 3 | 4 | 5 | class ScoreboardTime(Plugin): 6 | name = "时间同步计分板" 7 | author = "SuperScript" 8 | version = (0, 0, 1) 9 | 10 | def __init__(self, frame): 11 | super().__init__(frame) 12 | CFG_DEFAULT = { 13 | "同步到哪个计分板上": "time", 14 | "同步间隔秒数": 20, 15 | "是否同步年月日": True, 16 | "是否同步星期": True, 17 | } 18 | cfg, _ = config.get_plugin_config_and_version( 19 | self.name, config.auto_to_std(CFG_DEFAULT), CFG_DEFAULT, self.version 20 | ) 21 | self.sync_gap = cfg["同步间隔秒数"] 22 | self.sync_scbname = cfg["同步到哪个计分板上"] 23 | self.sync_yms = cfg["是否同步年月日"] 24 | self.sync_wd = cfg["是否同步星期"] 25 | self.ListenActive(self.on_inject) 26 | 27 | def on_inject(self): 28 | utils.timer_event(self.sync_gap, "时间同步计分板")(self.sync_time)() 29 | 30 | def sync_time(self): 31 | now = datetime.datetime.now() 32 | swcmd = self.game_ctrl.sendwocmd 33 | scbname = self.sync_scbname 34 | if self.sync_yms: 35 | swcmd(f"scoreboard players set 年 {scbname} {now.year}") 36 | swcmd(f"scoreboard players set 月 {scbname} {now.month}") 37 | swcmd(f"scoreboard players set 日 {scbname} {now.day}") 38 | if self.sync_wd: 39 | swcmd(f"scoreboard players set 星期 {scbname} {now.weekday() + 1}") 40 | swcmd(f"scoreboard players set 时 {scbname} {now.hour}") 41 | swcmd(f"scoreboard players set 分 {scbname} {now.minute}") 42 | swcmd(f"scoreboard players set 秒 {scbname} {now.second}") 43 | 44 | 45 | entry = plugin_entry(ScoreboardTime) 46 | -------------------------------------------------------------------------------- /时间同步计分板/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.1", 4 | "description": "将现实时间同步到服内的计分板\n一定要去看本插件的配置文件!", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "DateTimeSync" 9 | } -------------------------------------------------------------------------------- /暴击检测/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "果_k", 3 | "version": "0.0.2", 4 | "plugin-type": "classic", 5 | "description": "限制玩家暴击次数", 6 | "pre-plugins": {}, 7 | "plugin-id": "暴击限制", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /更好的公告栏/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.8", 4 | "description": "在公告栏添加更多特殊内容, 例如本地时间和TPS等", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "tpscalculator": "0.0.1" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "better-announcebar" 11 | } -------------------------------------------------------------------------------- /更好的钓鱼/data_operation.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | def save_data(data_path, data): 4 | bak_path = data_path + ".bak" 5 | try: 6 | with open(data_path, "r", encoding="utf-8") as f: 7 | old_data = json.load(f) 8 | 9 | with open(bak_path, "w", encoding="utf-8") as f: 10 | json.dump(old_data, f) 11 | 12 | with open(data_path, "w", encoding="utf-8") as f: 13 | json.dump(data, f) 14 | 15 | except: 16 | with open(data_path, "w", encoding="utf-8") as f: 17 | json.dump(data, f) 18 | 19 | with open(bak_path, "w", encoding="utf-8") as f: 20 | json.dump(data, f) 21 | 22 | def load_data(data_path): 23 | bak_path = data_path + ".bak" 24 | try: 25 | with open(data_path, "r", encoding="utf-8") as f: 26 | data = json.load(f) 27 | 28 | except: 29 | try: 30 | with open(bak_path, "r", encoding="utf-8") as f: 31 | data = json.load(f) 32 | 33 | except: 34 | data = {} 35 | 36 | return data -------------------------------------------------------------------------------- /更好的钓鱼/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫猫", 3 | "version": "0.0.3", 4 | "plugin-type": "classic", 5 | "description": "让你的每一次收杆充满惊喜", 6 | "pre-plugins": { 7 | "cb-say-supporter": "0.0.1" 8 | }, 9 | "plugin-id": "更好的钓鱼", 10 | "enabled": true 11 | } -------------------------------------------------------------------------------- /更好的钓鱼/readme.txt: -------------------------------------------------------------------------------- 1 | 计分板部分: 2 | 鱼竿属性: 3 | 鱼竿_钓鱼冷却: 每次钓鱼后设置的冷却 4 | 鱼竿_钓鱼爆率: 数值越高越容易钓到高品质物品 5 | 鱼竿_物品爆率: 钓到物品类型的权重 6 | 鱼竿_生物爆率: 钓到生物类型的权重 7 | 鱼竿_结构爆率: 钓到结构类型的权重 8 | 鱼竿_连钓次数: 每次钓鱼会钓到几个物品 9 | 鱼竿_空钩概率: 每次钓鱼都会有概率空钩, 越高越不容易空钩 10 | 11 | 玩家属性: 12 | 玩家_钓鱼次数: 当前玩家剩余的钓鱼次数,为0则无法钓鱼 13 | 玩家_钓鱼冷却: 冷却缩减, 对钓鱼后的冷却百分比缩减 14 | 玩家_钓鱼爆率: 与鱼竿属性相同 15 | 玩家_物品爆率: 与鱼竿属性相同 16 | 玩家_生物爆率: 与鱼竿属性相同 17 | 玩家_结构爆率: 与鱼竿属性相同 18 | 玩家_连钩数量: 与鱼竿属性相同 19 | 玩家_空钩概率: 与鱼竿属性相同 20 | 玩家_冷却计时: 用来存储钓鱼冷却 21 | 22 | 设置部分: 23 | 基础爆率: 数值越高越难钓到高品质物品 24 | 基础空钩率: 数值越高越容易空钩 25 | 26 | 如何使用: 27 | 给予玩家Cat.Fishing的tag后让玩家私聊机器人发送Cat.Fishing即可钓鱼一次 28 | 因此你可以自由的编写钓鱼方式 29 | 30 | 奖池配置: 31 | 在配置对某一类型的命令方块对接开启后 32 | 你可以在奖励内添加一个键值, 命令方块对接: True 标签: "喵喵喵" 33 | 这样会使原有的给予奖励方式失效,并给玩家添加标签, 你可以设置一条命令链进行处理 34 | 开启命令方块对接后 如果奖励设置内存在 "名称": "xxx" 插件会对玩家发送提示, 如果没有则不发送 35 | 36 | 奖池注意事项: 不要写了品质不填写类型, 不要写了类型不添加奖励 37 | 38 | 需要的命令: 39 | tellraw @a[tag=robot] {"rawtext":[{"text":"Cat.upScore"},{"selector":"@a"},{"score":{"name":"@a","objective":"玩家_冷却计时"}},{"selector":"@a"},{"score":{"name":"@a","objective":"玩家_钓鱼次数"}},{"selector":"@a"},{"score":{"name":"@a","objective":"玩家_钓鱼冷却"}},{"selector":"@a"},{"score":{"name":"@a","objective":"玩家_钓鱼爆率"}},{"selector":"@a"},{"score":{"name":"@a","objective":"玩家_物品爆率"}},{"selector":"@a"},{"score":{"name":"@a","objective":"玩家_生物爆率"}},{"selector":"@a"},{"score":{"name":"@a","objective":"玩家_结构爆率"}},{"selector":"@a"},{"score":{"name":"@a","objective":"玩家_空钩概率"}},{"selector":"@a"},{"score":{"name":"@a","objective":"玩家_连钓次数"}},{"selector":"@a"},{"score":{"name":"@a","objective":"鱼竿_钓鱼冷却"}},{"selector":"@a"},{"score":{"name":"@a","objective":"鱼竿_钓鱼爆率"}},{"selector":"@a"},{"score":{"name":"@a","objective":"鱼竿_物品爆率"}},{"selector":"@a"},{"score":{"name":"@a","objective":"鱼竿_生物爆率"}},{"selector":"@a"},{"score":{"name":"@a","objective":"鱼竿_结构爆率"}},{"selector":"@a"},{"score":{"name":"@a","objective":"鱼竿_空钩概率"}},{"selector":"@a"},{"score":{"name":"@a","objective":"鱼竿_连钓次数"}},{"selector":"@a"},{"score":{"name":"@a","objective":"玩家_鱼饵属性"}}]} 40 | 推荐延迟 20 41 | scoreboard players remove @a[scores={玩家_冷却计时=1..}] 玩家_冷却计时 1 42 | 推荐延迟 20 -------------------------------------------------------------------------------- /更好的钓鱼/属性.json: -------------------------------------------------------------------------------- 1 | { 2 | "rawtext": [ 3 | { 4 | "text": "Cat.upScore" 5 | }, 6 | { 7 | "selector": "@a" 8 | }, 9 | { 10 | "score": { 11 | "name": "@a", 12 | "objective": "玩家_冷却计时" 13 | } 14 | }, 15 | { 16 | "selector": "@a" 17 | }, 18 | { 19 | "score": { 20 | "name": "@a", 21 | "objective": "玩家_钓鱼次数" 22 | } 23 | }, 24 | { 25 | "selector": "@a" 26 | }, 27 | { 28 | "score": { 29 | "name": "@a", 30 | "objective": "玩家_钓鱼冷却" 31 | } 32 | }, 33 | { 34 | "selector": "@a" 35 | }, 36 | { 37 | "score": { 38 | "name": "@a", 39 | "objective": "玩家_钓鱼爆率" 40 | } 41 | }, 42 | { 43 | "selector": "@a" 44 | }, 45 | { 46 | "score": { 47 | "name": "@a", 48 | "objective": "玩家_物品爆率" 49 | } 50 | }, 51 | { 52 | "selector": "@a" 53 | }, 54 | { 55 | "score": { 56 | "name": "@a", 57 | "objective": "玩家_生物爆率" 58 | } 59 | }, 60 | { 61 | "selector": "@a" 62 | }, 63 | { 64 | "score": { 65 | "name": "@a", 66 | "objective": "玩家_结构爆率" 67 | } 68 | }, 69 | { 70 | "selector": "@a" 71 | }, 72 | { 73 | "score": { 74 | "name": "@a", 75 | "objective": "玩家_空钩概率" 76 | } 77 | }, 78 | { 79 | "selector": "@a" 80 | }, 81 | { 82 | "score": { 83 | "name": "@a", 84 | "objective": "玩家_连钓次数" 85 | } 86 | }, 87 | { 88 | "selector": "@a" 89 | }, 90 | { 91 | "score": { 92 | "name": "@a", 93 | "objective": "玩家_鱼饵属性" 94 | } 95 | }, 96 | { 97 | "selector": "@a" 98 | }, 99 | { 100 | "score": { 101 | "name": "@a", 102 | "objective": "玩家_鱼竿属性" 103 | } 104 | } 105 | ] 106 | } -------------------------------------------------------------------------------- /服服互通/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript\/2401PT", 3 | "version": "0.0.9", 4 | "plugin-type": "classic", 5 | "description": "通过中心服务器联结多个租赁服使其能够进行数据的互通\n此插件仅提供最基本的消息互通功能, 更多功能在附属插件内", 6 | "pre-plugins": {}, 7 | "plugin-id": "server-link", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /木桶玩家商店-试验版/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "可验货/退货/支持任意物品的玩家商店\n在聊天栏菜单帮助内查看可用指令", 6 | "pre-plugins": {}, 7 | "plugin-id": "barrelshop" 8 | } -------------------------------------------------------------------------------- /机器人发言/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Plugin, plugin_entry 2 | 3 | 4 | class NewPlugin(Plugin): 5 | name = "机器人发言" 6 | author = "SuperScript" 7 | version = (0, 0, 1) 8 | 9 | def __init__(self, frame): 10 | super().__init__(frame) 11 | self.ListenActive(self.on_inject) 12 | 13 | def on_inject(self): 14 | self.frame.add_console_cmd_trigger( 15 | ["say"], 16 | "[msg]", 17 | "发言", 18 | lambda ms: self.bot_say(" ".join(ms)), 19 | ) 20 | 21 | def bot_say(self, msg): 22 | self.game_ctrl.sendPacket( 23 | 9, 24 | { 25 | "TextType": 1, 26 | "NeedsTranslation": False, 27 | "SourceName": "", 28 | "Message": msg, 29 | "Parameters": [], 30 | "XUID": self.game_ctrl.players_uuid[self.game_ctrl.bot_name][-8:], 31 | "PlatformChatID": "", 32 | }, 33 | ) 34 | 35 | 36 | entry = plugin_entry(NewPlugin) 37 | -------------------------------------------------------------------------------- /机器人发言/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "控制台输入 say [消息] 使机器人在游戏内发言", 6 | "pre-plugins": {}, 7 | "plugin-id": "机器人发言" 8 | } -------------------------------------------------------------------------------- /权限管理/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "权威-马牛逼", 3 | "version": "0.0.2", 4 | "plugin-type": "classic", 5 | "description": "计分板qx,可在在游戏中更改,如果需要更新权限,把玩家踢掉自动更新(确保你更新了分数),0为成员1为访客2操作员3自定义", 6 | "pre-plugins": {}, 7 | "plugin-id": "进服默认权限(必备)", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /死亡点返回/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Plugin, plugin_entry, Player, Chat, FrameExit, cfg, game_utils, utils, Config, fmts, TYPE_CHECKING 2 | from tooldelta.constants import PacketIDS 3 | class DeathBack(Plugin): 4 | name = "死亡点返回" 5 | author = "果_k" 6 | version = (0, 0, 1) 7 | 8 | def __init__(self, frame): 9 | super().__init__(frame) 10 | CONFIG_DEFAULT = { 11 | "取消返回": "§c§l已自动取消返回", 12 | "等待输入时间": 20, 13 | "是否启用标签限制": False, 14 | "标签名称": "backdeath", 15 | } 16 | CONFIG_STD = { 17 | "取消返回": str, 18 | "等待输入时间": Config.NNInt, 19 | "是否启用标签限制": bool, 20 | "标签名称": str, 21 | } 22 | cfg, cfg_version = Config.get_plugin_config_and_version( 23 | self.name, CONFIG_STD, CONFIG_DEFAULT, self.version 24 | ) 25 | self.BackInfo = cfg["取消返回"] 26 | self.TimeOut = cfg["等待输入时间"] 27 | self.TagCheck = cfg["是否启用标签限制"] 28 | self.PlayerTag= cfg["标签名称"] 29 | self.ListenPacket(PacketIDS.Text, self.TextDeath) 30 | 31 | def TextDeath(self,packet): 32 | Message = packet['Message'] 33 | if isinstance(Message, str) and "death" in Message.lower(): #筛选触发条件 34 | self.GetPos(packet['Parameters'][0]) 35 | 36 | def GetPos(self,playername): 37 | players = self.frame.get_players() 38 | player = players.getPlayerByName(playername) 39 | dim, x, y, z = player.getPos() 40 | if self.TagCheck: #标签筛选玩家 41 | backCmd = self.game_ctrl.sendcmd(f"/testfor @a[name={player.name},tag={self.PlayerTag}]",waitForResp=True) 42 | Check = backCmd.OutputMessages[0].Success 43 | if Check == True: 44 | self.AskPlayer(player,dim,x,y,z) 45 | else: 46 | return 47 | else: 48 | self.AskPlayer(player,dim,x,y,z) 49 | 50 | def AskPlayer(self,player,dim,x,y,z): 51 | reply = player.input(f"§a§l你死于 {dim} 维度的 {x} {y} {z} 是否返回?§b输入y同意 输入n拒绝",self.TimeOut) 52 | if reply == "y": 53 | player.show("返回") 54 | if dim == 0: #不同维度的判断 55 | self.game_ctrl.sendwscmd(f"/execute in overworld run tp {player.name} {x} {y} {z}") 56 | elif dim == 1: 57 | self.game_ctrl.sendwscmd(f"/execute in nether run tp {player.name} {x} {y} {z}") 58 | elif dim == 2: 59 | self.game_ctrl.sendwscmd(f"/execute in the_end run tp {player.name} {x} {y} {z}") 60 | else: 61 | player.show(self.BackInfo) 62 | 63 | entry = plugin_entry(DeathBack) -------------------------------------------------------------------------------- /死亡点返回/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "果_k", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "支持多维度的返回死亡点", 6 | "pre-plugins": {}, 7 | "plugin-id": "死亡点返回", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /活塞限速/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.1", 4 | "description": "制裁玩家放置的高频活塞!高度自定义化反制!", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "tpscalculator": "0.0.1" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "anti-fast-piston" 11 | } 12 | -------------------------------------------------------------------------------- /清空全部玩家末影箱/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Plugin, Player, ToolDelta, plugin_entry 2 | 3 | 4 | class ClearEnderChest(Plugin): 5 | name = "清空全部玩家末影箱" 6 | author = "wling" 7 | version = (0, 0, 6) 8 | 9 | def __init__(self, frame: ToolDelta): 10 | super().__init__(frame) 11 | self.ListenPreload(self.on_preload) 12 | 13 | def on_preload(self): 14 | self.GetPluginAPI("聊天栏菜单").add_new_trigger( 15 | ["encl", "清末影箱"], 16 | [("玩家名中的关键词", str, None)], 17 | "清空玩家末影箱", 18 | self.on_menu, 19 | lambda x: x == 1, 20 | True, 21 | ) 22 | 23 | def on_menu(self, player: Player, args: list[str]): 24 | clearWho = args[0] 25 | for i in self.game_ctrl.allplayers: 26 | if clearWho in i: 27 | for j in range(0, 27): 28 | self.game_ctrl.sendwocmd( 29 | f"/replaceitem entity {i} slot.enderchest {j} air" 30 | ) 31 | player.show(f"§l§a清空 {i} 的末影箱:成功") 32 | return 33 | 34 | player.show("§l§cERROR§r §c目标玩家不存在!") 35 | 36 | 37 | entry = plugin_entry(ClearEnderChest) 38 | -------------------------------------------------------------------------------- /清空全部玩家末影箱/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "wling", 3 | "version": "0.0.6", 4 | "description": "还在担心玩家在末影箱藏小东西吗?直接清空玩家的末影箱!", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "清空玩家末影箱" 9 | } -------------------------------------------------------------------------------- /游戏内显示插件报错/__init__.py: -------------------------------------------------------------------------------- 1 | import traceback 2 | from tooldelta import Plugin, ToolDelta, Chat, plugin_entry 3 | 4 | 5 | class InGameError(Plugin): 6 | name = "游戏内显示插件报错" 7 | author = "System" 8 | version = (0, 0, 5) 9 | 10 | def __init__(self, frame: ToolDelta): 11 | super().__init__(frame) 12 | self.game_avali = False 13 | self.frame = frame 14 | self._backup_onerr = self.frame.on_plugin_err 15 | self.frame.on_plugin_err = self.call_err 16 | self.frame.add_console_cmd_trigger( 17 | ["error", "报错"], "[报错文本]", "测试游戏内报错显示", self.test_error 18 | ) 19 | self.ListenActive(self.on_inject) 20 | self.ListenChat(self.on_player_message) 21 | 22 | def on_inject(self): 23 | self.game_avali = True 24 | 25 | def call_err(self, plugin_name: str, exception: Exception): 26 | if self.game_avali: 27 | exc_str = traceback.format_exc() 28 | try: 29 | if exc_str.strip() == "": 30 | self.game_ctrl.say_to( 31 | "@a", f"§7[§cERROR§7] §4{plugin_name} 报错:空报错" 32 | ) 33 | return 34 | self.game_ctrl.say_to("@a", f"§7[§cERROR§7] §4{plugin_name} 报错:") 35 | for ln in exc_str.split("\n"): 36 | self.game_ctrl.say_to("@a", "§c " + ln) 37 | except Exception: 38 | self._backup_onerr(plugin_name, exception) 39 | else: 40 | self._backup_onerr(plugin_name, exception) 41 | 42 | def test_error(self, args): 43 | if len(args) == 0: 44 | return 45 | self.game_ctrl.sendcmd(f"w @s tooldelta.error.test {args[0]}") 46 | 47 | def on_player_message(self, chat: Chat): 48 | player = chat.player.name 49 | msg = chat.msg 50 | 51 | if player == self.game_ctrl.bot_name and msg.startswith( 52 | "tooldelta.error.test " 53 | ): 54 | raise AssertionError(msg.removeprefix("tooldelta.error.test ")) 55 | 56 | 57 | entry = plugin_entry(InGameError) 58 | -------------------------------------------------------------------------------- /游戏内显示插件报错/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "System", 3 | "version": "0.0.5", 4 | "description": "将插件产生的报错转发到游戏内", 5 | "plugin-type": "classic", 6 | "pre-plugins": {}, 7 | "limit_launcher": null, 8 | "plugin-id": "ingame-errmsg" 9 | } -------------------------------------------------------------------------------- /点歌台/GetFile.py: -------------------------------------------------------------------------------- 1 | import os 2 | import requests 3 | from urllib3.exceptions import InsecureRequestWarning 4 | 5 | requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning) 6 | 7 | def fetch_github_api(api_url): 8 | try: 9 | response = requests.get(api_url, verify=False) 10 | if response.status_code == 200: 11 | return response.json() 12 | else: 13 | print(f"Failed to fetch files. Status code: {response.status_code}") 14 | return None 15 | except Exception as e: 16 | print(f"An error occurred while fetching files: {e}") 17 | return None 18 | 19 | def get_github_repo_files(repo_url): 20 | api_url = f"https://api.github.com/repos/{repo_url}/contents" 21 | files = fetch_github_api(api_url) 22 | message = fetch_message_content(repo_url) 23 | if files: 24 | file_names = [] 25 | for file in files: 26 | if file.get('type') == 'file': 27 | name = file['name'] 28 | main_name, ext = os.path.splitext(name) 29 | if main_name.lower() == 'message': 30 | #SM的玩意,message.json就是过滤不掉,还是改下点歌台那里吧... 31 | continue 32 | if ext.lower() in ('.mid', '.midi'): 33 | file_names.append(main_name) 34 | return file_names, message 35 | else: 36 | return [], message 37 | 38 | def fetch_message_content(repo_url): 39 | """ 40 | 获取 Message.json 文件的内容并返回 41 | """ 42 | try: 43 | headers = { 44 | 'User-Agent': 'Mozilla/5.0' 45 | } 46 | #经过测试,ghproxy.net 似乎是唯一一个能直接下载的,而官方提供的github.tooldelta.top却选择了拒绝连接 47 | message_url = f"https://ghproxy.net/https://raw.githubusercontent.com/{repo_url}/main/Message.json" 48 | message_response = requests.get(message_url, headers=headers, verify=False) 49 | if message_response.status_code == 200: 50 | return message_response.json().get('message') 51 | return None 52 | except Exception as e: 53 | print(f"Error fetching message: {e}") 54 | return None -------------------------------------------------------------------------------- /点歌台/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript & Zhonger-Yuansi", 3 | "version": "0.2.3", 4 | "description": "想在在服内点歌? 使用这个点歌台插件吧!\n歌曲MIDI文件需要放置于 §6插件数据文件/点歌台/音乐列表§f 下或者使用远程音乐仓库\n在服内输入 help 可查看点歌指令\n消耗的音乐点于计分板 song_point, 可自行添加分数", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.1.13", 8 | "MC-MIDIPlayer": "0.0.1" 9 | }, 10 | "plugin-type": "classic", 11 | "plugin-id": "choose-song" 12 | } 13 | -------------------------------------------------------------------------------- /物品制作器/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.3", 4 | "plugin-type": "classic", 5 | "description": "可制作换行物品等; 详情请查看该插件附带的手册", 6 | "pre-plugins": {}, 7 | "plugin-id": "item-maker" 8 | } -------------------------------------------------------------------------------- /物品制作器/readme.txt: -------------------------------------------------------------------------------- 1 | 物品制作器 物品描述的json文件格式: 2 | 3 | [ 4 | { 5 | "ID": "stick", 6 | "名称": "我的名字\n可以换行!", 7 | "特殊值": 1, 8 | "标签属性": null 9 | }, 10 | { 11 | "ID": "diamond", 12 | "名称": "§r§b魔力钻石\n§7被注魔的钻石, 可以用于合成物品。\n§9Botania", 13 | "特殊值": 1, 14 | "标签属性": {"can_place_on": {"blocks":["diamond_block"]}} 15 | }, 16 | ] 17 | 18 | 把这个 json 文件放置在 插件数据文件/特殊物品制作器/ 目录下即可 19 | 在控制台输入 mkitem 选择此文件即可开始制作 -------------------------------------------------------------------------------- /猫七街云黑封禁/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫七街", 3 | "version": "0.0.2", 4 | "description": "云端黑名单插件", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "XUID获取": "0.0.1" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "云黑" 11 | } -------------------------------------------------------------------------------- /猫七街云黑封禁/server/官方云黑列表/blacklist.json: -------------------------------------------------------------------------------- 1 | { 2 | "player_uuid1": "player_name1", 3 | "player_uuid2": "player_name2" 4 | } -------------------------------------------------------------------------------- /猫七街玩家互传/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫七街", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "玩家之间相互传送", 6 | "pre-plugins": {}, 7 | "plugin-id": "玩家互传", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /玩家交易所/data_operation.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | def save_data(data_path, data): 4 | bat_path = data_path + ".bat" 5 | try: 6 | with open(data_path, "r", encoding="utf-8") as f: 7 | old_data = json.load(f) 8 | 9 | with open(bat_path, "w", encoding="utf-8") as f: 10 | json.dump(old_data, f) 11 | 12 | with open(data_path, "w", encoding="utf-8") as f: 13 | json.dump(data, f) 14 | 15 | except: 16 | with open(data_path, "w", encoding="utf-8") as f: 17 | json.dump(data, f) 18 | 19 | with open(bat_path, "w", encoding="utf-8") as f: 20 | json.dump(data, f) 21 | 22 | def load_data(data_path): 23 | bat_path = data_path + ".bat" 24 | try: 25 | with open(data_path, "r", encoding="utf-8") as f: 26 | data = json.load(f) 27 | 28 | except: 29 | try: 30 | with open(bat_path, "r", encoding="utf-8") as f: 31 | data = json.load(f) 32 | 33 | except: 34 | data = {} 35 | 36 | return data -------------------------------------------------------------------------------- /玩家交易所/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫七街", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "玩家之间相互交易", 6 | "pre-plugins": {}, 7 | "plugin-id": "玩家交易所", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /玩家人数限制/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Plugin, cfg as config, game_utils, Player, plugin_entry 2 | 3 | 4 | class NewPlugin(Plugin): 5 | name = "玩家人数限制" 6 | author = "SuperScript" 7 | version = (0, 0, 1) 8 | 9 | def __init__(self, frame): 10 | super().__init__(frame) 11 | CFG = {"最大人数限制": 20} 12 | cfg, _ = config.get_plugin_config_and_version( 13 | self.name, config.auto_to_std(CFG), CFG, self.version 14 | ) 15 | self.maxinum_player = cfg["最大人数限制"] 16 | self.ListenPlayerJoin(self.on_player_join) 17 | 18 | def on_player_join(self, player: Player): 19 | playername = player.name 20 | xuid = player.xuid 21 | if len( 22 | self.game_ctrl.allplayers 23 | ) > self.maxinum_player and not game_utils.is_op(playername): 24 | self.game_ctrl.sendwocmd(f"kick {xuid} 已达到租赁服最大人数限制") 25 | 26 | 27 | entry = plugin_entry(NewPlugin) 28 | -------------------------------------------------------------------------------- /玩家人数限制/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "限制租赁服人数", 6 | "pre-plugins": {}, 7 | "plugin-id": "玩家人数限制" 8 | } -------------------------------------------------------------------------------- /玩家数据管理/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫七街", 3 | "version": "2.0.1", 4 | "plugin-type": "classic", 5 | "description": "玩家数据管理", 6 | "pre-plugins": {}, 7 | "plugin-id": "玩家数据管理" 8 | } -------------------------------------------------------------------------------- /玩家记录/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.2", 4 | "plugin-type": "classic", 5 | "description": "记录历史加入玩家的信息", 6 | "pre-plugins": {}, 7 | "plugin-id": "玩家历史" 8 | } -------------------------------------------------------------------------------- /玩家转账/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫七街", 3 | "version": "0.0.3", 4 | "plugin-type": "classic", 5 | "description": "玩家直接相互转账", 6 | "pre-plugins": {}, 7 | "plugin-id": "玩家转账", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /番茄小说/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "小虫虫", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "在MC中使用番茄小说", 6 | "pre-plugins": {}, 7 | "plugin-id": "番茄小说", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /白名单&管理员检测/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫七街", 3 | "version": "1.1.0", 4 | "plugin-type": "classic", 5 | "description": "白名单&管理员检测", 6 | "pre-plugins": {}, 7 | "plugin-id": "白名单&管理员检测" 8 | } -------------------------------------------------------------------------------- /空岛分配/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫七街", 3 | "version": "0.0.1", 4 | "description": "自动分配空岛", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "空岛分配" 9 | } -------------------------------------------------------------------------------- /空岛系统/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.3", 4 | "plugin-type": "classic", 5 | "description": "使用该系统便捷地制作一个空岛系统!§c一定要在写配置文件的时候查看插件手册", 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.0.1", 8 | "基本插件功能库": "0.0.11", 9 | "前置-世界交互": "0.0.1", 10 | "cb-say-supporter": "0.0.1" 11 | }, 12 | "plugin-id": "SkyblockSystem" 13 | } -------------------------------------------------------------------------------- /空岛系统/readme.txt: -------------------------------------------------------------------------------- 1 | §b配置文件填写介绍: 2 | §a"L型空岛"§r: { 3 | §b"结构名"§r: "空岛1", 4 | "介绍": "普通的L型空岛", 5 | §d"结构生成偏移"§r: [ 6 | -9, 7 | -6, 8 | -4 9 | ] 10 | } 11 | §a"L型空岛"§r: 空岛包体名, 也就是 .is create 空岛包体名 用到的名字。 12 | §b"结构名"§r: 用结构方块保存下来的空岛结构的名字。 13 | §d"结构生成偏移"§r: 以玩家在空岛上着陆的坐标点为原点, 加载空岛结构的坐标的xyz偏移量。 14 | §c重要!!! 15 | 不推荐使用聊天栏菜单创建空岛, 你可以设置一个命令方块, 16 | 里面写入 /execute as @p run w @a[tag=robot] .is create 所需的空岛包体名 17 | 以激活命令方块来创建一个空岛。 18 | 此功能需要配合插件 命令方块代发言支持 食用。 -------------------------------------------------------------------------------- /等级检测/__init__.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | from tooldelta import Config 4 | from tooldelta import Plugin, plugin_entry, fmts 5 | from tooldelta.constants import PacketIDS 6 | 7 | 8 | class Levelcheck(Plugin): 9 | name = "等级限制" 10 | author = "果_k" 11 | version = (0, 0, 2) 12 | 13 | def __init__(self, frame): 14 | super().__init__(frame) 15 | CONFIG_DEFAULT = { 16 | "踢出理由": "等级过低,无法加入服务器", 17 | "延迟踢出时间": 3, 18 | "最低限制等级": 12, 19 | } 20 | CONFIG_STD = { 21 | "踢出理由": str, 22 | "延迟踢出时间": Config.NNInt, 23 | "最低限制等级": Config.NNInt, 24 | } 25 | cfg, cfg_version = Config.get_plugin_config_and_version( 26 | self.name, CONFIG_STD, CONFIG_DEFAULT, self.version 27 | ) 28 | self.min_level = cfg["最低限制等级"] 29 | self.kick_reason = cfg["踢出理由"] 30 | self.kick_time = cfg["延迟踢出时间"] 31 | self.ListenPacket(PacketIDS.PlayerList, self.on_playerlist) 32 | 33 | def on_playerlist(self, packet): 34 | if not packet["GrowthLevels"]: # 离开服务器 35 | fmts.print_err("GrowthLevels 不存在") 36 | return 37 | level_player = packet["GrowthLevels"][0] 38 | if not level_player: 39 | fmts.print_err("level_player 不存在") 40 | return 41 | if "Entries" in packet and isinstance(packet["Entries"], list): 42 | for entry_user in packet["Entries"]: 43 | username = self.get_username(entry_user) # 获取玩家名 44 | xuid = self.get_xuid(entry_user) 45 | if username is None or xuid is None: 46 | continue 47 | self.kick_player(username, level_player, xuid) 48 | 49 | def get_username(self, entry_user): 50 | if "Username" in entry_user: 51 | return entry_user["Username"] 52 | else: 53 | fmts.print_err("没有 Username 数据") 54 | return None 55 | 56 | def get_xuid(self, entry_user): 57 | if "XUID" in entry_user: 58 | return entry_user["XUID"] 59 | else: 60 | fmts.print_err("没有 XUID 数据") 61 | return None 62 | 63 | def kick_player(self, username, level_player, xuid): 64 | if level_player < self.min_level: 65 | fmts.print_war( 66 | f"玩家 {username} 的等级 {level_player} 低于最小等级 {self.min_level},进行踢出" 67 | ) 68 | time.sleep(self.kick_time) 69 | self.game_ctrl.sendwocmd(f"kick {xuid} {self.kick_reason}") 70 | 71 | 72 | entry = plugin_entry(Levelcheck) 73 | -------------------------------------------------------------------------------- /等级检测/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "果_k", 3 | "version": "0.0.2", 4 | "plugin-type": "classic", 5 | "description": "限制玩家进服等级", 6 | "pre-plugins": {}, 7 | "plugin-id": "等级限制", 8 | "enabled": true 9 | } 10 | -------------------------------------------------------------------------------- /签到系统/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "权威-马牛逼", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "100种签到语", 6 | "pre-plugins": {}, 7 | "plugin-id": "每日签到" 8 | } -------------------------------------------------------------------------------- /简单世界导入/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "YoRHa", 3 | "version": "0.0.5", 4 | "plugin-type": "classic", 5 | "description": "一个简单的世界导入实现,目的在于提供一个操作基岩版存档的演示,但不实现任何关于 NBT 方块的部分\n使用方法: 启动插件后将 mcworld 文件夹置于 插件数据文件/简易世界导入/ 目录下, 然后在控制台输入 ? 查看 import/ 命令帮助", 6 | "pre-plugins": { 7 | "pip": "0.0.1" 8 | }, 9 | "plugin-id": "simple-bedworld-import", 10 | "enabled": true 11 | } -------------------------------------------------------------------------------- /简单世界导入/readme.txt: -------------------------------------------------------------------------------- 1 | 本插件的目的皆在提供一个关于操作基岩版存档的示例,当然也可以作为检查底层库有效性的好工具。 2 | 我们的最终目标是利用底层工具类来实现一个强大的、基于 Blob hash cache 缓存数据集的镜像存档实现,而本插件只是一个可能的初步尝试。 3 | 因此,基于上述两个目标,本插件的诞生并不是为了商业化活动而服务的,尽管当前存储库是 BSD 3-Clause License 协议。 4 | 无论如何,将本插件用于任何商业活动都是不可取的,尽管这可能符合项目的许可证,但无论如何,一旦您这么做了,您将被视为侮辱本插件的开发者。 5 | 6 | 7 | 8 | 关于使用本插件,例如,如果你想把名字为 abc 的存档中从 (1,2,3) 到 (4,5,6) 9 | 的主世界区域导入到租赁服的 (233,100,-233) 处,那么您可以使用命令 10 | import/ abc 0 (1,2,3) (4,5,6) (233,100,-233) 11 | 12 | 其中,abc 是存档的名字,它应该指向插件数据目录的一个叫做 abc 的文件夹,然后里面放了存档的文件; 13 | 然后,0 是原始存档中建筑物所处区域的维度 ID(主世界) 14 | 15 | 其他一些示例: 16 | import/ 小城市 0 (-59,-62,-264) (182,-36,65) (-3000,100,-3000) 17 | import/ YTMKaP3lZwA= 0 (-1,-1,-1) (1,1,1) (-3000,100,-3000) 18 | import/ YTMKaP3lZwA= 0 (-1,-65,-1) (-1,321,-1) (5000,-1,5000) 19 | 20 | 这意味着存档文件夹是不能带有空格符号的,否则会出现问题。 21 | 22 | 23 | 24 | 可靠性和限制 25 | 本插件基于 bedrock-world-operator 实现了最低级别的导入系统,它相当的简单但探究其细节又不是那么的容易 26 | ——因为实现过程中涉及到大量的坐标系转换,这实际上并不容易(对于读者而言至少如此,尽管插件本身有大量注释)。 27 | 28 | 我们支持 v1.20.51 及之前的大部分基岩版我的世界存档,但不保证 v1.20.51 之后的基岩版存档可以正常工作。 29 | 然后,该插件还在一定程度上支持了含水类方块(毕竟这是我们的传统艺能,也不想想这个概念最初是谁引入的?) 30 | 31 | 任何 NBT 成分都不被支持,因为它不属于低级别实现——不过欢迎劳动人民魔改这个插件以使得部分特殊方块得到支持。 -------------------------------------------------------------------------------- /简单世界恢复/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "YoRHa", 3 | "version": "0.1.0", 4 | "plugin-type": "classic", 5 | "description": "结合“世界备份”插件使用,在服务器地图损坏后用本插件修复(本插件会对比方块差异,只导入差异部分,比“简单世界导入”效率高)", 6 | "pre-plugins": { 7 | "pip": "0.0.1", 8 | "主动区块请求": "0.1.1" 9 | }, 10 | "plugin-id": "简单世界恢复", 11 | "enabled": true 12 | } -------------------------------------------------------------------------------- /简单世界恢复/readme.txt: -------------------------------------------------------------------------------- 1 | 如果你想把租赁服内 (1,2) 到 (4,5) 的贯穿整个 Y 轴的区域恢复,然后你的存档放在 abc 文件夹里, 2 | 那么您可以使用下面的这个命令。 3 | recover/ abc (1,2) (4,5) 4 | 5 | 系统会将机器人所在的维度作为查找的维度。另外,我们的最小精度是区块,所以上面的 (1,2) 到 (4,5) 6 | 实际上指的是 (1,2) 代表的区块到 (4,5) 代表的区块。 7 | 8 | 你不应该使用压缩的存档,你应该解压并放入文件夹中。 9 | 10 | 其他一些示例: 11 | recover/ 小城市 (-59,-264) (182,65) 12 | recover/ test (2340,2322) (2314,2348) 13 | recover/ YTMKaP3lZwA= (-1,-1) (1,1) 14 | recover/ YTMKaP3lZwA= (-1,-1) (-1,-1) 15 | 16 | 这意味着存档文件夹是不能带有空格符号的,否则会出现问题。 -------------------------------------------------------------------------------- /简易建造-Pro/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.10", 4 | "description": "使用一些更简便的方法让建筑师建造服务器", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.1.13" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "简易建造-Pro", 11 | "enabled": true 12 | } -------------------------------------------------------------------------------- /简易建造-Pro/readme.txt: -------------------------------------------------------------------------------- 1 | 插件使用方法: 2 | (注意当机器人不和你在一个维度时将机器人tp到你处) 3 | 放置告示牌输入 qd 设置起点 4 | 告示牌 zd 设置终点 5 | 告示牌 lf 以此告示牌底部方块为颜料方块, 起点到终点为立方体对角线填充立方体 6 | 告示牌 hy 以此告示牌底部方块为颜料方块, 起点为圆心, 起点到终点为水平半径画空心圆 7 | 告示牌 hy sx 以此告示牌底部方块为颜料方块, 起点为圆心, 起点到终点为水平半径画平面实心圆 8 | 告示牌 yz 以此告示牌底部方块为颜料方块, 起点为圆心, 起点到终点为水平半径, 起点到终点的高差为高画圆柱 9 | 告示牌 qt 以此告示牌底部方块为颜料方块, 起点为球心, 起点到终点为半径画球 10 | 告示牌 tc 用此告示牌底部方块为颜料方块,填充告示牌底部区域的空白方块(空气,照明)为颜料方块 -------------------------------------------------------------------------------- /简易建造/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.8", 4 | "description": "使用一些更简便的方法让建筑师建造服务器", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.1.13" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "简易建造", 11 | "enabled": true 12 | } -------------------------------------------------------------------------------- /简易建造/readme.txt: -------------------------------------------------------------------------------- 1 | 插件使用方法: 2 | 放置一个告示牌输入 §fWe start§r 即可设置起点(仅创造模式下玩家可用,当附近5格有非创造玩家时不可用) 3 | 放置告示牌输入 §fWe fill <方块ID>§r 即可将此作为终止点并填充方块 4 | 告示牌输入 §fWe cn§r 可将起始点的方块作为目标方块,并使用该方块填充从起始点到目标点区域内的所有方块 5 | 6 | -------------------------------------------------------------------------------- /类式插件创建器/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "ToolDelta", 3 | "version": "0.0.2", 4 | "description": "使用 create 指令创建类式插件", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "class-plugin-creator" 9 | } -------------------------------------------------------------------------------- /系统上线提示[Mono]/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Plugin, plugin_entry,cfg, game_utils, fmts 2 | 3 | class SystemOnline(Plugin): 4 | name = "系统上线提示" 5 | author = "Mono" 6 | version = (0, 0, 2) 7 | 8 | def __init__(self, frame): 9 | super().__init__(frame) 10 | DEFAULT_CFG = {"启动时信息显示": [ 11 | [ 12 | "@a", 13 | "§6§l * §r§o§bToolDelta §r§aSystem Online" 14 | ], 15 | [ 16 | "@a[m=c]", 17 | "前往 插件配置文件/系统上线提示.json 配置" 18 | ] 19 | ]} 20 | STD_CFG_TYPE = {"启动时信息显示": cfg.JsonList(cfg.JsonList(str,2))} 21 | self.cfg, ver = cfg.get_plugin_config_and_version( 22 | self.name, STD_CFG_TYPE, DEFAULT_CFG, self.version 23 | ) 24 | self.ListenActive(self.on_bot_working) 25 | 26 | def on_bot_working(self): 27 | for i in self.cfg["启动时信息显示"]: 28 | self.game_ctrl.say_to(i[0], i[1]) 29 | 30 | 31 | 32 | entry = plugin_entry(SystemOnline) -------------------------------------------------------------------------------- /系统上线提示[Mono]/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Mono", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "系统上线提示", 6 | "pre-plugins": {}, 7 | "plugin-id": "system_online", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /群服互通云链版/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "大庆油田\/SuperScript", 3 | "version": "0.0.9", 4 | "description": "提供了群服消息互通、查询玩家列表、执行指令等功能\n0.0.3修复: 重连会创建两倍连接的问题\n0.0.6: 修复了部分指令返回翻译为中文出错的问题", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "tpscalculator": "0.0.1" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "cloud-qqlink" 11 | } -------------------------------------------------------------------------------- /群服互通云链版/websocket/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | __init__.py 3 | websocket - WebSocket client library for Python 4 | 5 | Copyright 2024 engn33r 6 | 7 | Licensed under the Apache License, Version 2.0 (the "License"); 8 | you may not use this file except in compliance with the License. 9 | You may obtain a copy of the License at 10 | 11 | http://www.apache.org/licenses/LICENSE-2.0 12 | 13 | Unless required by applicable law or agreed to in writing, software 14 | distributed under the License is distributed on an "AS IS" BASIS, 15 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | See the License for the specific language governing permissions and 17 | limitations under the License. 18 | """ 19 | from ._abnf import * 20 | from ._app import WebSocketApp as WebSocketApp, setReconnect as setReconnect 21 | from ._core import * 22 | from ._exceptions import * 23 | from ._logging import * 24 | from ._socket import * 25 | 26 | __version__ = "1.8.0" 27 | -------------------------------------------------------------------------------- /群服互通云链版/websocket/_exceptions.py: -------------------------------------------------------------------------------- 1 | """ 2 | _exceptions.py 3 | websocket - WebSocket client library for Python 4 | 5 | Copyright 2024 engn33r 6 | 7 | Licensed under the Apache License, Version 2.0 (the "License"); 8 | you may not use this file except in compliance with the License. 9 | You may obtain a copy of the License at 10 | 11 | http://www.apache.org/licenses/LICENSE-2.0 12 | 13 | Unless required by applicable law or agreed to in writing, software 14 | distributed under the License is distributed on an "AS IS" BASIS, 15 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | See the License for the specific language governing permissions and 17 | limitations under the License. 18 | """ 19 | 20 | 21 | class WebSocketException(Exception): 22 | """ 23 | WebSocket exception class. 24 | """ 25 | 26 | pass 27 | 28 | 29 | class WebSocketProtocolException(WebSocketException): 30 | """ 31 | If the WebSocket protocol is invalid, this exception will be raised. 32 | """ 33 | 34 | pass 35 | 36 | 37 | class WebSocketPayloadException(WebSocketException): 38 | """ 39 | If the WebSocket payload is invalid, this exception will be raised. 40 | """ 41 | 42 | pass 43 | 44 | 45 | class WebSocketConnectionClosedException(WebSocketException): 46 | """ 47 | If remote host closed the connection or some network error happened, 48 | this exception will be raised. 49 | """ 50 | 51 | pass 52 | 53 | 54 | class WebSocketTimeoutException(WebSocketException): 55 | """ 56 | WebSocketTimeoutException will be raised at socket timeout during read/write data. 57 | """ 58 | 59 | pass 60 | 61 | 62 | class WebSocketProxyException(WebSocketException): 63 | """ 64 | WebSocketProxyException will be raised when proxy error occurred. 65 | """ 66 | 67 | pass 68 | 69 | 70 | class WebSocketBadStatusException(WebSocketException): 71 | """ 72 | WebSocketBadStatusException will be raised when we get bad handshake status code. 73 | """ 74 | 75 | def __init__( 76 | self, 77 | message: str, 78 | status_code: int, 79 | status_message=None, 80 | resp_headers=None, 81 | resp_body=None, 82 | ): 83 | super().__init__(message) 84 | self.status_code = status_code 85 | self.resp_headers = resp_headers 86 | self.resp_body = resp_body 87 | 88 | 89 | class WebSocketAddressException(WebSocketException): 90 | """ 91 | If the websocket address info cannot be found, this exception will be raised. 92 | """ 93 | 94 | pass 95 | -------------------------------------------------------------------------------- /群服互通云链版/websocket/_ssl_compat.py: -------------------------------------------------------------------------------- 1 | """ 2 | _ssl_compat.py 3 | websocket - WebSocket client library for Python 4 | 5 | Copyright 2024 engn33r 6 | 7 | Licensed under the Apache License, Version 2.0 (the "License"); 8 | you may not use this file except in compliance with the License. 9 | You may obtain a copy of the License at 10 | 11 | http://www.apache.org/licenses/LICENSE-2.0 12 | 13 | Unless required by applicable law or agreed to in writing, software 14 | distributed under the License is distributed on an "AS IS" BASIS, 15 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | See the License for the specific language governing permissions and 17 | limitations under the License. 18 | """ 19 | __all__ = [ 20 | "HAVE_SSL", 21 | "ssl", 22 | "SSLError", 23 | "SSLEOFError", 24 | "SSLWantReadError", 25 | "SSLWantWriteError", 26 | ] 27 | 28 | try: 29 | import ssl 30 | from ssl import SSLError, SSLEOFError, SSLWantReadError, SSLWantWriteError 31 | 32 | HAVE_SSL = True 33 | except ImportError: 34 | # dummy class of SSLError for environment without ssl support 35 | class SSLError(Exception): 36 | pass 37 | 38 | class SSLEOFError(Exception): 39 | pass 40 | 41 | class SSLWantReadError(Exception): 42 | pass 43 | 44 | class SSLWantWriteError(Exception): 45 | pass 46 | 47 | ssl = None 48 | HAVE_SSL = False 49 | -------------------------------------------------------------------------------- /群服互通云链版/websocket/py.typed: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/群服互通云链版/websocket/py.typed -------------------------------------------------------------------------------- /群服互通云链版/websocket/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToolDelta-Basic/PluginMarket/7f2c47534e4fa2b08ed4432155bc24c2320cef9f/群服互通云链版/websocket/tests/__init__.py -------------------------------------------------------------------------------- /群服互通云链版/websocket/tests/data/header01.txt: -------------------------------------------------------------------------------- 1 | HTTP/1.1 101 WebSocket Protocol Handshake 2 | Connection: Upgrade 3 | Upgrade: WebSocket 4 | Sec-WebSocket-Accept: Kxep+hNu9n51529fGidYu7a3wO0= 5 | some_header: something 6 | 7 | -------------------------------------------------------------------------------- /群服互通云链版/websocket/tests/data/header02.txt: -------------------------------------------------------------------------------- 1 | HTTP/1.1 101 WebSocket Protocol Handshake 2 | Connection: Upgrade 3 | Upgrade WebSocket 4 | Sec-WebSocket-Accept: Kxep+hNu9n51529fGidYu7a3wO0= 5 | some_header: something 6 | 7 | -------------------------------------------------------------------------------- /群服互通云链版/websocket/tests/data/header03.txt: -------------------------------------------------------------------------------- 1 | HTTP/1.1 101 WebSocket Protocol Handshake 2 | Connection: Upgrade, Keep-Alive 3 | Upgrade: WebSocket 4 | Sec-WebSocket-Accept: Kxep+hNu9n51529fGidYu7a3wO0= 5 | Set-Cookie: Token=ABCDE 6 | Set-Cookie: Token=FGHIJ 7 | some_header: something 8 | 9 | -------------------------------------------------------------------------------- /群服互通云链版/websocket/tests/echo-server.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # From https://github.com/aaugustin/websockets/blob/main/example/echo.py 4 | 5 | import asyncio 6 | import os 7 | 8 | import websockets 9 | 10 | LOCAL_WS_SERVER_PORT = int(os.environ.get("LOCAL_WS_SERVER_PORT", "8765")) 11 | 12 | 13 | async def echo(websocket): 14 | async for message in websocket: 15 | await websocket.send(message) 16 | 17 | 18 | async def main(): 19 | async with websockets.serve(echo, "localhost", LOCAL_WS_SERVER_PORT): 20 | await asyncio.Future() # run forever 21 | 22 | 23 | asyncio.run(main()) 24 | -------------------------------------------------------------------------------- /聊天历史记录/__init__.py: -------------------------------------------------------------------------------- 1 | from io import TextIOWrapper 2 | from datetime import datetime 3 | from tooldelta import Plugin, plugin_entry, Player 4 | from tooldelta.constants import PacketIDS 5 | from tooldelta.utils import packet_transition 6 | 7 | 8 | class ChatbarHistory(Plugin): 9 | name = "聊天历史记录" 10 | author = "ToolDelta" 11 | version = (0, 0, 1) 12 | 13 | def __init__(self, frame): 14 | super().__init__(frame) 15 | self.ListenPlayerJoin(self.on_player_join) 16 | self.ListenPlayerLeave(self.on_player_leave) 17 | self.ListenPacket(PacketIDS.Text, self.parse_text) 18 | self._logger_fp: TextIOWrapper | None = None 19 | self.make_data_path() 20 | 21 | def on_player_join(self, player: Player): 22 | self.log(f"{player.name} (XUID:{player.xuid}) 进入游戏") 23 | 24 | def on_player_leave(self, player: Player): 25 | self.log(f"{player.name} 退出游戏") 26 | 27 | def parse_text(self, pk: dict): 28 | playername, msg, can_be_trusted = ( 29 | packet_transition.get_playername_and_msg_from_text_packet(self.frame, pk) 30 | ) 31 | if playername is None: 32 | # 忽略 tellraw 等消息 33 | return False 34 | if can_be_trusted: 35 | self.log(f"{playername}: {msg}") 36 | else: 37 | self.log(f"{playername} (可能为伪造消息) 发送了消息: {msg}") 38 | return False 39 | 40 | def log(self, line: str): 41 | line = f"{datetime.now().strftime('%m-%d %H:%M:%S')} {line}" 42 | self._get_fp().write(line + "\n") 43 | self._get_fp().flush() 44 | 45 | def _get_fp(self): 46 | if self._logger_fp is None: 47 | self._logger_fp = open( 48 | self.format_data_path("聊天记录.log"), "a", encoding="utf-8" 49 | ) 50 | return self._logger_fp 51 | 52 | 53 | entry = plugin_entry(ChatbarHistory) 54 | -------------------------------------------------------------------------------- /聊天历史记录/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "ToolDelta", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "记录聊天栏聊天的历史记录", 6 | "pre-plugins": {}, 7 | "plugin-id": "chat-history", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /自定义聊天栏菜单/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.1.4", 4 | "description": "自定义ToolDelta的聊天栏菜单触发词等, 拥有高级计分板替换功能! 详情看最新自动生成的配置文件!", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.1.13" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "自定义聊天栏菜单" 11 | } -------------------------------------------------------------------------------- /获取全服玩家皮肤/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.4", 4 | "description": "记录每一个登录了租赁服的玩家的皮肤, 并存储到插件数据文件夹", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "pip": "0.0.1" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "skin-getter" 11 | } -------------------------------------------------------------------------------- /计分板重置/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import ( 2 | Plugin, 3 | cfg, 4 | game_utils, 5 | utils, 6 | fmts, 7 | TYPE_CHECKING, 8 | plugin_entry, 9 | ) 10 | 11 | from data_operation import * 12 | import os 13 | 14 | 15 | class NewPlugin(Plugin): 16 | name = "计分板重置" 17 | author = "猫七街" 18 | version = (0, 0, 1) 19 | 20 | def __init__(self, frame): 21 | super().__init__(frame) 22 | config = {"白名单计分板": ["coin"]} 23 | self.config, _ = cfg.get_plugin_config_and_version( 24 | self.name, {}, config, self.version 25 | ) 26 | self.ListenPreload(self.on_def) 27 | 28 | def clear(self, args): 29 | # [计分板名字, 计分板显示名字, dummy] 30 | data_path = os.path.join(self.data_path, "服务器计分板.json") 31 | scoreboards = self.game_ctrl.sendwscmd( 32 | "/scoreboard objectives list", waitForResp=True 33 | ).as_dict # type: ignore 34 | scoreboards.pop("CommandOrigin") 35 | scoreboards = scoreboards["OutputMessages"] 36 | data = {} 37 | for scoreboard in scoreboards: 38 | if scoreboard["Message"] == f"§a%commands.scoreboard.objectives.list.count": 39 | continue 40 | 41 | try: 42 | scoreboard = scoreboard["Parameters"] 43 | 44 | except: 45 | pass 46 | if scoreboard[0] in self.config["白名单计分板"]: 47 | continue 48 | data[scoreboard[0]] = scoreboard[1] 49 | 50 | save_data(data_path, data) 51 | for scoreboard, _ in data.items(): 52 | self.game_ctrl.sendwscmd(f'/scoreboard objectives remove "{scoreboard}"') 53 | 54 | fmts.print_suc("重置完成") 55 | 56 | def create(self, args): 57 | data_path = os.path.join(self.data_path, "服务器计分板.json") 58 | data = load_data(data_path) 59 | if not data: 60 | fmts.print_err("没有保存的计分板") 61 | return 62 | 63 | for scoreboard, show in data.items(): 64 | self.game_ctrl.sendwscmd( 65 | f'/scoreboard objectives add "{scoreboard}" dummy "{show}"' 66 | ) 67 | 68 | fmts.print_suc("计分板重新创建完成") 69 | return 70 | 71 | def on_def(self): 72 | self.frame.add_console_cmd_trigger( 73 | ["重置计分板"], "[]", "用于将计分板数据全部重置", self.clear 74 | ) 75 | self.frame.add_console_cmd_trigger( 76 | ["创建计分板"], "[]", "用于重新创建计分板", self.create 77 | ) 78 | 79 | 80 | entry = plugin_entry(NewPlugin) 81 | -------------------------------------------------------------------------------- /计分板重置/data_operation.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | def save_data(data_path, data): 4 | bat_path = data_path + ".bat" 5 | try: 6 | with open(data_path, "r", encoding="utf-8") as f: 7 | old_data = json.load(f) 8 | 9 | with open(bat_path, "w", encoding="utf-8") as f: 10 | json.dump(old_data, f) 11 | 12 | with open(data_path, "w", encoding="utf-8") as f: 13 | json.dump(data, f) 14 | 15 | except: 16 | with open(data_path, "w", encoding="utf-8") as f: 17 | json.dump(data, f) 18 | 19 | with open(bat_path, "w", encoding="utf-8") as f: 20 | json.dump(data, f) 21 | 22 | def load_data(data_path): 23 | bat_path = data_path + ".bat" 24 | try: 25 | with open(data_path, "r", encoding="utf-8") as f: 26 | data = json.load(f) 27 | 28 | except: 29 | try: 30 | with open(bat_path, "r", encoding="utf-8") as f: 31 | data = json.load(f) 32 | 33 | except: 34 | data = {} 35 | 36 | return data -------------------------------------------------------------------------------- /计分板重置/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "猫七街", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "将白名单外的计分板全部重置", 6 | "pre-plugins": {}, 7 | "plugin-id": "计分板重置", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /设置栏钢琴师/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.9", 4 | "description": "详情请看插件文件夹内置的 使用说明.txt 或者到 ToolDelta Wiki 查看", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "PianoInSettingPiano" 9 | } -------------------------------------------------------------------------------- /设置栏钢琴师/readme.txt: -------------------------------------------------------------------------------- 1 | 网易mc手机版租赁服插件加载器-ToolDelta 的插件,作者qq2528622340. 2 | 3 | 每打开关闭一次 设置>世界选项-立即重生 可以启用或者禁用钢琴, 同时锁住或者解锁 世界选项锁定 以免弹琴的时候被更改。 4 | 启用钢琴的时候, 点击 设置>世界选项的前八个设置 相当于钢琴的 C~C1 八个音调。乐音全服可听。 5 | 更改 重生半径 的数字 (3~7) 可改变音高域。 -------------------------------------------------------------------------------- /超频刷屏反制/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.8", 4 | "plugin-type": "classic", 5 | "description": "制裁超频刷屏的玩家/锁服", 6 | "pre-plugins": { 7 | "封禁系统": "0.0.1" 8 | }, 9 | "plugin-id": "超频刷屏反制" 10 | } -------------------------------------------------------------------------------- /进服一言/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import ( 2 | Plugin, 3 | utils, 4 | Player, 5 | plugin_entry, 6 | ) 7 | 8 | import time 9 | import requests 10 | 11 | 12 | class NewPlugin(Plugin): 13 | name = "进服一言" 14 | author = "机入" 15 | version = (0, 0, 1) 16 | 17 | def __init__(self, frame): 18 | super().__init__(frame) 19 | self.ListenPreload(self.on_def) 20 | self.ListenPlayerJoin(self.on_player_join) 21 | 22 | def on_def(self): 23 | pass 24 | 25 | @utils.thread_func("一言") 26 | def on_player_join(self, player: Player): 27 | playername = player.name 28 | try: 29 | time.sleep(10) # 等待玩家完全进入 30 | data = requests.get("https://v1.xqapi.com/v1.php?y =默认&type=text") 31 | if data.status_code == 200: 32 | self.game_ctrl.say_to(playername, f"一言: {data.text}") 33 | else: 34 | return 35 | except requests.RequestException as e: # 异常 36 | print(f"一言异常 {e}") 37 | 38 | 39 | entry = plugin_entry(NewPlugin) 40 | -------------------------------------------------------------------------------- /进服一言/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "机入", 3 | "version": "0.0.1", 4 | "plugin-type": "classic", 5 | "description": "进入服务器之后返回随机一言", 6 | "pre-plugins": {}, 7 | "plugin-id": "进服一言", 8 | "enabled": true 9 | } -------------------------------------------------------------------------------- /进服验证/__init__.py: -------------------------------------------------------------------------------- 1 | from time import time 2 | 3 | from tooldelta import plugin_entry, Plugin, ToolDelta, Player, cfg 4 | from tooldelta.utils import tempjson 5 | 6 | 7 | class PlayerJoinverify(Plugin): 8 | name = "进服验证" 9 | author = "大庆油田" 10 | version = (0, 0, 1) 11 | 12 | def __init__(self, frame: ToolDelta): 13 | super().__init__(frame) 14 | self.ListenPlayerJoin(self.PlayerJoin) 15 | self.make_data_path() 16 | self.path = self.format_data_path("验证数据.json") 17 | self.ListenPreload(self.on_preload) 18 | CFG_DEFAULT = {"用于接收验证的群": 194838530} 19 | cfg_std = cfg.auto_to_std(CFG_DEFAULT) 20 | self.cfg, _ = cfg.get_plugin_config_and_version( 21 | self.name, cfg_std, CFG_DEFAULT, self.version 22 | ) 23 | self.group = self.cfg["用于接收验证的群"] 24 | 25 | def on_preload(self): 26 | self.qfht = self.GetPluginAPI("群服互通") 27 | self.qfht.plugin.append("进服验证") 28 | 29 | def get(self) -> dict: 30 | return tempjson.load_and_read( 31 | self.path, need_file_exists=False, default={"白名单": []} 32 | ) 33 | 34 | def set(self, data): 35 | tempjson.load_and_write(self.path, data) 36 | 37 | def QQLinker_message(self, data): 38 | # fmts.print(f"{data}") 39 | if data.get("group_id") == self.group and data.get("message"): 40 | if data["message"].startswith("#验证"): 41 | id = data["message"].split()[1] 42 | a = self.get() 43 | if b := a.get(id, False): 44 | a["白名单"].append(b) 45 | self.qfht.sendmsg(self.group, "验证成功") 46 | self.set(a) 47 | 48 | def PlayerJoin(self, player: Player): 49 | a = self.get() 50 | 51 | if not player.xuid in a["白名单"]: 52 | id = int(time()) 53 | a[id] = player.xuid 54 | self.game_ctrl.sendwocmd( 55 | f"kick {player.xuid} 您已被踢出游戏:在 {self.group} 发送 #验证 {id}" 56 | ) 57 | self.set(a) 58 | return 0 59 | 60 | 61 | entry = plugin_entry(PlayerJoinverify, "进服验证") 62 | -------------------------------------------------------------------------------- /进服验证/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "大庆油田", 3 | "version": "0.0.1", 4 | "description": "提供了进服验证,以保证进服玩家在指定qq群内", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "cloud-qqlink": "0.0.8" 8 | }, 9 | "plugin-type": "classic", 10 | "plugin-id": "PlayerJoinverify" 11 | } -------------------------------------------------------------------------------- /违规名称踢出/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "大庆油田", 3 | "version": "0.0.10", 4 | "description": "踢出敏感词玩家/自定义违规词玩家", 5 | "limit_launcher": null, 6 | "pre-plugins": {}, 7 | "plugin-type": "classic", 8 | "plugin-id": "违规名称踢出" 9 | } 10 | -------------------------------------------------------------------------------- /违规名称踢出/词库.json: -------------------------------------------------------------------------------- 1 | [ 2 | "木合塔尔", 3 | "NO" 4 | ] -------------------------------------------------------------------------------- /重启/__init__.py: -------------------------------------------------------------------------------- 1 | from tooldelta import Frame, Plugin, utils, Chat, plugin_entry, cfg 2 | 3 | 4 | class reload(Plugin): 5 | version = (0, 0, 1) 6 | name = "重启" 7 | author = "大庆油田" 8 | description = "重启" 9 | 10 | def __init__(self, frame: Frame): 11 | super().__init__(frame) 12 | self.ListenChat(self.on_chat) 13 | CFG_DEFAULT = {"允许使用人": ""} 14 | cfg_std = cfg.auto_to_std(CFG_DEFAULT) 15 | self.cfg, _ = cfg.get_plugin_config_and_version( 16 | self.name, cfg_std, CFG_DEFAULT, self.version 17 | ) 18 | self.op = self.cfg["允许使用人"] 19 | 20 | @utils.thread_func("reload", thread_level=utils.ToolDeltaThread.SYSTEM) 21 | def on_chat(self, chat: Chat): 22 | if chat.msg == ".reload" and chat.player.name == self.op: 23 | self.frame.reload() 24 | 25 | 26 | entry = plugin_entry(reload) 27 | -------------------------------------------------------------------------------- /重启/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "大庆油田", 3 | "version": "0.0.1", 4 | "description": "允许在游戏内重启tooldelta服务", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | }, 8 | "plugin-type": "classic", 9 | "plugin-id": "reload" 10 | } -------------------------------------------------------------------------------- /雪球菜单/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.1.7", 4 | "description": "贴合租赁服原汁原味的雪球菜单! 可以自定义雪球菜单内容, 同时也是一个API插件.\n§f使用前请先传送到指令区后输入命令§b.snowmenu-init§f初始化雪球菜单命令方块!!!!\n在配置文件内向雪球菜单添加内容。", 5 | "plugin-type": "classic", 6 | "pre-plugins": { 7 | "聊天栏菜单": "0.0.1", 8 | "基本插件功能库": "0.0.7", 9 | "前置-世界交互": "0.0.3", 10 | "Cb2Bot通信": "0.0.1" 11 | }, 12 | "limit_launcher": null, 13 | "plugin-id": "雪球菜单v2" 14 | } -------------------------------------------------------------------------------- /音乐播放器/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.1.2", 4 | "description": "包含显示进度, 显示播放条等功能的Midi音乐播放器!\n用途和功能请查看插件手册!!!", 5 | "limit_launcher": null, 6 | "pre-plugins": { 7 | "MC-MIDIPlayer": "0.2.5", 8 | "聊天栏菜单": "0.2.3" 9 | }, 10 | "plugin-type": "classic", 11 | "plugin-id": "MusicPlayer" 12 | } -------------------------------------------------------------------------------- /音乐播放器/readme.txt: -------------------------------------------------------------------------------- 1 | 在游戏内输入 help 可查找播放指令 2 | 3 | 音乐文件置于 插件数据文件/音乐播放器/ 文件夹下 (MIDI音乐文件, 后缀是 .mid 的) 4 | 5 | 播放 和 暂停 操作的聊天栏菜单触发词都一样。 6 | 7 | 输入 §e.播放 <曲目名> §r可播放加载的MIDI音乐 (触发词可以在配置文件设置) 8 | 输入 §e.暂停 <曲目名> §r可播放加载的MIDI音乐 (触发词可以在配置文件设置) 9 | 输入 §e.停止 <曲目名> §r可直接停止MIDI音乐播放 (也可以在配置文件设置) 10 | 输入 §e.音乐列表 §r可查看能播放的音乐的列表 11 | -------------------------------------------------------------------------------- /音效播放器/datas.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "SuperScript", 3 | "version": "0.0.2", 4 | "description": "§a功能请查看手册!!!§r支持直接使用命令方块请求播放MIDI文件,还增加了ZBasic的播放命令语法扩展!", 5 | "plugin-type": "classic", 6 | "pre-plugins": { 7 | "MC-MIDIPlayer": "0.0.1", 8 | "前置-世界交互": "0.0.2" 9 | }, 10 | "limit_launcher": null, 11 | "plugin-id": "sfx-player" 12 | } -------------------------------------------------------------------------------- /音效播放器/readme.txt: -------------------------------------------------------------------------------- 1 | 读取音乐: 2 | 把MIDI音乐文件置于 插件数据文件/音效播放器/ 目录下 3 | 4 | 使用命令方块播放: 5 | 在命令方块输入 tellraw @a[tag=robot] {"rawtext":[{"text":"sfx.play"},{"text":"<目标选择器>"},{"text":"<音乐文件名>"}]} 6 | 然后激活 即可播放音乐 --------------------------------------------------------------------------------