From 9349b7ab3c6ffdaaed478f4b54283f61b7be0228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= <8441078+i_melon@user.noreply.gitee.com> Date: Wed, 25 Feb 2026 23:49:50 +0800 Subject: [PATCH] dev --- backend/api/routes/info.py | 4 +- backend/core/basic/character.py | 4 +- backend/core/character/adventure.py | 24 +-- backend/core/equipment/version_0/avatar.py | 18 +- backend/core/equipment/version_0/equ.py | 6 + backend/core/open/helper.py | 172 ++++++++++++++++++ backend/dataFiles/dcalc_0.db | Bin 1007616 -> 1007616 bytes backend/openapi | 2 +- .../Character/Forge/components/Avatars.vue | 2 +- frontend/src/stores/info.ts | 2 +- 10 files changed, 206 insertions(+), 28 deletions(-) create mode 100644 backend/core/open/helper.py diff --git a/backend/api/routes/info.py b/backend/api/routes/info.py index 1c166274..4377764b 100644 --- a/backend/api/routes/info.py +++ b/backend/api/routes/info.py @@ -9,6 +9,7 @@ from api.core.Redis import get_redis_info from api.dp import RedisDep,AltersDep from core.character.adventure import get_adv_list from core.basic.character import createCharacter +from core.open.helper import get_user_info_by_id router = APIRouter() @@ -97,8 +98,7 @@ async def get_skill_info( @router.get("/dnfhelper/{uid}/") async def get_info_by_dnfhelper(uid: str, redis: RedisDep): try: - from openapi.dnfhelper.main import get_main_user_info_by_id - result = await get_main_user_info_by_id(uid) + result = await get_user_info_by_id(uid,'') return response(data=result) except Exception as e: print(f"Error fetching DNFHelper info: {e}") diff --git a/backend/core/basic/character.py b/backend/core/basic/character.py index 0b606a5b..eab74e7f 100644 --- a/backend/core/basic/character.py +++ b/backend/core/basic/character.py @@ -724,9 +724,9 @@ class Character(CharacterProperty): def calc_avatar(self, avatar: dict): """计算时装效果""" equ = get_equipment(self.equVersion) - dress = {key: value for key, value in avatar.items() if key in ['头发', '帽子', '脸部', '胸部', '上衣', '腰带', '下装', '鞋']} + dress = {key: value for key, value in avatar.items() if key in ['头部', '帽子', '脸部', '胸部', '上衣', '腰带', '下装', '鞋']} equ.funs.calc_dress_effect(dress, self) - avatarElse = {key: value for key, value in avatar.items() if key not in ['头发', '帽子', '脸部', '胸部', '上衣', '腰带', '下装', '鞋']} + avatarElse = {key: value for key, value in avatar.items() if key not in ['头部', '帽子', '脸部', '胸部', '上衣', '腰带', '下装', '鞋']} for key in avatarElse: value = avatarElse[key].get('enchant', None) emblem_0 = avatarElse[key].get('emblem_0', None) diff --git a/backend/core/character/adventure.py b/backend/core/character/adventure.py index 95e1cded..c58860c5 100644 --- a/backend/core/character/adventure.py +++ b/backend/core/character/adventure.py @@ -31,10 +31,10 @@ adv = [ 'name': 'fighter_male', 'title': '格斗家(男)', 'children': [ - {'id': 0, 'name': 'nenmaster_male', 'title': '归元·气功师', 'open': True,'class': 'GF.fighter_male.nenmaster_male'}, + {'id': 0, 'name': 'nenmaster_male', 'title': '归元·气功师', 'open': True, 'class': 'GF.fighter_male.nenmaster_male'}, {'id': 1, 'name': 'striker_male', 'title': '归元·散打', 'open': True, 'class': 'GF.fighter_male.striker_male'}, {'id': 2, 'name': 'brawler_male', 'title': '归元·街霸', 'open': True, 'class': 'GF.fighter_male.brawler_male'}, - {'id': 3, 'name': 'grappler_male', 'title': '归元·柔道家', 'open': True,'class': 'GF.fighter_male.grappler_male'}, + {'id': 3, 'name': 'grappler_male', 'title': '归元·柔道家', 'open': True, 'class': 'GF.fighter_male.grappler_male'}, {'name': 'empty', 'title': '', 'comment': '首页'}, ], }, @@ -44,9 +44,9 @@ adv = [ 'title': '格斗家(女)', 'children': [ {'id': 0, 'name': 'nenmaster_female', 'title': '归元·气功师', 'open': True, 'class': 'GF.fighter_female.nenmaster_female'}, - {'id': 1, 'name': 'striker_female', 'title': '归元·散打', 'open': True,'class':"GF.fighter_female.striker_female"}, + {'id': 1, 'name': 'striker_female', 'title': '归元·散打', 'open': True, 'class': 'GF.fighter_female.striker_female'}, {'id': 2, 'name': 'brawler_female', 'title': '归元·街霸', 'open': False}, - {'id': 3, 'name': 'grappler_female', 'title': '归元·柔道家', 'open': True,'class':"GF.fighter_female.grappler_female"}, + {'id': 3, 'name': 'grappler_female', 'title': '归元·柔道家', 'open': True, 'class': 'GF.fighter_female.grappler_female'}, {'name': 'sponsor', 'url': 'https://bbs.colg.cn', 'title': '', 'open': True}, ], }, @@ -67,9 +67,9 @@ adv = [ 'name': 'gunner_female', 'title': '神枪手(女)', 'children': [ - {'id': 0, 'name': 'ranger_female', 'title': '重霄·漫游枪手', 'open': True,'class':"GF.gunner_female.ranger_female"}, - {'id': 1, 'name': 'launcher_female', 'title': '重霄·枪炮师', 'open': True,'class':'GF.gunner_female.launcher_female'}, - {'id': 2, 'name': 'mechanic_female', 'title': '重霄·机械师', 'open': False,'class': 'GF.gunner_female.mechanic_female'}, + {'id': 0, 'name': 'ranger_female', 'title': '重霄·漫游枪手', 'open': True, 'class': 'GF.gunner_female.ranger_female'}, + {'id': 1, 'name': 'launcher_female', 'title': '重霄·枪炮师', 'open': True, 'class': 'GF.gunner_female.launcher_female'}, + {'id': 2, 'name': 'mechanic_female', 'title': '重霄·机械师', 'open': False, 'class': 'GF.gunner_female.mechanic_female'}, {'id': 3, 'name': 'spitfire_female', 'title': '重霄·弹药专家', 'open': True, 'class': 'GF.gunner_female.spitfire_female'}, {'id': 4, 'name': 'paramedic', 'title': '重霄·协战师', 'open': True, 'class': 'GF.gunner_female.paramedic'}, ], @@ -114,7 +114,7 @@ adv = [ 'name': 'crusader_male', 'title': '神启·圣骑士', 'open': True, - 'class': 'GF.priest_male.crusader_male' + 'class': 'GF.priest_male.crusader_male', # 'options': [{'id': 0, 'name': 'default', 'title': '奶', 'class': 'crusader_male'}, {'id': 1, 'name': 'default', 'title': '审判', 'class': 'crusader_male_carry'}], }, {'id': 1, 'name': 'infighter', 'title': '神启·蓝拳圣使', 'open': True, 'class': 'GF.priest_male.infighter'}, @@ -133,7 +133,7 @@ adv = [ 'name': 'crusader_female', 'title': '神启·圣骑士', 'open': True, - 'class': 'GF.priest_female.crusader_female' + 'class': 'GF.priest_female.crusader_female', # 'options': [{'id': 0, 'name': 'default', 'title': '奶', 'class': 'GF.priest_female.crusader_female', "open": True}, {'id': 1, 'name': 'default', 'title': '输出', 'class': 'crusader_female_carry'}], }, {'id': 1, 'name': 'inquistor', 'title': '神启·异端审判者', 'open': True, 'class': 'GF.priest_female.inquistor'}, @@ -171,10 +171,10 @@ adv = [ 'name': 'demonic_lancer', 'title': '魔枪士', 'children': [ - {'id': 0, 'name': 'vanguard', 'title': '千魂·征战者', 'open': True,'class': 'GF.demonic_lancer.vanguard'}, + {'id': 0, 'name': 'vanguard', 'title': '千魂·征战者', 'open': True, 'class': 'GF.demonic_lancer.vanguard'}, {'id': 1, 'name': 'skirmisher', 'title': '千魂·决战者', 'open': True, 'class': 'GF.demonic_lancer.skirmisher'}, {'id': 2, 'name': 'dragoon', 'title': '千魂·狩猎者', 'open': True, 'class': 'GF.demonic_lancer.dragoon'}, - {'id': 3, 'name': 'impaler', 'title': '千魂·暗枪士', 'open': True,'class': 'GF.demonic_lancer.impaler'}, + {'id': 3, 'name': 'impaler', 'title': '千魂·暗枪士', 'open': True, 'class': 'GF.demonic_lancer.impaler'}, {'id': 4, 'name': 'empty', 'title': ''}, ], }, @@ -184,7 +184,7 @@ adv = [ 'title': '枪剑士', 'children': [ {'id': 0, 'name': 'hitman', 'title': '苍暮·暗刃', 'open': True, 'class': 'GF.gunblader.hitman'}, - {'id': 1, 'name': 'agent', 'title': '苍暮·特工', 'open': True,'class': 'GF.gunblader.agent'}, + {'id': 1, 'name': 'agent', 'title': '苍暮·特工', 'open': True, 'class': 'GF.gunblader.agent'}, {'id': 2, 'name': 'trouble_shooter', 'title': '苍暮·战线佣兵', 'open': True, 'class': 'GF.gunblader.trouble_shooter'}, {'id': 3, 'name': 'specialist', 'title': '苍暮·源能专家', 'open': True, 'class': 'GF.gunblader.specialist'}, {'id': 4, 'name': 'empty', 'title': ''}, diff --git a/backend/core/equipment/version_0/avatar.py b/backend/core/equipment/version_0/avatar.py index 96cb6cad..64fa03b6 100644 --- a/backend/core/equipment/version_0/avatar.py +++ b/backend/core/equipment/version_0/avatar.py @@ -65,8 +65,8 @@ class 装扮: skill.lv += 1 -class 神器装扮头发(装扮): - 部位 = "头发" +class 神器装扮头部(装扮): + 部位 = "头部" 品质 = "神器" 套装 = "神器装扮" id = 1 @@ -123,8 +123,8 @@ class 神器装扮鞋(装扮): 选项集合 = ("力量", "体力", "移动速度") -class 稀有装扮头发(装扮): - 部位 = "头发" +class 稀有装扮头部(装扮): + 部位 = "头部" 品质 = "稀有" 套装 = "稀有装扮" 选项集合 = ("智力", "精神", "施放速度") @@ -179,8 +179,8 @@ class 稀有装扮鞋(装扮): 选项集合 = ("力量", "体力", "移动速度") -class 高级装扮头发(装扮): - 部位 = "头发" +class 高级装扮头部(装扮): + 部位 = "头部" 品质 = "高级" 套装 = "高级装扮" 选项集合 = ("智力", "精神", "施放速度") @@ -235,11 +235,11 @@ class 高级装扮鞋(装扮): 选项集合 = ("力量", "体力", "移动速度") -神器装扮集合 = (神器装扮头发, 神器装扮帽子, 神器装扮脸部, 神器装扮胸部, +神器装扮集合 = (神器装扮头部, 神器装扮帽子, 神器装扮脸部, 神器装扮胸部, 神器装扮上衣, 神器装扮腰带, 神器装扮下装, 神器装扮鞋) -稀有装扮集合 = (稀有装扮头发, 稀有装扮帽子, 稀有装扮脸部, 稀有装扮胸部, +稀有装扮集合 = (稀有装扮头部, 稀有装扮帽子, 稀有装扮脸部, 稀有装扮胸部, 稀有装扮上衣, 稀有装扮腰带, 稀有装扮下装, 稀有装扮鞋) -高级装扮集合 = (高级装扮头发, 高级装扮帽子, 高级装扮脸部, 高级装扮胸部, +高级装扮集合 = (高级装扮头部, 高级装扮帽子, 高级装扮脸部, 高级装扮胸部, 高级装扮上衣, 高级装扮腰带, 高级装扮下装, 高级装扮鞋) 装扮集合 = tuple(map(lambda x: x[1](x[0]), enumerate(神器装扮集合 + 稀有装扮集合 + 高级装扮集合))) diff --git a/backend/core/equipment/version_0/equ.py b/backend/core/equipment/version_0/equ.py index 6bf549e2..82b5b693 100644 --- a/backend/core/equipment/version_0/equ.py +++ b/backend/core/equipment/version_0/equ.py @@ -15655,6 +15655,12 @@ def equ_4021(char: CharacterProperty): char.SetSkillCD(1, 100, 0.05, []) pass +@register +def equ_4022(char: CharacterProperty): + """ + """ + equ_4020(char) + pass # endregion # region 耕耘 diff --git a/backend/core/open/helper.py b/backend/core/open/helper.py new file mode 100644 index 00000000..0f80342a --- /dev/null +++ b/backend/core/open/helper.py @@ -0,0 +1,172 @@ +from openapi.dnfhelper.public import get_main_user_info_by_id +from core.basic.equipment import get_equipment + +job_mapping = { + '极诣·剑魂': 'weapon_master', + '极诣·鬼泣': 'soul_bender', + '极诣·狂战士': 'berserker', + '极诣·阿修罗': 'asura', + '极诣·剑影': 'ghostblade', + '极诣·驭剑士': 'sword_master', + '极诣·暗殿骑士': 'dark_templar', + '极诣·契魔者': 'demon_slayer', + '极诣·流浪武士': 'vegabond', + '极诣·刃影': 'spectre', + '归元·气功师(男)': 'nenmaster_male', + '归元·散打(男)': 'striker_male', + '归元·街霸(男)': 'brawler_male', + '归元·柔道家(男)': 'grappler_male', + '归元·气功师(女)': 'nenmaster_female', + '归元·散打(女)': 'striker_female', + '归元·街霸(女)': 'brawler_female', + '归元·柔道家(女)': 'grappler_female', + '重霄·漫游枪手(男)': 'ranger_male', + '重霄·枪炮师(男)': 'launcher_male', + '重霄·机械师(男)': 'mechanic_male', + '重霄·弹药专家(男)': 'spitfire_male', + '重霄·合金战士': 'assault', + '重霄·漫游枪手(女)': 'ranger_female', + '重霄·枪炮师(女)': 'launcher_female', + '重霄·机械师(女)': 'mechanic_female', + '重霄·弹药专家(女)': 'spitfire_female', + '重霄·协战师': 'paramedic', + '知源·元素爆破师': 'elemental_bomber', + '知源·冰结师': 'glacial_master', + '知源·血法师': 'blood_mage', + '知源·逐风者': 'swift_master', + '知源·次元行者': 'dimension_walker', + '知源·元素师': 'elementalist', + '知源·召唤师': 'summoner', + '知源·战斗法师': 'battle_mage', + '知源·魔道学者': 'witch', + '知源·小魔女': 'enchantress', + '光启·光明骑士(男)': 'crusader_male', + '光启·蓝拳圣使': 'infighter', + '光启·驱魔师(男)': 'exorcist', + '光启·惩戒者': 'avenger', + '光启·光明骑士(女)': 'crusader_female', + '光启·正义审判者': 'inquistor', + '光启·驱魔师(女)': 'sorceress', + '光启·除恶者': 'mistress', + '隐夜·暗星': 'rogue', + '隐夜·黑夜术士': 'necro', + '隐夜·忍者': 'kunoichi', + '隐夜·影舞者': 'shadow_dancer', + '皓曦·精灵骑士': 'elven_knight', + '皓曦·混沌魔灵': 'chaos', + '皓曦·帕拉丁': 'paladin', + '皓曦·龙骑士': 'dragon_knight', + '千魂·征战者': 'vanguard', + '千魂·决战者': 'skirmisher', + '千魂·狩猎者': 'dragoon', + '千魂·暗枪士': 'impaler', + '苍暮·暗刃': 'hitman', + '苍暮·特工': 'agent', + '苍暮·战线佣兵': 'trouble_shooter', + '苍暮·源能专家': 'specialist', + '聆风·缪斯': 'muse', + '聆风·旅人': 'traveler', + '聆风·猎人': 'hunter', + '聆风·妖护使': 'vigilante', + '聆风·奇美拉': 'chimera', + '知源·缔造者': 'creator', + '极诣·黑暗武士': 'dark_knight', +} + + +async def get_user_info_by_id(user_id: str, alter: str): + # 通过OCR助手获取用户信息 + helper_info = await get_main_user_info_by_id(user_id) + if helper_info is None: + return None + else: + return trans_to_dcalc_set(helper_info) + pass + + +def trans_to_dcalc_set(detail): + job = job_mapping.get(detail.get('job', ''), '') + basic = get_equipment('0') + basicAvatars = basic.funs.get_dress_list([]) + equs = detail.get('equs', []) + equips = {} + avatar = {} + for equ in equs: + info = { + 'id': '0', + # 强化 + 'reinforce': equ.get('enhance', {}).get('reinforce', 0), + # 强化类型 + 'reinforceType': equ.get('enhance', {}).get('reinforceType', 0), + # 附魔 + 'enchant': 0, + # 徽章1 + 'emblem_0': 0, + # 徽章2 + 'emblem_1': 0, + # 贴膜 + 'fusion': 0, + # 锻造等级 + 'refine': equ.get('enhance', {}).get('refine', 0), + # 调试等级 + 'adaptation': 3, + # 精度 + 'precision': 100, + } + # 装备 + dcalcEqu = next((item for item in basic.equs if item.name == equ['name']), None) + # 贴膜 + if dcalcEqu: + info['id'] = dcalcEqu.id + dcalcEquFusion = next((item for item in basic.stones if item.name == equ.get('upgrade', '')), None) + if dcalcEquFusion: + info['fusion'] = dcalcEquFusion.id + info['enchant'] = getEnchatIdByName(equ.get('enchant', ''), equ.get('posName', ''), basic.enchants) + emblems = [getEmblemIdByName(i.get('detail', ''), i.get('categorize', ''), i.get('rarity', ''), basic.emblems) for i in equ.get('emblems', [])] + info['emblem_0'] = emblems[0] if len(emblems) > 0 else 0 + info['emblem_1'] = emblems[1] if len(emblems) > 1 else 0 + equips[equ['posName']] = info + avatars = detail.get('avatars', []) + for item in avatars: + info = { + 'id': '', + 'option': '', + 'enchant': '', + 'emblem_0': '', + 'emblem_1': '', + } + list = basicAvatars.get(item.get('posName', ''), []) + if len(list) > 0: + dcalcAvatar = next((i for i in list if i.get('rarity', '') == item.get('rarity', '')), None) + if dcalcAvatar: + info['id'] = dcalcAvatar.get('id', '0') + info['option'] = item.get('attr', '') + avatar[item['posName']] = info + else: + print(avatar) + return { + 'job': job, + 'equips': equips, + 'avatars': avatar, + } + # 处理装备 + # 处理时装 + pass + + +def getEnchatIdByName(name: str, position: str, items: list): + items = list(filter(lambda x: position in x.get('position', []), items)) + for item in items: + if '|'.join(sorted(item.get('detail', '').split('|'))) == '|'.join(sorted(name.split('|'))): + return item.get('id', 0) + return 0 + + +def getEmblemIdByName(detail: str, categorize: str, rarity: str, items: list): + print() + if categorize == '白金': + return detail + for item in items: + if item.get('detail', '') == detail and categorize in item.get('categorize', []) and item.get('rarity', '') == rarity: + return item.get('id', 0) + return 0 diff --git a/backend/dataFiles/dcalc_0.db b/backend/dataFiles/dcalc_0.db index 0d1ad0f84710ea22eb2ac9aba881d5b290eb9a8b..b044121d0eec6da1aa56da1aa730b2d393eb702c 100644 GIT binary patch delta 1335 zcmX|AZERCz6mHk9_jdR6wv$;mEp44HYcj1}ECr^EL}OwMDi{)C!cfdL>JJm;ha?1$ zsaI5#biz2y$QqW3CML_+aId9oj4?Vh2HU{l$EsG`ST`hexR~PH=G*hO{5$u3&hwn} zoOAB(-rC*0wc&e=TN_+Y6mB*6pW9il>6%g33Utk+Yi3<5)HRE)NxCNMn)O?)Xw|IA zTjSjmnJr?GS!Jm=`-Mk3;Gb;3KJNstk)rP7V5SH^YLzQ+a|~2WABP}1EI#-M~WnBzzA2{kUBBaj+di2fuju=PJfxgfm#3wUl5oUCmessxZo zK&jEf%}we$4#%WYydISt!U1m~PF)S2itahSI)9yH z#qulAo>iUx<`5RY$W_x<;BV5}v|sWuJ~^9^aZlzvp|qCE&}EU#(W}r#t~XBQhu;4Z zpDi8i$TY0Mbqk7&f2MK=d+v1(((*a@D>2(=z$K~-U*pZm8`&4Z1 z+4q!{tfj_QAwF$;m1;Ksh;7FR4mQ;%JuZw?{%{2E$5RZ&IBl4c)0zVeV?Otv>Z}(?qOk^2<(q%&pcM pL%7SO`muAlx`p*S)Th8)zbz8PXH4qdEVNu5Gk)Mzk9zHE{s->Q(is2% delta 1318 zcmYLIZA?>F7;b6lz2(05wkR@;q$N0F6C5iMk)b9=;|~{ObefnYqQ+c<{xI>ECX1Uc z+w~((14De(NQg*uiHQMq9BY9wP%wxBDo&+tokRK1g`#MR4A{BvX|X?=bI$WV&-=U| z_dwIq15Hay=2(kM(^n)GTXOas{$4k9tDz?ty3Nq-hMs8X4nvm=T{d**uX<9!h;6w3 z%%RGWBvv`1Of{J|Ja+}&n+JC0Dr8vc)Nl>#biyOmau#k5f`*Z6kcaLEkc12C;53DG z*TF0iHppO-#DX1iF8+3v$9u0sKKdP!jKu+{CD0S%;OZOjH?jS}IJ>b&&O!gwH0hBn zV{<)RB$7KS=dy|hNEMmF<8mGwYJ}_ zA#mch9ymei$9f=zG?@Dj@Ch|89wU$%l@NF=N?_}rK&BwwdOzhI>xeiw#$La||!KsEG?^3mlKNlwgs z4mGCg;H6WTyoIYqp2J(x+Ega_81I}aWIQioHKDYc%g|<#%!QY5nX2B{A8-22t-QCi zuw8?&4A)L5GX66VTi820IY`6j;4@;@3_-fc()lW8mW{mzub5QnNy#S&>3#85A0LL- zp1j%A@Y;GnLW^*4SkrPYnX zxAu>Cc@#i2j}nEtxipo|r6VrhxBkZJ{-2Kb1&+QvRf)O#b3C(2cvQd z?jD7&@RxCzYbvvQmc5RdU(*Vs&2^#eDP0*Q({X^yi%UN7x-oJcIQm)j~5&Rc6O uEoz!J(_;RPmDK{Wo5|WL0GDC`dgOmh^=NOcc7A%tBSsEpXcsbE%l-$!Qa4@z diff --git a/backend/openapi b/backend/openapi index 4649a77b..d374db49 160000 --- a/backend/openapi +++ b/backend/openapi @@ -1 +1 @@ -Subproject commit 4649a77b723124f00bb3f6b8dcc4ac0c812e2c74 +Subproject commit d374db49af48b9e1f6ff4ec1c8d9302f9576757d diff --git a/frontend/src/pages/Character/Forge/components/Avatars.vue b/frontend/src/pages/Character/Forge/components/Avatars.vue index 05716e21..453c5989 100644 --- a/frontend/src/pages/Character/Forge/components/Avatars.vue +++ b/frontend/src/pages/Character/Forge/components/Avatars.vue @@ -15,7 +15,7 @@ export default defineComponent({ const has_socket = computed(() => ['武器装扮', '光环', '皮肤'].includes(part.value as string)) const basicInfoStore = useInfoStore() const has_enchant = computed(() => { - return !['头发', '帽子', '脸部', '胸部', '上衣', '腰带', '下装', '鞋'].includes( + return !['头部', '帽子', '脸部', '胸部', '上衣', '腰带', '下装', '鞋'].includes( part.value as string, ) }) diff --git a/frontend/src/stores/info.ts b/frontend/src/stores/info.ts index bf83d35c..64527b7d 100644 --- a/frontend/src/stores/info.ts +++ b/frontend/src/stores/info.ts @@ -72,7 +72,7 @@ export const useInfoStore = defineStore('infoStore', () => { const avatarParts = [ '武器装扮', - '头发', + '头部', '帽子', '脸部', '光环',