JS脚本:禽肉全收集(提瓦特)【修复】、JS脚本:一只爱可菲【厨娘版】【修复】 (#645)

* 添加了制谱器

* 修正两个误改点位

* 更新版号

* 添加制谱器【跟新描述】

* 添加制谱器

* Delete repo/js/AutoYuanQin/assets/1.小星星.json

* Delete repo/js/AutoYuanQin/assets/2.小星星变奏曲.json

* Delete repo/js/AutoYuanQin/assets/3.Unknown Mother Goose [アンノウン・マザーグース].json

* Delete repo/js/AutoYuanQin/assets/4.铃芽之旅[Suzume].json

* Delete repo/js/AutoYuanQin/assets/5.Flower Dance.json

* Delete repo/js/AutoYuanQin/assets/example.json

* 更新制谱器

* 完善制谱器

完善了制谱器,修复了制谱器的遗留问题

* 删除重复文件

* 更新制谱器版号

* update repo.json

* JS脚本: 自动烹饪

* 修正JS脚本描述

* 添加了全部料理的快速选择

* JS脚本: 全禽肉收集(提瓦特)

* JS脚本:禽肉全收集(提瓦特)【修复】

* JS脚本;一只爱可菲(厨娘版)【修复】

* JS脚本:一只爱可菲【厨娘版】【修复】

修复了烹饪结果识别异常的bug
This commit is contained in:
提瓦特钓鱼玳师
2025-04-26 09:41:30 +08:00
committed by GitHub
parent 8f4e251f6f
commit febe96eee5
6 changed files with 28 additions and 25 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

View File

@@ -13,7 +13,8 @@
const name_can_make = ['酪香蟹蟹锅', '丰稔之赐', '沃陆果饮', '粒果膨膨棒', '酪烤菇菇串', '乌乌黑蛋', '钱汤馒头', '梅落雪间醉', '炎岩之颂', '清心花饼', '奇瑰之汤', '纵声欢唱', '山与海与天空', '火山蛋糕', '粒果裹裹', '苦水', '串烤牛心', '宝石闪闪', '温泉时光', '咚咚嘭嘭', '苹果金条条', '塔塔可', '兽肉旋风', '巧克力', '龙龙饼干', '奇旅馔匣', '夹心土豆泥', '炸虾豆球', '火焰炖肉', '「强水」', '苹果卷卷', '多彩之森', '粒果肉汤', '粒果片片', '酸汁腌鱼', '薄荷酱烤鱼', '粒果杯', '膨膨冰淇淋', '酥酥羊角包', '奶油炖鸡', '桔香鸭胸肉', '泡泡舒芙蕾', '肉满满寿司', '八宝福禄鸭', '茶好月圆', '知足常乐', '红烧肉圆', '繁弦急管', '宾至如归', '金玉满堂', '茶熏乳鸽', '油爆双脆', '古华鱼羊鲜', '玉纹茶叶蛋', '沉玉茶露', '蜜汁叉烧', '千灵慕斯', '缤纷马卡龙', '圈圈圆圆', '致水神', '羊杂哈吉斯', '桔桔薄饼', '港湾牛肚', '咖啡芭芭露', '卡苏莱砂锅', '纳博内番茄盅', '「纯洁之水」', '百味一缕', '苹果黑布丁', '香烤肋排', '杏仁鳟鱼', '韦西鸡', '花果三重奏', '果果仙酪', '鱼鱼咏唱派', '炸鱼薯条', '生肉塔塔', '肉酱千层面', '白淞鲜汤', '膨膨泡芙', '双果清露', '果果软糖', '晶螺糕', '枫丹肥肝', '奶油蘑菇汤', '塔塞斯杂烩', '浮露白霜', '蒜香面包棍', '水乡肉冻', '枫丹洋葱汤', '油封鸭腿', '琼玉果汤', '脆饼珐提', '超级至尊披萨', '蜜金泡果', '薄荷曼果茶', '镀金锅', '秘香肉团', '萨布兹炖肉', '萨巴桑炸角', '蔷薇奶糊', '帕蒂沙兰布丁', '椰炭饼', '千层酥酥', '假日果酿', '枣椰蜜糖', '阿如拌饭', '唐杜尔烤鸡', '肉肉烤蘑菇披萨', '兽米香香', '土豆船', '口袋饼', '奶香菌菇脆塔', '米圆塔', '黄油鸡', '日落莓莓茶', '雨林沙拉', '绿汁脆球', '咖喱虾', '奶酱鲜鱼', '烤肉卷', '马萨拉芝士球', '杂菇荟萃', '薄荷豆汤', '兰巴德鱼卷', '紫苑云霓', '炸肉排三明治', '山家烧', '乌冬面', '丰年有余', '龙须面', '五宝腌菜', '鳗肉茶泡饭', '绯樱虾仙贝', '树莓水馒头', '鲜鱼炖萝卜', '若竹煮', '荞麦面', '辣肉窝窝头', '蛋包饭', '米饭布丁', '文心豆腐', '活力喵饭', '日落鲷鱼烧', '红烩兽肉', '多多烧', '蒲烧鳗肉', '甜虾寿司', '鸟蛋寿司', '刺身拼盘', '黄油蟹蟹', '绀田煮', '绯樱饼', '兽骨拉面', '三彩团子', '绯樱天妇罗', '串串三味', '渡来禽肉', '市井杂煮', '什锦炒面', '金枪鱼寿司', '饭团', '蟹黄壳壳烧', '鸟蛋烧', '干烧香鱼', '味噌汤', '鸡豆花', '清炒虾仁', '米窝窝', '干锅腊肉', '蟹黄豆腐', '干炒鱼河', '大黄金吮指鸡', '兽肉薄荷卷', '脆脆鸡腿堡', '鲜虾脆薯盏', '香浓土豆泥', '凉拌薄荷', '薄荷果冻', '明月蛋', '素鲍鱼', '岩港三鲜', '四方和平', '绝云锅巴', '黄油煎鱼', '稠汁蔬菜炖肉', '天枢肉', '月亮派', '金丝虾球', '北地苹果焖肉', '腌笃鲜', '扣三丝', '冒险家蛋堡', '莲花酥', '仙跳墙', '翡玉什锦袋', '黄金蟹', '中原杂碎', '蜜酱胡萝卜煎肉', '风神杂烩菜', '蟹黄火腿焗时蔬', '蒙德土豆饼', '松鼠鱼', '水煮黑背鲈', '烤蘑菇披萨', '冷肉拼盘', '黄油松茸', '轻策农家菜', '「堆高高」', '来来菜', '嘟嘟莲海鲜羹', '白汁时蔬烩肉', '莲子禽蛋羹', '庄园烤松饼', '山珍热卤面', '北地烟熏鸡', '松茸酿肉卷', '甜甜花酿鸡', '水晶虾', '火火肉酱面', '炸萝卜丸子', '杏仁豆腐', '香嫩椒椒鸡', '满足沙拉', '珍珠翡翠白玉汤', '渔人吐司', '蒙德烤鱼', '摩拉肉', '爆炒肉片', '提瓦特煎蛋', '烤肉排', '野菇鸡肉串', '烤吃虎鱼', '萝卜时蔬汤'] const name_can_make = ['酪香蟹蟹锅', '丰稔之赐', '沃陆果饮', '粒果膨膨棒', '酪烤菇菇串', '乌乌黑蛋', '钱汤馒头', '梅落雪间醉', '炎岩之颂', '清心花饼', '奇瑰之汤', '纵声欢唱', '山与海与天空', '火山蛋糕', '粒果裹裹', '苦水', '串烤牛心', '宝石闪闪', '温泉时光', '咚咚嘭嘭', '苹果金条条', '塔塔可', '兽肉旋风', '巧克力', '龙龙饼干', '奇旅馔匣', '夹心土豆泥', '炸虾豆球', '火焰炖肉', '「强水」', '苹果卷卷', '多彩之森', '粒果肉汤', '粒果片片', '酸汁腌鱼', '薄荷酱烤鱼', '粒果杯', '膨膨冰淇淋', '酥酥羊角包', '奶油炖鸡', '桔香鸭胸肉', '泡泡舒芙蕾', '肉满满寿司', '八宝福禄鸭', '茶好月圆', '知足常乐', '红烧肉圆', '繁弦急管', '宾至如归', '金玉满堂', '茶熏乳鸽', '油爆双脆', '古华鱼羊鲜', '玉纹茶叶蛋', '沉玉茶露', '蜜汁叉烧', '千灵慕斯', '缤纷马卡龙', '圈圈圆圆', '致水神', '羊杂哈吉斯', '桔桔薄饼', '港湾牛肚', '咖啡芭芭露', '卡苏莱砂锅', '纳博内番茄盅', '「纯洁之水」', '百味一缕', '苹果黑布丁', '香烤肋排', '杏仁鳟鱼', '韦西鸡', '花果三重奏', '果果仙酪', '鱼鱼咏唱派', '炸鱼薯条', '生肉塔塔', '肉酱千层面', '白淞鲜汤', '膨膨泡芙', '双果清露', '果果软糖', '晶螺糕', '枫丹肥肝', '奶油蘑菇汤', '塔塞斯杂烩', '浮露白霜', '蒜香面包棍', '水乡肉冻', '枫丹洋葱汤', '油封鸭腿', '琼玉果汤', '脆饼珐提', '超级至尊披萨', '蜜金泡果', '薄荷曼果茶', '镀金锅', '秘香肉团', '萨布兹炖肉', '萨巴桑炸角', '蔷薇奶糊', '帕蒂沙兰布丁', '椰炭饼', '千层酥酥', '假日果酿', '枣椰蜜糖', '阿如拌饭', '唐杜尔烤鸡', '肉肉烤蘑菇披萨', '兽米香香', '土豆船', '口袋饼', '奶香菌菇脆塔', '米圆塔', '黄油鸡', '日落莓莓茶', '雨林沙拉', '绿汁脆球', '咖喱虾', '奶酱鲜鱼', '烤肉卷', '马萨拉芝士球', '杂菇荟萃', '薄荷豆汤', '兰巴德鱼卷', '紫苑云霓', '炸肉排三明治', '山家烧', '乌冬面', '丰年有余', '龙须面', '五宝腌菜', '鳗肉茶泡饭', '绯樱虾仙贝', '树莓水馒头', '鲜鱼炖萝卜', '若竹煮', '荞麦面', '辣肉窝窝头', '蛋包饭', '米饭布丁', '文心豆腐', '活力喵饭', '日落鲷鱼烧', '红烩兽肉', '多多烧', '蒲烧鳗肉', '甜虾寿司', '鸟蛋寿司', '刺身拼盘', '黄油蟹蟹', '绀田煮', '绯樱饼', '兽骨拉面', '三彩团子', '绯樱天妇罗', '串串三味', '渡来禽肉', '市井杂煮', '什锦炒面', '金枪鱼寿司', '饭团', '蟹黄壳壳烧', '鸟蛋烧', '干烧香鱼', '味噌汤', '鸡豆花', '清炒虾仁', '米窝窝', '干锅腊肉', '蟹黄豆腐', '干炒鱼河', '大黄金吮指鸡', '兽肉薄荷卷', '脆脆鸡腿堡', '鲜虾脆薯盏', '香浓土豆泥', '凉拌薄荷', '薄荷果冻', '明月蛋', '素鲍鱼', '岩港三鲜', '四方和平', '绝云锅巴', '黄油煎鱼', '稠汁蔬菜炖肉', '天枢肉', '月亮派', '金丝虾球', '北地苹果焖肉', '腌笃鲜', '扣三丝', '冒险家蛋堡', '莲花酥', '仙跳墙', '翡玉什锦袋', '黄金蟹', '中原杂碎', '蜜酱胡萝卜煎肉', '风神杂烩菜', '蟹黄火腿焗时蔬', '蒙德土豆饼', '松鼠鱼', '水煮黑背鲈', '烤蘑菇披萨', '冷肉拼盘', '黄油松茸', '轻策农家菜', '「堆高高」', '来来菜', '嘟嘟莲海鲜羹', '白汁时蔬烩肉', '莲子禽蛋羹', '庄园烤松饼', '山珍热卤面', '北地烟熏鸡', '松茸酿肉卷', '甜甜花酿鸡', '水晶虾', '火火肉酱面', '炸萝卜丸子', '杏仁豆腐', '香嫩椒椒鸡', '满足沙拉', '珍珠翡翠白玉汤', '渔人吐司', '蒙德烤鱼', '摩拉肉', '爆炒肉片', '提瓦特煎蛋', '烤肉排', '野菇鸡肉串', '烤吃虎鱼', '萝卜时蔬汤']
// 模板匹配图片路径 // 模板匹配图片路径
const pic_path = { const pic_path = {
"slide_bar_main": "assets\\others\\slide_bar_main.png", "slide_bar_main_up": "assets\\others\\slide_bar_main_up.png",
"slide_bar_main_down": "assets\\others\\slide_bar_main_down.png",
"slide_bar_cooking": "assets\\others\\slide_bar_cooking.png", "slide_bar_cooking": "assets\\others\\slide_bar_cooking.png",
"claim": "assets\\others\\claim.png", "claim": "assets\\others\\claim.png",
"auto_cooking": { "auto_cooking": {
@@ -7413,25 +7414,28 @@
* *
* @param {string} direction: 滑动方向 * @param {string} direction: 滑动方向
* @param {bigint} pages: 页数 * @param {bigint} pages: 页数
* @returns {Promise<void>} 滑动到底部或者找不到滑块return false成功滑动return true * @returns {Promise<void>}
*/ */
async function scroll_pages_main(direction = "down", pages = 1) { async function scroll_pages_main(direction = "down", pages = 1) {
const slide_barRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(pic_path["slide_bar_main"]), 1282, 112, 13, 840); const slide_bar_upRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(pic_path["slide_bar_main_up"]), 1282, 112, 13, 840);
slide_barRo.threshold = 0.6; const slide_bar_downRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(pic_path["slide_bar_main_down"]), 1282, 112, 13, 840);
slide_bar_upRo.threshold = 0.6;
slide_bar_downRo.threshold = 0.6;
for (let i = 0; i < pages; i++) { for (let i = 0; i < pages; i++) {
moveMouseTo(1555, 860); // 移走鼠标,防止干扰识别 moveMouseTo(1555, 860); // 移走鼠标,防止干扰识别
await sleep(200); await sleep(200);
let slide_bar = captureGameRegion().Find(slide_barRo); // 当前页面模板匹配 let slide_bar_up = captureGameRegion().Find(slide_bar_upRo); // 当前页面模板匹配
if (slide_bar.isExist()) { let slide_bar_down = captureGameRegion().Find(slide_bar_downRo); // 当前页面模板匹配
log.info(`定位到滑块...(${slide_bar.x}, ${slide_bar.y})-滑动方向: ${direction}`); if (slide_bar_up.isExist() && slide_bar_down.isExist()) {
if (slide_bar.y > 752 && direction === "down") { // 当前为向下滑动且滑块y值已经大于设定y值 log.info(`定位到滑块...(${slide_bar_up.x}, ${slide_bar_up.y})-滑动方向: ${direction}`);
if (slide_bar_down.y > 920 && direction === "down") {
log.info(`滑块已经滑动到底部...`); log.info(`滑块已经滑动到底部...`);
if (i != 0) { if (i != 0) {
return true; return true;
} else { } else {
return false; return false;
} }
} else if (slide_bar.y < 125 && direction === "up") { // 当前为向上滑动且滑块y值已经小于设定y值 } else if (slide_bar_up.y < 125 && direction === "up") {
log.info(`滑块已经滑动到顶部...`); log.info(`滑块已经滑动到顶部...`);
if (i != 0) { if (i != 0) {
return true; return true;
@@ -7439,8 +7443,8 @@
return false; return false;
} }
} }
click(1289, direction === "down" ? slide_bar.y + 205 : slide_bar.y - 20); // 88 + 175 = 263 click(1289, direction === "down" ? slide_bar_down.y + 20 : slide_bar_up.y - 20); // 向上下滑动(点击)
await sleep(10); await sleep(100);
} else { } else {
log.error("未找到滑块,无法执行页面滑动操作!"); log.error("未找到滑块,无法执行页面滑动操作!");
return false; return false;
@@ -8245,7 +8249,7 @@
// 识别当前buff(判断烹饪产物) // 识别当前buff(判断烹饪产物)
let current_buff = get_current_buff(); let current_buff = get_current_buff();
if (unlock || (proficiency[0] === proficiency[1] && proficiency[1] !== 0)) { // 解锁了自动烹饪 if (unlock || (proficiency[0] === proficiency[1] && proficiency[1] !== 0)) { // 解锁了自动烹饪
const loop_time = Math.ceil(setting_dic["cooking"][food_name] / 99) + 1; // 总计循环数一次最大99 const loop_time = Math.floor(setting_dic["cooking"][food_name] / 99) + 1; // 总计循环数一次最大99
let cook_num = setting_dic["cooking"][food_name] + 0; // 设定的数量 let cook_num = setting_dic["cooking"][food_name] + 0; // 设定的数量
for (let i = 0; i < loop_time; i++) { for (let i = 0; i < loop_time; i++) {
let cook_time = i !== loop_time - 1 ? 99: cook_num - i * 99; // 本次烹饪数 let cook_time = i !== loop_time - 1 ? 99: cook_num - i * 99; // 本次烹饪数
@@ -8317,7 +8321,7 @@
unlock = await is_unlock(); // 检测当前食材是否已经解锁 unlock = await is_unlock(); // 检测当前食材是否已经解锁
} }
if (unlock_flag) { if (unlock_flag) {
const loop_time = Math.ceil(cook_num / 99) + 1; // 总计循环数一次最大99 const loop_time = Math.floor(cook_num / 99) + 1; // 总计循环数一次最大99
let cook_num = setting_dic["cooking"][food_name] + 0; // 设定的数量 let cook_num = setting_dic["cooking"][food_name] + 0; // 设定的数量
for (let i = 0; i < loop_time; i++) { for (let i = 0; i < loop_time; i++) {
let cook_time = i !== loop_time - 1 ? 99: cook_num - i * 99; // 本次烹饪数 let cook_time = i !== loop_time - 1 ? 99: cook_num - i * 99; // 本次烹饪数

View File

@@ -1,7 +1,7 @@
{ {
"manifest_version": 1, "manifest_version": 1,
"name": "一只爱可菲(厨娘版)", "name": "一只爱可菲(厨娘版)",
"version": "1.1", "version": "1.2",
"bgi_version": "0.44.6", "bgi_version": "0.44.6",
"description": "脚本名称:一只爱可菲(厨娘版)\n功能描述专精料理制作的爱可菲(自动烹饪及解锁、特殊料理)\n核心功能------------------------------>\n1.自动烹饪:支持手动烹饪和自动烹饪,支持只刷满熟练度\n2.自动特殊料理:支持根据菜名和角色名自动进行单/多个特殊料理的烹饪(可以调节预期数量)\n3.其他料理获取:除了烹饪以外的部分料理的获取[仅有数据,未实装]\n注意事项------------------------------>\n1.请确保原神分辨率是1920x1080\n2.请尽量确保食材充足,如果食材不充足会自动跳过\n---------------------------------------->\n作者提瓦特钓鱼玳师\n脚本反馈邮箱hijiwos@hotmail.com", "description": "脚本名称:一只爱可菲(厨娘版)\n功能描述专精料理制作的爱可菲(自动烹饪及解锁、特殊料理)\n核心功能------------------------------>\n1.自动烹饪:支持手动烹饪和自动烹饪,支持只刷满熟练度\n2.自动特殊料理:支持根据菜名和角色名自动进行单/多个特殊料理的烹饪(可以调节预期数量)\n3.其他料理获取:除了烹饪以外的部分料理的获取[仅有数据,未实装]\n注意事项------------------------------>\n1.请确保原神分辨率是1920x1080\n2.请尽量确保食材充足,如果食材不充足会自动跳过\n---------------------------------------->\n作者提瓦特钓鱼玳师\n脚本反馈邮箱hijiwos@hotmail.com",
"authors": [ "authors": [

View File

@@ -153,7 +153,7 @@
* */ * */
function parse_file_name(file_name) { function parse_file_name(file_name) {
try { try {
const file_msg = file_name.split() const file_msg = file_name.split("-")
let msg_dic = {}; // 存储路径信息 let msg_dic = {}; // 存储路径信息
const area = file_msg[0]; const area = file_msg[0];
@@ -190,7 +190,7 @@
* */ * */
async function run_file(file_name) { async function run_file(file_name) {
const base_path_pathing = "assets/pathing/"; const base_path_pathing = "assets/pathing/";
await keyMouseScript.runFile(base_path_pathing + file_name + ".json"); await pathingScript.runFile(base_path_pathing + file_name + ".json");
} }
async function main() { async function main() {
@@ -202,16 +202,15 @@
const setting_msg = read_settings(); const setting_msg = read_settings();
// 自动拾取 // 自动拾取
if (setting_msg["mode_pick"] === "自动拾取") { if (setting_msg["mode_pick"] === "自动拾取") {
dispatcher.addTimer(new RealtimeTimer("AutoPick"); dispatcher.addTimer(new RealtimeTimer("AutoPick"));
} else if (setting_msg["mode_pick"] === "强制拾取") { } else if (setting_msg["mode_pick"] === "强制拾取") {
dispatcher.addTimer(new RealtimeTimer("AutoPick", {"forceInteraction": true})); dispatcher.addTimer(new RealtimeTimer("AutoPick", {"forceInteraction": true}));
} }
// 刷取禽肉上限 // 刷取禽肉上限
if (setting_msg["check_upper_limit"]) { // if (setting_msg["check_upper_limit"]) {}
upper_one = 0; upper_one = 0;
upper_two = 0; upper_two = 0;
upper_three = 0; upper_three = 0;
}
// 输出JS脚本配置 // 输出JS脚本配置
log.info(`下落路线: ${setting_msg["check_descend"] ? "禁用": "启用"}`); log.info(`下落路线: ${setting_msg["check_descend"] ? "禁用": "启用"}`);
log.info(`战斗路线: ${setting_msg["check_fight"] ? "禁用": "启用"}`); log.info(`战斗路线: ${setting_msg["check_fight"] ? "禁用": "启用"}`);
@@ -241,7 +240,7 @@
} }
// 执行任务 // 执行任务
run_file(pathing_list[i]); await run_file(pathing_list[i]);
// 禽肉上限判定 // 禽肉上限判定
if (setting_msg["check_upper_limit"]) { if (setting_msg["check_upper_limit"]) {
for (const [key, value] of Object.entries(path_msg["objects"])) { for (const [key, value] of Object.entries(path_msg["objects"])) {

View File

@@ -1,9 +1,9 @@
{ {
"manifest_version": 1, "manifest_version": 1,
"name": "禽肉全收集(提瓦特)", "name": "禽肉全收集(提瓦特)",
"version": "1.0", "version": "1.1",
"bgi_version": "0.43.1", "bgi_version": "0.43.1",
"description": "脚本名称:禽肉收集(提瓦特)\n功能描述多种形式的提瓦特禽肉采集(下落攻击、战斗)\n核心功能------------------------------>\n1.刷取禽肉上限(目前路线不足)\n2.支持自行启用(禁用)下落(战斗)路线\n3.支持选择刷取鸟类(1禽肉、2禽肉、3禽肉)\n4.内置了4点的空月祝福检测(默认启用)\n注意事项------------------------------>\n1.包含下落路线时行走位建议角色为绮良良或埃洛伊(天赋不易惊动小动物)\n2.内置的空月祝福领取逻辑与JS脚本提瓦特自动钓鱼(全流程+自选)一致\n---------------------------------------->\n作者提瓦特钓鱼玳师\n脚本反馈邮箱hijiwos@hotmail.com", "description": "脚本名称:禽肉收集(提瓦特)\n功能描述多种形式的提瓦特禽肉采集(下落攻击、战斗)\n核心功能------------------------------>\n1.刷取禽肉上限(目前路线不足)\n2.支持自行启用(禁用)下落(战斗)路线\n3.支持选择刷取鸟类(1禽肉、2禽肉、3禽肉)\n4.内置了4点的空月祝福检测(默认启用)\n注意事项------------------------------>\n1.包含下落路线时行走位建议角色为绮良良或埃洛伊(天赋不易惊动小动物)\n2.内置的空月祝福领取逻辑与JS脚本提瓦特自动钓鱼(全流程+自选)一致\n---------------------------------------->\n作者提瓦特钓鱼玳师\n脚本反馈邮箱hijiwos@hotmail.com",
"authors": [ "authors": [
{ {
"name": "提瓦特钓鱼玳师" "name": "提瓦特钓鱼玳师"