diff --git a/src/endstone_tianyan/eng_lang.py b/src/endstone_tianyan/eng_lang.py new file mode 100644 index 0000000..a703b5f --- /dev/null +++ b/src/endstone_tianyan/eng_lang.py @@ -0,0 +1,135 @@ +# 单独把语言文件拿出来 + +default_lang = { + "lang-version": "1.1.6", + "language": "English", + "查询玩家&部分实体行为记录 --格式 /ty x坐标 y坐标 z坐标 时间(单位:小时) 半径": "Query player & partial entity behavior records -- Format: /ty x-coordinate y-coordinate z-coordinate Time (in hours) Radius", + "查看天眼命令帮助信息": "View Tianyan command help information", + "封禁一名玩家(仅管理员可用)": "Ban a player (OP only)", + "从黑名单中移除玩家(仅管理员可用)": "Remove a player from the blacklist (OP only)", + "列出所有加入黑名单的玩家(仅管理员可用)": "List all players added to the blacklist (OP only)", + "封禁设备ID(仅管理员可用)": "Ban a device ID (OP only)", + "从设备黑名单移除设备ID(仅管理员可用)": "Remove a device ID from the blacklist (OP only)", + "列出所有加入黑名单的设备ID(仅管理员可用)": "List all device IDs added to the blacklist (OP only)", + "关键词搜索 --格式 /tys 搜索类型 查询关键词 时间(单位:小时) (仅管理员可用)": "Keyword search -- Format: /tys search type query keyword Time (in hours) (OP only)", + "使用图形窗口查询玩家&部分实体行为记录": "Use GUI to query player & partial entity behavior records", + "使用图形窗口搜索关键词查询玩家&部分实体行为记录": "Use GUI for keyword search to query player & partial entity behavior records", + "实验性功能 还原玩家直接方块放置破坏行为 --格式 /tyback 坐标 时间(单位:小时) 半径 实施行为的玩家名(可选)(仅管理员可用)": "Experimental feature: Restore direct player block placement or destruction -- Format: /tyback Coordinates Time (in hours) Radius Player Name (optional) (OP only)", + "天眼插件已启用 版本": "TianyanPlugin has been enable Version", + "配置文件位于": "Config file is in", + "插件语言设定为": "Plugin language set to", + "其余数据文件位于": "Other data files located at", + "项目更新地址": "Project update URL", + "天眼命令使用方法": "Tianyan command usage", + "使用/tyban 命令将一名玩家加入黑名单 格式 /tyban 玩家名 理由(选填)": "Use /tyban command to add a player to the blacklist. Format: /tyban Player Name Reason (optional)", + "使用/tyunban 命令将一名玩家移出黑名单 格式 /tyunban 玩家名": "Use /tyunban command to remove a player from the blacklist. Format: /tyunban Player Name", + "使用/banlist 命令列出所有被加入黑名单的玩家名": "Use /banlist command to list all blacklisted player names", + "使用/banid 命令将一名玩家的设备加入黑名单(当目标玩家设备在线时添加黑名单无法直接踢出,请使用其它方法踢出该玩家) 格式 /banid 设备ID": "Use /banid command to blacklist a player's device (if the target player's device is online, adding to the blacklist won't directly kick them. Use other methods to kick them). Format: /banid Device ID", + "使用/unbanid 命令将一名玩家的设备移出黑名单 格式 /unban 设备ID": "Use /unbanid command to remove a player's device from the blacklist. Format: /unban Device ID", + "使用/banlist 命令列出所有被加入黑名单的玩家的设备ID": "Use /banlist command to list all blacklisted device IDs", + "使用 /ty 命令查询查询玩家&部分实体行为记录 格式 /ty x坐标 y坐标 z坐标 时间(单位:小时) 半径": "Use /ty command to query player & partial entity behavior records. Format: /ty x-coordinate y-coordinate z-coordinate Time (in hours) Radius", + "使用 /tys 命令使用关键词查询玩家&部分实体行为记录 格式 关键词搜索 格式 /tys 搜索类型 查询关键词 时间(单位:小时) (仅管理员可用)": "Use /tys command for keyword search to query player & partial entity behavior records. Format: /tys search type query keyword Time (in hours) (OP only)", + "使用/tygui 命令使用图形窗口查询玩家&部分实体行为记录": "Use /tygui command to query player & partial entity behavior records via GUI", + "使用/tysgui 命令使用图形窗口搜索关键词查询玩家&部分实体行为记录 (仅管理员可用)": "Use /tysgui command for keyword search to query player & partial entity behavior records via GUI (OP only)", + "tys命令参数解析 搜索类型:player action object(玩家或行为实施者 行为 被实施行为的对象) 搜索关键词:玩家名或行为实施者名 交互 破坏 攻击 放置 被实施行为的对象名": "tys command parameters: Search type: player, action, object (Player or action initiator, Action, Targeted object). Keywords: Player name or action initiator name, Interaction, Destruction, Attack, Placement, Targeted object name", + "实验性功能 使用/tyback 命令还原玩家直接方块放置破坏行为 格式 /tyback 坐标 时间(单位:小时) 半径 实施行为的玩家名(可选)(仅管理员可用)": "Experimental feature: Use /tyback command to restore direct player block placement or destruction. Format: /tyback Coordinates Time (in hours) Radius Player Name (optional) (OP only)", + "命令格式错误!请检查命令是否正确;如果使用~ ~ ~,请直接输入坐标": "Command format error! Please check if the command is correct; if using ~ ~ ~, input coordinates directly", + "查询半径最大值为100 !": "Query radius max value is 100!", + "未查询到任何结果。": "No results found.", + "已为您查询到此坐标半径": "Found records for this coordinate radius", + "格": " blocks", + "小时内的玩家&部分实体行为记录": "hours ago about player & partial entity behavior records", + "请通过弹窗查看": "Please check the popup window", + "行为实施者": "Action initiator", + "行为": "Action", + "坐标": "Coordinates", + "时间": "Time", + "对象类型": "Object type", + "维度": "Dimension", + "下一页": "Next page", + "上一页": "Previous page", + "半径": "Radius", + "小时内的查询记录-第": "hours ago query records - The ", + "页": " Page", + "小时内的查询记录": "hours ago query records", + "格式错误": "Format error", + "玩家": "Player ", + "已经在": "Already in ", + "被添加至黑名单中了,理由是:": "been added to the blacklist, the reason is:", + "请勿重复添加": "Do not add repeatedly", + "已被加入黑名单,理由": "has been blacklisted, reason:", + "理由": "Reason", + "黑名单文件不存在,已自动创建": "Blacklist file does not exist, automatically created", + "已从黑名单中删除": "removed from the blacklist", + "不存在于黑名单中": "does not exist in the blacklist", + "黑名单文件不存在": "Blacklist file does not exist", + "黑名单中没有玩家": "No players in the blacklist", + "于": "on", + "被封禁,理由": "Banned, reason:", + "设备ID": "Device ID", + "被添加至设备ID黑名单中了,请勿重复添加": "been added to the device ID blacklist, do not add repeatedly", + "已被加入黑名单": "has been added to the blacklist", + "设备ID黑名单文件不存在,已自动创建": "Device ID blacklist file does not exist, automatically created", + "设备黑名单文件不存在": "Device blacklist file does not exist", + "没有设备在黑名单中": "No devices in the blacklist", + "被封禁": "been banned", + "命令格式错误!请检查命令是否正确": "Command format error! Please check if the command is correct", + "命令格式错误!未知的参数": "Command format error! Unknown parameter", + "已为您查询到关键词": "Found records for the keyword", + "的以下相关内容": "with the following related content", + "小时内的记录-第": "hours ago records - The ", + "小时内的记录": "hours ago records", + "控制台无法使用该命令": "This command cannot be used in the console", + "天眼查询菜单": "Tianyan query menu", + "输入查询坐标": "Enter query coordinates", + "输入查询时间(单位小时)": "Enter query time (in hours)", + "输入查询半径": "Enter query radius", + "天眼关键词查询菜单": "Tianyan keyword query menu", + "选择搜索类型(玩家或行为实施者 行为 被实施行为的对象)": "Select search type (Player or action initiator, Action, Target object)", + "关键词": "Keyword", + "输入查询关键词": "Enter query keyword", + "半径最大值为100 !": "Maximum radius is 100!", + "无记录数据": "No record data", + "开始还原": "Start restoration", + "小时内的方块": "hours ago Blocks", + "在": "at", + "使用": "Use", + "交互": "Interact", + "破坏": "Destroy", + "放置": "Place", + "攻击": "Attack", + "你因涉嫌短时间内发送多条命令被ban": "You have been banned for sending multiple commands in a short time", + "因涉嫌短时间内发送多条命令被ban": "Banned for sending multiple commands in a short time", + "你因涉嫌短时间内发送多条消息被ban": "You have been banned for sending multiple messages in a short time", + "因涉嫌短时间内发送多条消息被ban": "Banned for sending multiple messages in a short time", + "你已被封禁,理由": "You have been banned, reason:", + "被封禁时间": "Ban time", + "处于封禁名单中,已被踢出,封禁理由为": "On the ban list and kicked out, ban reason:", + "你的设备已于": "Your device has been", + "被封禁的设备ID": "Banned device ID", + "试图加入服务器,已被踢出": "Attempted to join the server, kicked out", + "系统名称": "System name", + "加入了游戏": "joined the game", + "物品槽位": "Item Slot", + "物品名称": "Item Name", + "数量": "Quantity", + "的物品栏": "'s Inventory", + "搜查玩家物品栏 --格式 /tyo 玩家名": "Search player inventory -- format /tyo playername", + "使用 /tyo 命令查看玩家物品栏 格式 /tyo 玩家名": "Use the /tyo command to view a player's inventory -- format: /tyo playername", + "命令错误,请检查参数及玩家是否在线": "Error: Command error. Please check the parameters and ensure the player is online.", + "此玩家的物品栏里没有东西": "This player's inventory is empty.", + "清理数据库 --格式 /tyclean 时间": "Clean database -- Format: /tyclean time", + "参数错误": "Invalid parameters", + "数据库清理发生了未知错误": "An unknown error occurred during database cleaning", + "清理完成,数据库文件已整理": "Cleaning completed, database files have been organized", + "发生错误": "Error occurred", + "已删除": "Deleted ", + "这些数据超过": "These data exceed ", + "小时": " hours", + "已重构数据库释放空间": "Database has been restructured to free up space", + "行": " lines", + "\n\n天眼插件更新检测:\n插件版本与最新版本不符,请检查更新。最新版本为": "\n\nTianyan Plugin Update Check:\nThe plugin version does not match the latest version, please check for updates. The latest version is", + "\n\n天眼插件更新检测:\n无法获取最新版本信息\n": "\n\nTianyan Plugin Update Check:\nUnable to retrieve the latest version information\n", + "\n\n天眼插件更新检测:\n更新检测超时\n": "\n\nTianyan Plugin Update Check:\nUpdate check timed out\n", + "\n\n天眼插件更新检测:\n检测更新时发生未知错误": "\n\nTianyan Plugin Update Check:\nAn unknown error occurred while checking for updates" +} \ No newline at end of file diff --git a/src/endstone_tianyan/tianyan_plugin.py b/src/endstone_tianyan/tianyan_plugin.py index 3028789..bef8949 100644 --- a/src/endstone_tianyan/tianyan_plugin.py +++ b/src/endstone_tianyan/tianyan_plugin.py @@ -15,8 +15,10 @@ import sqlite3 from endstone.form import ModalForm,Dropdown,Label,ActionForm,TextInput,Slider,MessageForm from endstone.inventory import Inventory,PlayerInventory -from endstone_tianyan import zh_lang +from endstone_tianyan import zh_lang, eng_lang from endstone_tianyan import ty_clean +import requests +from concurrent.futures import ThreadPoolExecutor, TimeoutError # 兼容性代码,用于兼容1.1.3版本之前的数据 def ensure_blockdata_column(): @@ -33,29 +35,61 @@ def ensure_blockdata_column(): banidlist = os.path.join('plugins/tianyan_data/banidlist.json') config_file = os.path.join(subdir, 'config.json') lang_file = os.path.join(subdir, 'lang.json') - +plugin_version = "v1.1.6" + +# GitHub上的版本信息URL +VERSION_URL = "https://api.github.com/repos/yuhangle/Endstone_TianyanPlugin/releases/latest" + # 语言文件操作 -default_lang = zh_lang.default_lang +# 通过google.com可否访问来区分大陆与非大陆环境 +def can_access_google(timeout=3): + try: + response = requests.get('https://www.google.com', timeout=timeout) + # 如果响应状态码是200,表示成功访问 + if response.status_code == 200: + return True + except requests.ConnectionError as ce: + return False + except requests.Timeout as to: + return False + except requests.RequestException as re: + return False + + return False + +# 大陆环境默认语言 +cn_default_lang = zh_lang.default_lang +# 非大陆环境默认语言 +eng_default_lang = eng_lang.default_lang # 创建默认语言文件 if not os.path.exists(lang_file): + # 非大陆设置为英语默认,否则中文 + if can_access_google(): + default_lang = eng_default_lang + else: + default_lang = cn_default_lang with open(lang_file, 'w', encoding='utf-8') as f: json.dump(default_lang, f, ensure_ascii=False, indent=4) print(f"{datetime.now().isoformat()} [Tianyan] 未检测到语言文件,已创建默认语言文件 No language file was detected, and a default language file has been created.") - # 读取语言文件 with open(lang_file, 'r', encoding='utf-8') as f: lang = json.load(f) # 语言文件完整性检查 -default_key = set(default_lang.keys()) +default_key = set(cn_default_lang.keys()) lang_key = set(lang.keys()) if lang_key == default_key: print(f"{datetime.now().isoformat()} [Tianyan] 语言文件检测正常 Language file detection is normal") # 语言文件不完整 else: + # 检测网络判断区域来决定默认语言文件 + if can_access_google(): + default_lang = eng_default_lang + else: + default_lang = cn_default_lang # 语言版本信息存在时 lang_version = lang.get("lang-version", None) if lang_version: @@ -63,12 +97,20 @@ def ensure_blockdata_column(): if lang["lang-version"] == default_lang["lang-version"]: print(f"{datetime.now().isoformat()} [Tianyan] 天眼语言文件部分缺失! 使用默认语言文件 Part of the language file is missing! Using the default language file") lang = default_lang + # 语言文件为中文自动更新 elif lang["language"] == "中文": # 更新默认语言文件 with open(lang_file, 'w', encoding='utf-8') as f: - json.dump(default_lang, f, ensure_ascii=False, indent=4) + json.dump(cn_default_lang, f, ensure_ascii=False, indent=4) print(f"{datetime.now().isoformat()} [Tianyan] 天眼语言版本不适配! 已为您自动更新语言文件!") lang = default_lang + # 语言文件为英语自动更新 + elif lang["language"] == "English": + # 更新默认语言文件 + with open(lang_file, 'w', encoding='utf-8') as f: + json.dump(eng_default_lang, f, ensure_ascii=False, indent=4) + print(f"{datetime.now().isoformat()} [Tianyan] Tianyan Plugin language is not latest! The language file has been automatically updated for you!") + lang = default_lang # 语言版本不同 提示更新语言文件 else: print(f"{datetime.now().isoformat()} [Tianyan] 天眼语言版本不适配! 使用默认语言文件! 请下载新的语言文件! The language version is incompatible! Using the default language file! Please download the new language file!") @@ -257,6 +299,26 @@ def run_tyclean(self,clean_time): self.server.broadcast_message(f"{ColorFormat.RED}{lang['数据库清理发生了未知错误']}") # 完成 is_running = False + + # 更新检测函数 + + def check_for_updates(self): + try: + # 使用ThreadPoolExecutor来管理线程和超时 + with ThreadPoolExecutor(max_workers=1) as executor: + future = executor.submit(lambda: requests.get(VERSION_URL, timeout=3)) # 设置请求级别的3秒超时 + response = future.result(timeout=3) # 设置线程池级别的3秒超时 + + if response.status_code == 200: + latest_version = response.json().get('tag_name', 'Unknown') + if not latest_version == plugin_version: + self.server.logger.info(f"{ColorFormat.YELLOW}{lang['\n\n天眼插件更新检测:\n插件版本与最新版本不符,请检查更新。最新版本为']}: {latest_version}\n") + else: + self.server.logger.info(f"{ColorFormat.YELLOW}{lang['\n\n天眼插件更新检测:\n无法获取最新版本信息\n']}") + except requests.exceptions.Timeout: + self.server.logger.info(f"{ColorFormat.YELLOW}{lang['\n\n天眼插件更新检测:\n更新检测超时\n']}") + except Exception as e: + self.server.logger.info(f"{ColorFormat.YELLOW}{lang['\n\n天眼插件更新检测:\n检测更新时发生未知错误']}: {e}\n") commands = { @@ -405,7 +467,9 @@ def on_load(self) -> None: ensure_blockdata_column() def on_enable(self) -> None: - self.logger.info(f"{ColorFormat.YELLOW}{lang["天眼插件已启用 版本"]} V1.1.5.1") + # 更新检测 + self.check_for_updates() + self.logger.info(f"{ColorFormat.YELLOW}{lang["天眼插件已启用 版本"]} {plugin_version}") self.logger.info(f"{ColorFormat.YELLOW}{lang["配置文件位于"]}plugins/tianyan_data/config.json") self.logger.info(f"{ColorFormat.YELLOW}{lang["插件语言设定为"]} {language}") self.logger.info(f"{ColorFormat.YELLOW}{lang["其余数据文件位于"]} plugins/tianyan_data/") @@ -1179,98 +1243,114 @@ def record_data(name, action, x, y, z, type,world): chestrec_data.append(interaction) #threading.Thread(target=write_to_file).start() - if event.block.type in [ - "minecraft:trapped_chest","minecraft:barrel","minecraft:ender_chest","minecraft:hopper","minecraft:dispenser", - "minecraft:dropper","minecraft:lever","minecraft:unpowered_repeater","minecraft:unpowered_comparator", - "minecraft:powered_comparator","minecraft:powered_repeater","minecraft:jukebox","minecraft:noteblock", - "minecraft:wooden_button","minecraft:spruce_button","minecraft:birch_button","minecraft:jungle_button","minecraft:acacia_button", - "minecraft:dark_oak_button","minecraft:mangrove_button","minecraft:cherry_button","minecraft:bamboo_button","minecraft:pale_oak_button", - "minecraft:crimson_button","minecraft:warped_button","minecraft:stone_button","minecraft:polished_blackstone_button", - "minecraft:standing_sign","minecraft:spruce_standing_sign","minecraft:birch_standing_sign","minecraft:jungle_standing_sign","minecraft:acacia_standing_sign", - "minecraft:darkoak_standing_sign","minecraft:mangrove_standing_sign","minecraft:cherry_standing_sign","minecraft:pale_oak_standing_sign","minecraft:bamboo_standing_sign", - "minecraft:crimson_standing_sign","minecraft:warped_standing_sign","minecraft:wall_sign","minecraft:spruce_wall_sign","minecraft:birch_wall_sign","minecraft:jungle_wall_sign", - "minecraft:acacia_wall_sign","minecraft:darkoak_wall_sign","minecraft:mangrove_wall_sign","minecraft:cherry_wall_sign","minecraft:pale_oak_wall_sign","minecraft:bamboo_wall_sign","minecraft:crimson_wall_sign","minecraft:warped_wall_sign", - "minecraft:oak_hanging_sign","minecraft:spruce_hanging_sign","minecraft:birch_hanging_sign","jungle_hanging_sign","acacia_hanging_sign", - "dark_oak_hanging_sign","mangrove_hanging_sign","cherry_hanging_sign","pale_oak_hanging_sign","bamboo_hanging_sign","crimson_hanging_sign","warped_hanging_sign", - "minecraft:anvil","minecraft:chipped_anvil","minecraft:damaged_anvil","minecraft:furnace","minecraft:lit_furnace","minecraft:blast_furnace","minecraft:lit_blast_furnace", - "minecraft:undyed_shulker_box", "minecraft:white_shulker_box", - "minecraft:light_gray_shulker_box", "minecraft:gray_shulker_box", - "minecraft:brown_shulker_box", "minecraft:red_shulker_box", - "minecraft:orange_shulker_box", "minecraft:yellow_shulker_box", - "minecraft:lime_shulker_box", "minecraft:green_shulker_box", - "minecraft:cyan_shulker_box", "minecraft:light_blue_shulker_box", - "minecraft:blue_shulker_box", "minecraft:purple_shulker_box", - "minecraft:magenta_shulker_box", "minecraft:pink_shulker_box","minecraft:chest" - - ]: - name = event.player.name - action = lang["交互"] - x = event.block.x - y = event.block.y - z = event.block.z - type = event.block.type - world = event.block.location.dimension.name - record_data(name, action, x, y, z, type, world) - # 解决空手交互时物品为空报错的问题 try: if event.item.type: - pass + hand_item = event.item.type except: - return - - #玩家使用物品交互 + hand_item = "hand" + + #先检测是否玩家使用物品交互 - if event.item.type in [ + if hand_item in [ "minecraft:flint_and_steel","minecraft:lava_bucket","minecraft:water_bucket","minecraft:powder_snow_bucket","minecraft:cod_bucket","minecraft:salmon_bucket","minecraft:pufferfish_bucket","minecraft:tropical_fish_bucket","minecraft:axolotl_bucket","minecraft:tadpole_bucket" - ]: # 打火石、岩浆桶、水桶、鱼桶交互 + ]: # 手持打火石、岩浆桶、水桶、鱼桶交互 name = event.player.name blocktype = event.block.type action = lang["交互"] x = event.block.x y = event.block.y z = event.block.z - type = f"{blocktype},{lang["使用"]}{event.item.type}" + type = f"{blocktype},{lang["使用"]}{hand_item}" world = event.block.location.dimension.name record_data(name, action, x, y, z, type,world) - elif event.item.type == "minecraft:bucket" and event.block.type in [ - "minecraft:water","minecraft:lava","minecraft:powder_snow"]:# 桶对可被桶装的方块交互 + elif hand_item == "minecraft:bucket" and event.block.type in [ + "minecraft:water","minecraft:lava","minecraft:powder_snow"]:# 手持桶对可被桶装的方块交互 name = event.player.name blocktype = event.block.type action = lang["交互"] x = event.block.x y = event.block.y z = event.block.z - type = f"{blocktype},{lang["使用"]}{event.item.type}" + type = f"{blocktype},{lang["使用"]}{hand_item}" world = event.block.location.dimension.name record_data(name, action, x, y, z, type,world) - elif event.item.type == "minecraft:fire_charge":# 火焰弹 + elif hand_item == "minecraft:fire_charge":# 手持火焰弹 name = event.player.name blocktype = event.block.type action = lang["交互"] x = event.block.x y = event.block.y z = event.block.z - type = f"{blocktype},{lang["使用"]}{event.item.type}" + type = f"{blocktype},{lang["使用"]}{hand_item}" world = event.block.location.dimension.name record_data(name, action, x, y, z, type,world) elif event.block.type in [ "minecraft:bed","minecraft:respawn_anchor" - ]:# 床 重生锚 + ]:# 被交互物品为床 重生锚 name = event.player.name blocktype = event.block.type action = lang["交互"] x = event.block.x y = event.block.y z = event.block.z - type = f"{blocktype},{lang["使用"]}{event.item.type}" + type = f"{blocktype},{lang["使用"]}{hand_item}" world = event.block.location.dimension.name record_data(name, action, x, y, z, type,world) + elif hand_item == "minecraft:end_crystal":# 手持末影水晶 + name = event.player.name + blocktype = event.block.type + action = lang["交互"] + x = event.block.x + y = event.block.y + z = event.block.z + type = f"{blocktype},{lang["使用"]}{hand_item}" + world = event.block.location.dimension.name + record_data(name, action, x, y, z, type,world) + + # 最后检测手持物品之外的容器告示牌等东西的交互事件 + elif event.block.type in [ + "minecraft:trapped_chest","minecraft:barrel","minecraft:ender_chest","minecraft:hopper","minecraft:dispenser", + "minecraft:dropper","minecraft:lever","minecraft:unpowered_repeater","minecraft:unpowered_comparator", + "minecraft:powered_comparator","minecraft:powered_repeater","minecraft:jukebox","minecraft:noteblock", + "minecraft:wooden_button","minecraft:spruce_button","minecraft:birch_button","minecraft:jungle_button","minecraft:acacia_button", + "minecraft:dark_oak_button","minecraft:mangrove_button","minecraft:cherry_button","minecraft:bamboo_button","minecraft:pale_oak_button", + "minecraft:crimson_button","minecraft:warped_button","minecraft:stone_button","minecraft:polished_blackstone_button", + "minecraft:standing_sign","minecraft:spruce_standing_sign","minecraft:birch_standing_sign","minecraft:jungle_standing_sign","minecraft:acacia_standing_sign", + "minecraft:darkoak_standing_sign","minecraft:mangrove_standing_sign","minecraft:cherry_standing_sign","minecraft:pale_oak_standing_sign","minecraft:bamboo_standing_sign", + "minecraft:crimson_standing_sign","minecraft:warped_standing_sign","minecraft:wall_sign","minecraft:spruce_wall_sign","minecraft:birch_wall_sign","minecraft:jungle_wall_sign", + "minecraft:acacia_wall_sign","minecraft:darkoak_wall_sign","minecraft:mangrove_wall_sign","minecraft:cherry_wall_sign","minecraft:pale_oak_wall_sign","minecraft:bamboo_wall_sign","minecraft:crimson_wall_sign","minecraft:warped_wall_sign", + "minecraft:oak_hanging_sign","minecraft:spruce_hanging_sign","minecraft:birch_hanging_sign","jungle_hanging_sign","acacia_hanging_sign", + "dark_oak_hanging_sign","mangrove_hanging_sign","cherry_hanging_sign","pale_oak_hanging_sign","bamboo_hanging_sign","crimson_hanging_sign","warped_hanging_sign", + "minecraft:anvil","minecraft:chipped_anvil","minecraft:damaged_anvil","minecraft:furnace","minecraft:lit_furnace","minecraft:blast_furnace","minecraft:lit_blast_furnace", + "minecraft:undyed_shulker_box", "minecraft:white_shulker_box", + "minecraft:light_gray_shulker_box", "minecraft:gray_shulker_box", + "minecraft:brown_shulker_box", "minecraft:red_shulker_box", + "minecraft:orange_shulker_box", "minecraft:yellow_shulker_box", + "minecraft:lime_shulker_box", "minecraft:green_shulker_box", + "minecraft:cyan_shulker_box", "minecraft:light_blue_shulker_box", + "minecraft:blue_shulker_box", "minecraft:purple_shulker_box", + "minecraft:magenta_shulker_box", "minecraft:pink_shulker_box","minecraft:chest" + + ]: + name = event.player.name + action = lang["交互"] + x = event.block.x + y = event.block.y + z = event.block.z + type = event.block.type + world = event.block.location.dimension.name + record_data(name, action, x, y, z, type, world) + + + + + # 方块破坏事件 @event_handler @@ -1327,9 +1407,11 @@ def record_data(name, action, x, y, z,type,world,blockdata): turnblock = event.block.data.block_states blockdata = f" [{', '.join([f'"{key}"={value}' if isinstance(value, (bool, int, float)) else f'"{key}"="{value}"' for key, value in turnblock.items()])}]" record_data(name, action, x, y, z,type,world,blockdata) + + return # 全开 - if blockrec == 2: + elif blockrec == 2: if True: name = event.player.name action = lang["破坏"] @@ -1342,8 +1424,10 @@ def record_data(name, action, x, y, z,type,world,blockdata): blockdata = f" [{', '.join([f'"{key}"={value}' if isinstance(value, (bool, int, float)) else f'"{key}"="{value}"' for key, value in turnblock.items()])}]" record_data(name, action, x, y, z,type,world,blockdata) + return + # 仅人造方块记录 - if blockrec == 4: + elif blockrec == 4: if event.block.type in [ "minecraft:stone","minecraft:granite","minecraft:diorite","minecraft:andesite","minecraft:grass_block","minecraft:dirt","minecraft:coarse_dirt","minecraft:podzol", "minecraft:sand","minecraft:red_sand","minecraft:gravel","minecraft:gold_ore","minecraft:iron_ore","minecraft:coal_ore","minecraft:oak_log","minecraft:spruce_log", @@ -1369,7 +1453,8 @@ def record_data(name, action, x, y, z,type,world,blockdata): "minecraft:mangrove_leaves","minecraft:mangrove_roots","minecraft:muddy_mangrove_roots","minecraft:mud","minecraft:cherry_log","minecraft:cherry_leaves","minecraft:torchflower","minecraft:pink_petals", "minecraft:pitcher_plant" ]: - return False + return + else : name = event.player.name action = lang["破坏"] @@ -1483,7 +1568,7 @@ def record_data(name, action, x, y, z,type,world): # def blocktest(self,event: PlayerInteractEvent ): # player = event.player # inv = player.inventory -# self.server.broadcast_message(ColorFormat.YELLOW + f"{event.player.name}" + "位置" f"{event.block.x}"" " + f"{event.block.y}"" " + f"{event.block.z}" + f"{event.block.type}" + f"{event.block.location.dimension.name}" + f"{event.item}" + f"{inv}") +# self.server.broadcast_message(ColorFormat.YELLOW + f"{event.player.name}" + "位置" f"{event.block.x}"" " + f"{event.block.y}"" " + f"{event.block.z}" + f"{event.block.type}" + f"{event.block.location.dimension.name}" + f"{event.item}") # 用于调试的事件 # @event_handler # def test(self,event: BlockBreakEvent): diff --git a/src/endstone_tianyan/zh_lang.py b/src/endstone_tianyan/zh_lang.py index 3e308b9..a1591e2 100644 --- a/src/endstone_tianyan/zh_lang.py +++ b/src/endstone_tianyan/zh_lang.py @@ -1,7 +1,7 @@ # 单独把语言文件拿出来 default_lang = { - 'lang-version': '1.1.5', + 'lang-version': '1.1.6', 'language': "中文", '查询玩家&部分实体行为记录 --格式 /ty x坐标 y坐标 z坐标 时间(单位:小时) 半径': '查询玩家&部分实体行为记录 --格式 /ty x坐标 y坐标 z坐标 时间(单位:小时) 半径', '查看天眼命令帮助信息': '查看天眼命令帮助信息', @@ -129,5 +129,9 @@ '这些数据超过': '这些数据超过', '小时': '小时', '已重构数据库释放空间': '已重构数据库释放空间', - '行': '行' + '行': '行', + '\n\n天眼插件更新检测:\n插件版本与最新版本不符,请检查更新。最新版本为': '\n\n天眼插件更新检测:\n插件版本与最新版本不符,请检查更新。最新版本为', + '\n\n天眼插件更新检测:\n无法获取最新版本信息\n': '\n\n天眼插件更新检测:\n无法获取最新版本信息\n', + '\n\n天眼插件更新检测:\n更新检测超时\n': '\n\n天眼插件更新检测:\n更新检测超时\n', + '\n\n天眼插件更新检测:\n检测更新时发生未知错误': '\n\n天眼插件更新检测:\n检测更新时发生未知错误' } \ No newline at end of file