mirror of
https://github.com/KimigaiiWuyi/GenshinUID.git
synced 2025-05-09 05:25:53 +08:00
✨ 新增我的背包
This commit is contained in:
parent
f079984fca
commit
4c3f74c4e7
19
GenshinUID/genshinuid_compute/__init__.py
Normal file
19
GenshinUID/genshinuid_compute/__init__.py
Normal file
@ -0,0 +1,19 @@
|
||||
from gsuid_core.sv import SV
|
||||
from gsuid_core.bot import Bot
|
||||
from gsuid_core.models import Event
|
||||
from gsuid_core.utils.error_reply import UID_HINT
|
||||
|
||||
from ..utils.convert import get_uid
|
||||
from .get_my_pack import draw_my_pack
|
||||
|
||||
sv_pack = SV('查询背包')
|
||||
|
||||
|
||||
@sv_pack.on_command(('我的背包'))
|
||||
async def my_bag(bot: Bot, ev: Event):
|
||||
uid, user_id = await get_uid(bot, ev, True)
|
||||
if not uid:
|
||||
return await bot.send(UID_HINT)
|
||||
|
||||
im = await draw_my_pack(uid, ev)
|
||||
await bot.send(im)
|
4922
GenshinUID/genshinuid_compute/aa.json
Normal file
4922
GenshinUID/genshinuid_compute/aa.json
Normal file
File diff suppressed because it is too large
Load Diff
82
GenshinUID/genshinuid_compute/get_my_pack.py
Normal file
82
GenshinUID/genshinuid_compute/get_my_pack.py
Normal file
@ -0,0 +1,82 @@
|
||||
from pathlib import Path
|
||||
from typing import Union
|
||||
|
||||
from PIL import Image, ImageDraw
|
||||
from gsuid_core.models import Event
|
||||
from gsuid_core.utils.cache import gs_cache
|
||||
from gsuid_core.utils.error_reply import get_error
|
||||
from gsuid_core.utils.image.convert import convert_img
|
||||
|
||||
from .utils import get_all_char_dict
|
||||
from ..utils.fonts.genshin_fonts import gs_font_20
|
||||
from ..utils.mys_api import mys_api, get_base_data
|
||||
from ..utils.resource.download_url import download
|
||||
from ..utils.resource.RESOURCE_PATH import ICON_PATH
|
||||
from ..utils.image.image_tools import (
|
||||
get_v4_bg,
|
||||
add_footer,
|
||||
get_avatar,
|
||||
get_v4_title,
|
||||
)
|
||||
|
||||
TEXT_PATH = Path(__file__).parent / 'texture2d'
|
||||
|
||||
|
||||
@gs_cache(1800)
|
||||
async def draw_my_pack(uid: str, ev: Event) -> Union[str, bytes]:
|
||||
raw = await get_all_char_dict()
|
||||
data = await mys_api.get_batch_compute_info(uid, raw)
|
||||
|
||||
if isinstance(data, int):
|
||||
return get_error(data)
|
||||
|
||||
raw_data = await get_base_data(uid)
|
||||
if isinstance(raw_data, (str, bytes)):
|
||||
return raw_data
|
||||
elif isinstance(raw_data, (bytearray, memoryview)):
|
||||
return bytes(raw_data)
|
||||
|
||||
char_pic = await get_avatar(ev, 377, False)
|
||||
title_img = get_v4_title(char_pic, uid, raw_data)
|
||||
# title_img = title_img.resize((int(1680 * 0.6), int(700 * 0.6)))
|
||||
|
||||
overall_consume = data['overall_consume']
|
||||
bag_len = len(overall_consume)
|
||||
|
||||
w = 1680
|
||||
n = 14
|
||||
up = 713
|
||||
h = (((bag_len - 1) // n) + 1) * 145 + up + 92
|
||||
ox, oy = 110, 145
|
||||
|
||||
img = get_v4_bg(w, h)
|
||||
|
||||
img.paste(title_img, (0, 0), title_img)
|
||||
|
||||
for index, item in enumerate(overall_consume):
|
||||
item_bg = Image.open(TEXT_PATH / 'one.png')
|
||||
item_name = f'UI_ItemIcon_{item["id"]}.png'
|
||||
item_path = ICON_PATH / item_name
|
||||
if not item_path.exists():
|
||||
await download(item['icon'], 8, item_name)
|
||||
item_img = Image.open(item_path)
|
||||
item_img = item_img.resize((80, 80)).convert('RGBA')
|
||||
item_bg.paste(item_img, (15, 20), item_img)
|
||||
item_draw = ImageDraw.Draw(item_bg)
|
||||
bag_num = item['num'] - item['lack_num']
|
||||
item_draw.text(
|
||||
(55, 125),
|
||||
f'{bag_num}',
|
||||
font=gs_font_20,
|
||||
fill='white',
|
||||
anchor='mm',
|
||||
)
|
||||
img.paste(
|
||||
item_bg,
|
||||
(65 + (index % n) * ox, up + (index // n) * oy),
|
||||
item_bg,
|
||||
)
|
||||
|
||||
img = add_footer(img)
|
||||
|
||||
return await convert_img(img)
|
BIN
GenshinUID/genshinuid_compute/texture2d/one.png
Normal file
BIN
GenshinUID/genshinuid_compute/texture2d/one.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 823 B |
157
GenshinUID/genshinuid_compute/utils.py
Normal file
157
GenshinUID/genshinuid_compute/utils.py
Normal file
@ -0,0 +1,157 @@
|
||||
from typing import Dict, List, Union
|
||||
|
||||
from gsuid_core.logger import logger
|
||||
|
||||
from ..utils.map.GS_MAP_PATH import (
|
||||
avatarId2Name,
|
||||
avatarName2Weapon,
|
||||
weaponId2Name_data,
|
||||
)
|
||||
from ..utils.map.name_covert import (
|
||||
name_to_element,
|
||||
avatar_id_to_name,
|
||||
weapon_id_to_name,
|
||||
avatar_id_to_skill_groupId,
|
||||
)
|
||||
|
||||
ELEMENT_MAP = {
|
||||
"Pyro": 1,
|
||||
"Anemo": 2,
|
||||
"Geo": 3,
|
||||
"Dendro": 4,
|
||||
"Electro": 5,
|
||||
"Hydro": 6,
|
||||
"Cryo": 7,
|
||||
}
|
||||
|
||||
|
||||
async def get_all_char_dict() -> List[Dict]:
|
||||
result = []
|
||||
weapon_list: Dict[str, List[str]] = {
|
||||
'单手剑': [],
|
||||
'双手剑': [],
|
||||
'弓': [],
|
||||
'法器': [],
|
||||
'长柄武器': [],
|
||||
}
|
||||
|
||||
for weapon_id in weaponId2Name_data:
|
||||
if int(weapon_id[2]) <= 3:
|
||||
continue
|
||||
|
||||
if weapon_id in ['11419', '11420', '11421', '11429', '15513']:
|
||||
continue
|
||||
|
||||
if weapon_id.startswith('11'):
|
||||
weapon_list['单手剑'].append(weapon_id)
|
||||
elif weapon_id.startswith('12'):
|
||||
weapon_list['双手剑'].append(weapon_id)
|
||||
elif weapon_id.startswith('13'):
|
||||
weapon_list['长柄武器'].append(weapon_id)
|
||||
elif weapon_id.startswith('14'):
|
||||
weapon_list['法器'].append(weapon_id)
|
||||
elif weapon_id.startswith('15'):
|
||||
weapon_list['弓'].append(weapon_id)
|
||||
|
||||
for char_id in avatarId2Name:
|
||||
if char_id in ['10000095']:
|
||||
continue
|
||||
|
||||
char_name = await avatar_id_to_name(char_id)
|
||||
if char_name not in avatarName2Weapon:
|
||||
continue
|
||||
char_weapon_type = avatarName2Weapon[char_name]
|
||||
if weapon_list[char_weapon_type]:
|
||||
weapon = weapon_list[char_weapon_type].pop()
|
||||
else:
|
||||
weapon = 0
|
||||
d = await char_id_to_compute_dict(
|
||||
char_id,
|
||||
weapon_id=weapon,
|
||||
)
|
||||
if d is not None:
|
||||
result.append(d)
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
with open(Path(__file__).parent / 'aa.json', 'w', encoding='utf-8') as f:
|
||||
json.dump(result, f, ensure_ascii=False, indent=4)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
async def char_id_to_compute_dict(
|
||||
char_id: Union[str, int],
|
||||
current_level: int = 1,
|
||||
target_level: int = 90,
|
||||
skill1_current_level: int = 1,
|
||||
skill1_target_level: int = 10,
|
||||
skill2_current_level: int = 1,
|
||||
skill2_target_level: int = 10,
|
||||
skill3_current_level: int = 1,
|
||||
skill3_target_level: int = 10,
|
||||
weapon_id: Union[str, int] = 0,
|
||||
weapon_current_level: int = 1,
|
||||
weapon_target_level: int = 90,
|
||||
):
|
||||
char_id = str(char_id)
|
||||
char_name = await avatar_id_to_name(char_id)
|
||||
element = await name_to_element(char_name)
|
||||
element_id = ELEMENT_MAP[element]
|
||||
|
||||
if char_id in ['10000005', '10000001', '10000007']:
|
||||
return None
|
||||
|
||||
skill_list = await avatar_id_to_skill_groupId(char_id)
|
||||
if not skill_list:
|
||||
logger.debug(f'[char_id_to_compute_dict] {char_id}')
|
||||
raise ValueError("[char_id_to_compute_dict] 未找到该角色技能")
|
||||
|
||||
skill_data = []
|
||||
skill_level = [
|
||||
[skill1_current_level, skill1_target_level],
|
||||
[skill2_current_level, skill2_target_level],
|
||||
[skill3_current_level, skill3_target_level],
|
||||
]
|
||||
|
||||
n = 0
|
||||
for skill_id in skill_list:
|
||||
if skill_id.endswith(('1', '2', '9')):
|
||||
skill_data.append(
|
||||
{
|
||||
"id": skill_id,
|
||||
"group_id": skill_id,
|
||||
"name": skill_list[skill_id],
|
||||
"max_level": 10,
|
||||
"levelRange": skill_level[n],
|
||||
"level_current": skill_level[n][0],
|
||||
"level_target": skill_level[n][1],
|
||||
}
|
||||
)
|
||||
n += 1
|
||||
|
||||
data = {
|
||||
"avatar_id": int(char_id),
|
||||
"avatar_level_current": current_level,
|
||||
"avatar_level_target": target_level,
|
||||
"element_attr_id": element_id,
|
||||
"level": 5,
|
||||
"name": char_name,
|
||||
"skill_list": skill_data,
|
||||
}
|
||||
|
||||
if weapon_id != 0:
|
||||
data['weapon'] = {
|
||||
"id": int(weapon_id),
|
||||
"name": await weapon_id_to_name(str(weapon_id)),
|
||||
"weapon_cat_id": 1,
|
||||
"weapon_level": 5,
|
||||
"max_level": 90,
|
||||
"is_recommend": False,
|
||||
"levelRange": [weapon_current_level, weapon_target_level],
|
||||
"level_current": weapon_current_level,
|
||||
"level_target": weapon_target_level,
|
||||
}
|
||||
|
||||
return data
|
@ -40,6 +40,8 @@ avatarId2Name_fileName = f'avatarId2Name_mapping_{version}.json'
|
||||
enName2Id_fileName = f'enName2AvatarID_mapping_{version}.json'
|
||||
avatarId2Star_fileName = f'avatarId2Star_mapping_{version}.json'
|
||||
avatarName2Weapon_fileName = f'avatarName2Weapon_mapping_{version}.json'
|
||||
avatarId2SkillList_fileName = f'avatarId2SkillList_mapping_{version}.json'
|
||||
weaponId2Name_fileName = f'weaponId2Name_mapping_{version}.json'
|
||||
|
||||
monster2entry_fileName = f'monster2entry_mapping_{version}.json'
|
||||
|
||||
@ -72,6 +74,149 @@ BETA_CHAR = {
|
||||
}
|
||||
|
||||
|
||||
async def weaponId2Name():
|
||||
result = {}
|
||||
print('正在执行weaponId2Name')
|
||||
with open(
|
||||
DATA_PATH / 'WeaponExcelConfigData.json',
|
||||
'r',
|
||||
encoding='UTF-8',
|
||||
) as f:
|
||||
weapon_data = json.load(f)
|
||||
|
||||
for weapon in weapon_data:
|
||||
if str(weapon['nameTextMapHash']) in raw_data:
|
||||
result[weapon['id']] = raw_data[str(weapon['nameTextMapHash'])]
|
||||
|
||||
with open(
|
||||
MAP_PATH / weaponId2Name_fileName,
|
||||
'w',
|
||||
encoding='UTF-8',
|
||||
) as f:
|
||||
json.dump(result, f, ensure_ascii=False, indent=4)
|
||||
|
||||
|
||||
async def avatarId2SkillGroupList():
|
||||
result = {}
|
||||
print('正在执行avatarId2SkillList')
|
||||
with open(
|
||||
MAP_PATH / f'enName2AvatarID_mapping_{version}.json',
|
||||
'r',
|
||||
encoding='UTF-8',
|
||||
) as f:
|
||||
en_name = json.load(f)
|
||||
|
||||
with open(
|
||||
DATA_PATH / 'AvatarSkillExcelConfigData.json',
|
||||
'r',
|
||||
encoding='UTF-8',
|
||||
) as f:
|
||||
skill_data = json.load(f)
|
||||
|
||||
for skill in skill_data:
|
||||
if 'proudSkillGroupId' in skill:
|
||||
if skill['abilityName']:
|
||||
_name = skill['skillIcon'].split('_')[2]
|
||||
count = skill['abilityName'].count('_')
|
||||
|
||||
if 'Diluc' in skill['abilityName']:
|
||||
name = 'Diluc'
|
||||
elif count <= 1:
|
||||
name = skill['abilityName'].split('_')[0]
|
||||
elif count >= 3:
|
||||
if skill['abilityName'].split('_')[1] == _name:
|
||||
name = skill['abilityName'].split('_')[1]
|
||||
else:
|
||||
continue
|
||||
else:
|
||||
name = skill['abilityName'].split('_')[1]
|
||||
|
||||
if (
|
||||
_name != name
|
||||
and skill['skillIcon'].count('_') > 2
|
||||
and 'Catalyst' not in skill['skillIcon']
|
||||
):
|
||||
print(_name)
|
||||
print(name)
|
||||
continue
|
||||
|
||||
else:
|
||||
name = skill['skillIcon'].split('_')[2]
|
||||
|
||||
if not skill['skillIcon'].startswith(
|
||||
('Skill_A', 'Skill_S', 'Skill_E')
|
||||
):
|
||||
continue
|
||||
|
||||
if name not in en_name:
|
||||
name = name.split(' ')[-1]
|
||||
for _en in en_name:
|
||||
en = _en.split(' ')[-1]
|
||||
if en == 'Jean':
|
||||
en = 'Qin'
|
||||
elif en == 'Baizhu':
|
||||
en = 'Baizhuer'
|
||||
elif en == 'Alhaitham':
|
||||
en = 'Alhatham'
|
||||
elif en == 'Jin':
|
||||
en = 'Yunjin'
|
||||
elif en == 'Miko':
|
||||
en = 'Yae'
|
||||
elif en == 'Heizou':
|
||||
en = 'Heizo'
|
||||
elif en == 'Amber':
|
||||
en = 'Ambor'
|
||||
elif en == 'Noelle':
|
||||
en = 'Noel'
|
||||
elif en == 'Yanfei':
|
||||
en = 'Feiyan'
|
||||
elif en == 'Shogun':
|
||||
en = 'Shougun'
|
||||
elif en == 'Lynette':
|
||||
en = 'Linette'
|
||||
elif en == 'Lyney':
|
||||
en = 'Liney'
|
||||
elif en == 'Tao':
|
||||
en = 'Hutao'
|
||||
elif en == 'Thoma':
|
||||
en = 'Tohma'
|
||||
elif en == 'Kirara':
|
||||
en = 'Momoka'
|
||||
elif en == 'Xianyun':
|
||||
en = 'Liuyun'
|
||||
if name == en:
|
||||
avatar_id = en_name[_en]
|
||||
break
|
||||
else:
|
||||
if not name.startswith('Player'):
|
||||
print(name)
|
||||
continue
|
||||
else:
|
||||
avatar_id = en_name[name]
|
||||
|
||||
if str(skill["nameTextMapHash"]) in raw_data:
|
||||
skill_name = raw_data[str(skill["nameTextMapHash"])]
|
||||
else:
|
||||
skill_name = ''
|
||||
|
||||
if avatar_id not in result:
|
||||
result[avatar_id] = {}
|
||||
|
||||
result[avatar_id][skill['proudSkillGroupId']] = skill_name
|
||||
|
||||
result['10000036'] = {
|
||||
"3631": "普通攻击·灭邪四式",
|
||||
"3632": "灵刃·重华叠霜",
|
||||
"3639": "灵刃·云开星落",
|
||||
}
|
||||
with open(
|
||||
MAP_PATH / f'avatarId2SkillList_mapping_{version}.json',
|
||||
'w',
|
||||
encoding='UTF-8',
|
||||
) as f:
|
||||
json.dump(result, f, indent=4, ensure_ascii=False)
|
||||
|
||||
|
||||
async def monster2map():
|
||||
print('正在执行monster2map')
|
||||
monster_list = await get_ambr_monster_list()
|
||||
@ -335,14 +480,14 @@ async def artifact2attrJson() -> None:
|
||||
|
||||
|
||||
async def main():
|
||||
await monster2map()
|
||||
await download_new_file()
|
||||
global raw_data
|
||||
try:
|
||||
with open(DATA_PATH / 'TextMapCHS.json', 'r', encoding='UTF-8') as f:
|
||||
raw_data = json.load(f)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
await monster2map()
|
||||
await download_new_file()
|
||||
await avatarId2NameJson()
|
||||
await avatarName2ElementJson()
|
||||
await weaponHash2NameJson()
|
||||
@ -350,6 +495,8 @@ async def main():
|
||||
await talentId2NameJson()
|
||||
await weaponHash2TypeJson()
|
||||
await artifact2attrJson()
|
||||
await weaponId2Name()
|
||||
await avatarId2SkillGroupList()
|
||||
|
||||
|
||||
asyncio.run(main())
|
||||
|
@ -99,7 +99,7 @@ def download_namecard_pic():
|
||||
elif en == 'Jin':
|
||||
en = 'Yunjin'
|
||||
elif en == 'Miko':
|
||||
en = 'Yae1'
|
||||
en = 'Yae'
|
||||
elif en == 'Heizou':
|
||||
en = 'Heizo'
|
||||
elif en == 'Amber':
|
||||
|
@ -62,8 +62,14 @@ def get_v4_title(avatar: Image.Image, uid: str, title_data: IndexData):
|
||||
return title
|
||||
|
||||
|
||||
def add_footer(img: Image.Image):
|
||||
def add_footer(img: Image.Image, w: int = 0):
|
||||
footer = Image.open(TEXT_PATH / 'footer.png')
|
||||
|
||||
if w != 0:
|
||||
footer = footer.resize(
|
||||
(w, int(footer.size[1] * w / footer.size[0])),
|
||||
)
|
||||
|
||||
x, y = (
|
||||
int((img.size[0] - footer.size[0]) / 2),
|
||||
img.size[1] - footer.size[1] - 20,
|
||||
|
@ -21,6 +21,8 @@ enName2Id_fileName = f'enName2AvatarID_mapping_{version}.json'
|
||||
icon2Name_fileName = f'icon2Name_mapping_{version}.json'
|
||||
avatarName2Weapon_fileName = f'avatarName2Weapon_mapping_{version}.json'
|
||||
monster2entry_fileName = f'monster2entry_mapping_{version}.json'
|
||||
avatarId2SkillList_fileName = f'avatarId2SkillList_mapping_{version}.json'
|
||||
weaponId2Name_fileName = f'weaponId2Name_mapping_{version}.json'
|
||||
EXMonster_fileName = 'ExtraMonster.json'
|
||||
|
||||
|
||||
@ -79,3 +81,11 @@ with open(MAP / EXMonster_fileName, 'r', encoding='utf8') as f:
|
||||
|
||||
with open(MAP / monster2entry_fileName, 'r', encoding='utf8') as f:
|
||||
monster2entry_data = msgjson.decode(f.read(), type=Dict[str, Dict])
|
||||
|
||||
with open(MAP / avatarId2SkillList_fileName, 'r', encoding='utf8') as f:
|
||||
avatarId2SkillList_data = msgjson.decode(
|
||||
f.read(), type=Dict[str, Dict[str, str]]
|
||||
)
|
||||
|
||||
with open(MAP / weaponId2Name_fileName, 'r', encoding='utf8') as f:
|
||||
weaponId2Name_data = msgjson.decode(f.read(), type=Dict[str, str])
|
||||
|
419
GenshinUID/utils/map/data/avatarId2SkillList_mapping_4.7.0.json
Normal file
419
GenshinUID/utils/map/data/avatarId2SkillList_mapping_4.7.0.json
Normal file
@ -0,0 +1,419 @@
|
||||
{
|
||||
"10000002": {
|
||||
"233": "神里流·霰步",
|
||||
"232": "神里流·冰华",
|
||||
"239": "神里流·霜灭",
|
||||
"231": "普通攻击·神里流·倾"
|
||||
},
|
||||
"10000021": {
|
||||
"2139": "箭雨",
|
||||
"2132": "爆弹玩偶",
|
||||
"2131": "普通攻击·神射手"
|
||||
},
|
||||
"10000003": {
|
||||
"331": "普通攻击·西风剑术",
|
||||
"332": "风压剑",
|
||||
"339": "蒲公英之风"
|
||||
},
|
||||
"10000006": {
|
||||
"431": "普通攻击·指尖雷暴",
|
||||
"432": "苍雷",
|
||||
"439": "蔷薇的雷光"
|
||||
},
|
||||
"10000014": {
|
||||
"1431": "普通攻击·水之浅唱",
|
||||
"1432": "演唱,开始♪",
|
||||
"1439": "闪耀奇迹♪"
|
||||
},
|
||||
"10000015": {
|
||||
"1531": "普通攻击·仪典剑术",
|
||||
"1532": "霜袭",
|
||||
"1539": "凛冽轮舞"
|
||||
},
|
||||
"10000016": {
|
||||
"1631": "普通攻击·淬炼之剑",
|
||||
"1632": "逆焰之刃",
|
||||
"1639": "黎明"
|
||||
},
|
||||
"10000020": {
|
||||
"2031": "普通攻击·钢脊",
|
||||
"2032": "利爪与苍雷",
|
||||
"2039": "雷牙"
|
||||
},
|
||||
"10000022": {
|
||||
"2231": "普通攻击·神代射术",
|
||||
"2232": "高天之歌",
|
||||
"2239": "风神之诗"
|
||||
},
|
||||
"10000023": {
|
||||
"2331": "普通攻击·白案功夫",
|
||||
"2332": "锅巴出击",
|
||||
"2339": "旋火轮"
|
||||
},
|
||||
"10000024": {
|
||||
"2431": "普通攻击·征涛",
|
||||
"2432": "捉浪",
|
||||
"2439": "斫雷"
|
||||
},
|
||||
"10000026": {
|
||||
"2631": "普通攻击·卷积微尘",
|
||||
"2632": "风轮两立",
|
||||
"2639": "靖妖傩舞"
|
||||
},
|
||||
"10000027": {
|
||||
"2731": "普通攻击·千金掷",
|
||||
"2732": "璇玑屏",
|
||||
"2739": "天权崩玉"
|
||||
},
|
||||
"10000029": {
|
||||
"2931": "普通攻击·砰砰",
|
||||
"2932": "蹦蹦炸弹",
|
||||
"2939": "轰轰火花"
|
||||
},
|
||||
"10000030": {
|
||||
"3031": "普通攻击·岩雨",
|
||||
"3032": "地心",
|
||||
"3039": "天星"
|
||||
},
|
||||
"10000031": {
|
||||
"3131": "普通攻击·罪灭之矢",
|
||||
"3132": "夜巡影翼",
|
||||
"3139": "至夜幻现"
|
||||
},
|
||||
"10000032": {
|
||||
"3231": "普通攻击·好运剑",
|
||||
"3232": "热情过载",
|
||||
"3239": "美妙旅程"
|
||||
},
|
||||
"10000033": {
|
||||
"3331": "普通攻击·断雨",
|
||||
"3332": "魔王武装·狂澜",
|
||||
"3339": "极恶技·尽灭闪"
|
||||
},
|
||||
"10000034": {
|
||||
"3431": "普通攻击·西风剑术·女仆",
|
||||
"3432": "护心铠",
|
||||
"3439": "大扫除"
|
||||
},
|
||||
"10000035": {
|
||||
"3531": "普通攻击·云来古剑法",
|
||||
"3532": "仙法·寒病鬼差",
|
||||
"3539": "仙法·救苦度厄"
|
||||
},
|
||||
"10000037": {
|
||||
"3731": "普通攻击·流天射术",
|
||||
"3732": "山泽麟迹",
|
||||
"3739": "降众天华"
|
||||
},
|
||||
"10000025": {
|
||||
"2531": "普通攻击·古华剑法",
|
||||
"2532": "古华剑·画雨笼山",
|
||||
"2539": "古华剑·裁雨留虹"
|
||||
},
|
||||
"10000038": {
|
||||
"3831": "普通攻击·西风剑术·白",
|
||||
"3832": "创生法·拟造阳华",
|
||||
"3839": "诞生式·大地之潮"
|
||||
},
|
||||
"10000039": {
|
||||
"3931": "普通攻击·猎人射术",
|
||||
"3932": "猫爪冻冻",
|
||||
"3939": "最烈特调"
|
||||
},
|
||||
"10000041": {
|
||||
"4131": "普通攻击·因果点破",
|
||||
"4132": "水中幻愿",
|
||||
"4133": "虚实流动",
|
||||
"4139": "星命定轨"
|
||||
},
|
||||
"10000042": {
|
||||
"4231": "普通攻击·云来剑法",
|
||||
"4232": "星斗归位",
|
||||
"4239": "天街巡游"
|
||||
},
|
||||
"10000043": {
|
||||
"4331": "普通攻击·简式风灵作成",
|
||||
"4332": "风灵作成·陆叁零捌",
|
||||
"4339": "禁·风灵作成·柒伍同构贰型"
|
||||
},
|
||||
"10000044": {
|
||||
"4431": "普通攻击·炎舞",
|
||||
"4432": "热情拂扫",
|
||||
"4439": "叛逆刮弦"
|
||||
},
|
||||
"10000045": {
|
||||
"4531": "普通攻击·教会枪术",
|
||||
"4532": "噬罪的告解",
|
||||
"4539": "终命的圣礼"
|
||||
},
|
||||
"10000046": {
|
||||
"4631": "普通攻击·往生秘传枪法",
|
||||
"4632": "蝶引来生",
|
||||
"4639": "安神秘法"
|
||||
},
|
||||
"10000047": {
|
||||
"4731": "普通攻击·我流剑术",
|
||||
"4732": "千早振",
|
||||
"4739": "万叶之一刀"
|
||||
},
|
||||
"10000048": {
|
||||
"4831": "普通攻击·火漆制印",
|
||||
"4832": "丹书立约",
|
||||
"4839": "凭此结契"
|
||||
},
|
||||
"10000049": {
|
||||
"4931": "普通攻击·烟火打扬",
|
||||
"4932": "焰硝庭火舞",
|
||||
"4939": "琉金云间草"
|
||||
},
|
||||
"10000050": {
|
||||
"5031": "普通攻击·迅破枪势",
|
||||
"5032": "烈烧佑命之侍护",
|
||||
"5039": "真红炽火之大铠"
|
||||
},
|
||||
"10000051": {
|
||||
"5131": "普通攻击·西风剑术·宗室",
|
||||
"5132": "冰潮的涡旋",
|
||||
"5139": "凝浪之光剑"
|
||||
},
|
||||
"10000052": {
|
||||
"5231": "普通攻击·源流",
|
||||
"5232": "神变·恶曜开眼",
|
||||
"5239": "奥义·梦想真说"
|
||||
},
|
||||
"10000053": {
|
||||
"5331": "普通攻击·忍刀·终末番",
|
||||
"5332": "呜呼流·风隐急进",
|
||||
"5339": "呜呼流·影貉缭乱"
|
||||
},
|
||||
"10000054": {
|
||||
"5431": "普通攻击·水有常形",
|
||||
"5432": "海月之誓",
|
||||
"5439": "海人化羽"
|
||||
},
|
||||
"10000055": {
|
||||
"5531": "普通攻击·呲牙裂扇箭",
|
||||
"5532": "犬坂吠吠方圆阵",
|
||||
"5539": "兽牙逐突形胜战法"
|
||||
},
|
||||
"10000056": {
|
||||
"5631": "普通攻击·天狗传弓术",
|
||||
"5632": "鸦羽天狗霆雷召咒",
|
||||
"5639": "煌煌千道镇式"
|
||||
},
|
||||
"10000057": {
|
||||
"5731": "普通攻击· 喧哗屋传说",
|
||||
"5732": "魔杀绝技·赤牛发破!",
|
||||
"5739": "最恶鬼王·一斗轰临!!"
|
||||
},
|
||||
"10000058": {
|
||||
"5831": "普通攻击·狐灵食罪式",
|
||||
"5832": "野干役咒·杀生樱",
|
||||
"5839": "大密法·天狐显真"
|
||||
},
|
||||
"10000059": {
|
||||
"5931": "普通攻击·不动流格斗术",
|
||||
"5932": "勠心拳",
|
||||
"5939": "聚风蹴"
|
||||
},
|
||||
"10000060": {
|
||||
"6031": "普通攻击·潜形隐曜弓",
|
||||
"6032": "萦络纵命索",
|
||||
"6039": "渊图玲珑骰"
|
||||
},
|
||||
"10000061": {
|
||||
"6131": "普通攻击·箱纸切削术",
|
||||
"6132": "呜喵町飞足",
|
||||
"6139": "秘法·惊喜特派"
|
||||
},
|
||||
"10000062": {
|
||||
"6231": "普通攻击·快速射击",
|
||||
"6232": "冰尘雪野",
|
||||
"6239": "曙光预言"
|
||||
},
|
||||
"10000063": {
|
||||
"6331": "普通攻击·踏辰摄斗",
|
||||
"6332": "仰灵威召将役咒",
|
||||
"6339": "神女遣灵真诀"
|
||||
},
|
||||
"10000064": {
|
||||
"6431": "普通攻击·拂云出手",
|
||||
"6432": "旋云开相",
|
||||
"6439": "破嶂见旌仪"
|
||||
},
|
||||
"10000065": {
|
||||
"6531": "普通攻击·忍流飞刃斩",
|
||||
"6532": "越祓雷草之轮",
|
||||
"6539": "御咏鸣神刈山祭"
|
||||
},
|
||||
"10000066": {
|
||||
"6631": "普通攻击·神里流·转",
|
||||
"6632": "神里流·镜花",
|
||||
"6639": "神里流·水囿"
|
||||
},
|
||||
"10000067": {
|
||||
"6731": "普通攻击·祈颂射艺",
|
||||
"6732": "拂花偈叶",
|
||||
"6739": "猫猫秘宝"
|
||||
},
|
||||
"10000068": {
|
||||
"6831": "普通攻击·妙显剑舞·改",
|
||||
"6832": "镇灵之灯·烦恼解决炮",
|
||||
"6839": "卡萨扎莱宫的无微不至"
|
||||
},
|
||||
"10000069": {
|
||||
"6931": "普通攻击·藏蕴破障",
|
||||
"6932": "识果种雷",
|
||||
"6939": "造生缠藤箭"
|
||||
},
|
||||
"10000070": {
|
||||
"7031": "普通攻击·弦月舞步",
|
||||
"7032": "七域舞步",
|
||||
"7039": "浮莲舞步·远梦聆泉"
|
||||
},
|
||||
"10000071": {
|
||||
"7131": "普通攻击·七圣枪术",
|
||||
"7132": "秘仪·律渊渡魂",
|
||||
"7139": "圣仪·煟煌随狼行"
|
||||
},
|
||||
"10000072": {
|
||||
"7231": "普通攻击·流耀枪术·守势",
|
||||
"7232": "圣仪·苍鹭庇卫",
|
||||
"7239": "圣仪·灰鸰衒潮"
|
||||
},
|
||||
"10000073": {
|
||||
"7331": "普通攻击·行相",
|
||||
"7332": "所闻遍计",
|
||||
"7339": "心景幻成"
|
||||
},
|
||||
"10000074": {
|
||||
"7431": "普通攻击·熠辉轨度剑",
|
||||
"7432": "垂裳端凝之夜",
|
||||
"7439": "星流摇床之梦"
|
||||
},
|
||||
"10000075": {
|
||||
"7531": "普通攻击·行幡鸣弦",
|
||||
"7532": "羽画·风姿华歌",
|
||||
"7539": "狂言·式乐五番"
|
||||
},
|
||||
"10000076": {
|
||||
"7631": "普通攻击·迴身箭术",
|
||||
"7632": "非想风天",
|
||||
"7639": "抟风秘道"
|
||||
},
|
||||
"10000077": {
|
||||
"7731": "普通攻击·颠扑连环枪",
|
||||
"7732": "云台团团降芦菔",
|
||||
"7739": "玉颗珊珊月中落"
|
||||
},
|
||||
"10000078": {
|
||||
"7831": "普通攻击·溯因反绎法",
|
||||
"7832": "共相·理式摹写",
|
||||
"7839": "殊境·显象缚结"
|
||||
},
|
||||
"10000079": {
|
||||
"7931": "普通攻击·拂金剑斗术",
|
||||
"7932": "熔铁流狱",
|
||||
"7939": "炎啸狮子咬"
|
||||
},
|
||||
"10000080": {
|
||||
"8031": "普通攻击·西风枪术·镝传",
|
||||
"8032": "星霜的流旋",
|
||||
"8039": "苍翎的颂愿"
|
||||
},
|
||||
"10000081": {
|
||||
"8131": "普通攻击·旋规设矩",
|
||||
"8132": "画则巧施",
|
||||
"8139": "繁绘隅穹"
|
||||
},
|
||||
"10000082": {
|
||||
"8231": "普通攻击·金匮针解",
|
||||
"8232": "太素诊要",
|
||||
"8239": "愈气全形论"
|
||||
},
|
||||
"10000083": {
|
||||
"8331": "普通攻击·迅捷礼刺剑",
|
||||
"8332": "谜影障身法",
|
||||
"8339": "魔术·运变惊奇"
|
||||
},
|
||||
"10000084": {
|
||||
"8431": "普通攻击·迫牌易位式",
|
||||
"8432": "眩惑光戏法",
|
||||
"8439": "大魔术·灵迹巡游"
|
||||
},
|
||||
"10000085": {
|
||||
"8531": "普通攻击·洑流剑",
|
||||
"8532": "浮冰增压",
|
||||
"8539": "猎影潜袭"
|
||||
},
|
||||
"10000086": {
|
||||
"8631": "普通攻击·迅烈倾霜拳",
|
||||
"8632": "冰牙突驰",
|
||||
"8639": "黑金狼噬"
|
||||
},
|
||||
"10000087": {
|
||||
"8731": "普通攻击·如水从平",
|
||||
"8732": "泪水啊,我必偿还",
|
||||
"8739": "潮水啊,我已归来"
|
||||
},
|
||||
"10000088": {
|
||||
"8831": "普通攻击·冷色摄影律",
|
||||
"8832": "取景·冰点构图法",
|
||||
"8839": "定格·全方位确证"
|
||||
},
|
||||
"10000089": {
|
||||
"8931": "普通攻击·独舞之邀",
|
||||
"8932": "孤心沙龙",
|
||||
"8939": "万众狂欢"
|
||||
},
|
||||
"10000090": {
|
||||
"9031": "普通攻击·线列枪刺·改",
|
||||
"9032": "近迫式急促拦射",
|
||||
"9039": "圆阵掷弹爆轰术"
|
||||
},
|
||||
"10000091": {
|
||||
"9131": "普通攻击·直率的辞绝",
|
||||
"9132": "典仪式晶火",
|
||||
"9139": "如霰澄天的鸣礼"
|
||||
},
|
||||
"10000092": {
|
||||
"9231": "普通攻击·刃爪悬星",
|
||||
"9232": "瑞兽登高楼",
|
||||
"9239": "璨焰金猊舞"
|
||||
},
|
||||
"10000093": {
|
||||
"9331": "普通攻击·清风散花词",
|
||||
"9332": "朝起鹤云",
|
||||
"9339": "暮集竹星"
|
||||
},
|
||||
"10000094": {
|
||||
"9431": "普通攻击·心织刀流",
|
||||
"9432": "羽袖一触",
|
||||
"9439": "二刀之形·比翼"
|
||||
},
|
||||
"10000095": {
|
||||
"9531": "普通攻击·靶向治疗",
|
||||
"9532": "弹跳水疗法",
|
||||
"9539": "过饱和心意注射"
|
||||
},
|
||||
"10000096": {
|
||||
"9631": "普通攻击·斩首之邀",
|
||||
"9632": "万相化灰",
|
||||
"9639": "厄月将升"
|
||||
},
|
||||
"10000097": {
|
||||
"9731": "普通攻击·王家苇箭术",
|
||||
"9732": "古仪·鸣砂掣雷",
|
||||
"9739": "秘仪·瞑光贯影"
|
||||
},
|
||||
"10000098": {
|
||||
"9831": "普通攻击·逐影之誓",
|
||||
"9832": "狩夜之巡",
|
||||
"9839": "残光将终"
|
||||
},
|
||||
"10000036": {
|
||||
"3631": "普通攻击·灭邪四式",
|
||||
"3632": "灵刃·重华叠霜",
|
||||
"3639": "灵刃·云开星落"
|
||||
}
|
||||
}
|
202
GenshinUID/utils/map/data/weaponId2Name_mapping_4.7.0.json
Normal file
202
GenshinUID/utils/map/data/weaponId2Name_mapping_4.7.0.json
Normal file
@ -0,0 +1,202 @@
|
||||
{
|
||||
"11101": "无锋剑",
|
||||
"11201": "银剑",
|
||||
"11301": "冷刃",
|
||||
"11302": "黎明神剑",
|
||||
"11303": "旅行剑",
|
||||
"11304": "暗铁剑",
|
||||
"11305": "吃虎鱼刀",
|
||||
"11306": "飞天御剑",
|
||||
"11401": "西风剑",
|
||||
"11402": "笛剑",
|
||||
"11403": "祭礼剑",
|
||||
"11404": "宗室长剑",
|
||||
"11405": "匣里龙吟",
|
||||
"11406": "试作斩岩",
|
||||
"11407": "铁蜂刺",
|
||||
"11408": "黑岩长剑",
|
||||
"11409": "黑剑",
|
||||
"11410": "暗巷闪光",
|
||||
"11412": "降临之剑",
|
||||
"11413": "腐殖之剑",
|
||||
"11414": "天目影打刀",
|
||||
"11415": "辰砂之纺锤",
|
||||
"11416": "笼钓瓶一心",
|
||||
"11417": "原木刀",
|
||||
"11418": "西福斯的月光",
|
||||
"11419": "「一心传」名刀",
|
||||
"11420": "「一心传」名刀",
|
||||
"11421": "「一心传」名刀",
|
||||
"11422": "东花坊时雨",
|
||||
"11424": "狼牙",
|
||||
"11425": "海渊终曲",
|
||||
"11426": "灰河渡手",
|
||||
"11427": "船坞长剑",
|
||||
"11428": "水仙十字之剑",
|
||||
"11429": "水仙十字之剑",
|
||||
"11501": "风鹰剑",
|
||||
"11502": "天空之刃",
|
||||
"11503": "苍古自由之誓",
|
||||
"11504": "斫峰之刃",
|
||||
"11505": "磐岩结绿",
|
||||
"11509": "雾切之回光",
|
||||
"11510": "波乱月白经津",
|
||||
"11511": "圣显之钥",
|
||||
"11512": "裁叶萃光",
|
||||
"11513": "静水流涌之辉",
|
||||
"11514": "有乐御簾切",
|
||||
"11515": "赦罪",
|
||||
"12101": "训练大剑",
|
||||
"12201": "佣兵重剑",
|
||||
"12301": "铁影阔剑",
|
||||
"12302": "沐浴龙血的剑",
|
||||
"12303": "白铁大剑",
|
||||
"12304": "石英大剑",
|
||||
"12305": "以理服人",
|
||||
"12306": "飞天大御剑",
|
||||
"12401": "西风大剑",
|
||||
"12402": "钟剑",
|
||||
"12403": "祭礼大剑",
|
||||
"12404": "宗室大剑",
|
||||
"12405": "雨裁",
|
||||
"12406": "试作古华",
|
||||
"12407": "白影剑",
|
||||
"12408": "黑岩斩刀",
|
||||
"12409": "螭骨剑",
|
||||
"12410": "千岩古剑",
|
||||
"12411": "雪葬的星银",
|
||||
"12412": "衔珠海皇",
|
||||
"12414": "桂木斩长正",
|
||||
"12415": "玛海菈的水色",
|
||||
"12416": "恶王丸",
|
||||
"12417": "森林王器",
|
||||
"12418": "饰铁之花",
|
||||
"12424": "聊聊棒",
|
||||
"12425": "浪影阔剑",
|
||||
"12426": "「究极霸王超级魔剑」",
|
||||
"12427": "便携动力锯",
|
||||
"12501": "天空之傲",
|
||||
"12502": "狼的末路",
|
||||
"12503": "松籁响起之时",
|
||||
"12504": "无工之剑",
|
||||
"12510": "赤角石溃杵",
|
||||
"12511": "苇海信标",
|
||||
"12512": "裁断",
|
||||
"13101": "新手长枪",
|
||||
"13201": "铁尖枪",
|
||||
"13301": "白缨枪",
|
||||
"13302": "钺矛",
|
||||
"13303": "黑缨枪",
|
||||
"13304": "「旗杆」",
|
||||
"13401": "匣里灭辰",
|
||||
"13402": "试作星镰",
|
||||
"13403": "流月针",
|
||||
"13404": "黑岩刺枪",
|
||||
"13405": "决斗之枪",
|
||||
"13406": "千岩长枪",
|
||||
"13407": "西风长枪",
|
||||
"13408": "宗室猎枪",
|
||||
"13409": "龙脊长枪",
|
||||
"13414": "喜多院十文字",
|
||||
"13415": "「渔获」",
|
||||
"13416": "断浪长鳍",
|
||||
"13417": "贯月矢",
|
||||
"13419": "风信之锋",
|
||||
"13424": "峡湾长歌",
|
||||
"13425": "公义的酬报",
|
||||
"13426": "沙中伟贤的对答",
|
||||
"13427": "勘探钻机",
|
||||
"13501": "护摩之杖",
|
||||
"13502": "天空之脊",
|
||||
"13504": "贯虹之槊",
|
||||
"13505": "和璞鸢",
|
||||
"13507": "息灾",
|
||||
"13509": "薙草之稻光",
|
||||
"13511": "赤沙之杖",
|
||||
"13512": "赤月之形",
|
||||
"14101": "学徒笔记",
|
||||
"14201": "口袋魔导书",
|
||||
"14301": "魔导绪论",
|
||||
"14302": "讨龙英杰谭",
|
||||
"14303": "异世界行记",
|
||||
"14304": "翡玉法球",
|
||||
"14305": "甲级宝珏",
|
||||
"14306": "琥珀玥",
|
||||
"14401": "西风秘典",
|
||||
"14402": "流浪乐章",
|
||||
"14403": "祭礼残章",
|
||||
"14404": "宗室秘法录",
|
||||
"14405": "匣里日月",
|
||||
"14406": "试作金珀",
|
||||
"14407": "万国诸海图谱",
|
||||
"14408": "黑岩绯玉",
|
||||
"14409": "昭心",
|
||||
"14410": "暗巷的酒与诗",
|
||||
"14412": "忍冬之果",
|
||||
"14413": "嘟嘟可故事集",
|
||||
"14414": "白辰之环",
|
||||
"14415": "证誓之明瞳",
|
||||
"14416": "流浪的晚星",
|
||||
"14417": "盈满之实",
|
||||
"14424": "遗祀玉珑",
|
||||
"14425": "纯水流华",
|
||||
"14426": "无垠蔚蓝之歌",
|
||||
"14501": "天空之卷",
|
||||
"14502": "四风原典",
|
||||
"14504": "尘世之锁",
|
||||
"14505": "碧落之珑",
|
||||
"14506": "不灭月华",
|
||||
"14509": "神乐之真意",
|
||||
"14511": "千夜浮梦",
|
||||
"14512": "图莱杜拉的回忆",
|
||||
"14513": "金流监督",
|
||||
"14514": "万世流涌大典",
|
||||
"14515": "鹤鸣余音",
|
||||
"15101": "猎弓",
|
||||
"15201": "历练的猎弓",
|
||||
"15301": "鸦羽弓",
|
||||
"15302": "神射手之誓",
|
||||
"15303": "反曲弓",
|
||||
"15304": "弹弓",
|
||||
"15305": "信使",
|
||||
"15306": "黑檀弓",
|
||||
"15401": "西风猎弓",
|
||||
"15402": "绝弦",
|
||||
"15403": "祭礼弓",
|
||||
"15404": "宗室长弓",
|
||||
"15405": "弓藏",
|
||||
"15406": "试作澹月",
|
||||
"15407": "钢轮弓",
|
||||
"15408": "黑岩战弓",
|
||||
"15409": "苍翠猎弓",
|
||||
"15410": "暗巷猎手",
|
||||
"15411": "落霞",
|
||||
"15412": "幽夜华尔兹",
|
||||
"15413": "风花之颂",
|
||||
"15414": "破魔之弓",
|
||||
"15415": "掠食者",
|
||||
"15416": "曚云之月",
|
||||
"15417": "王下近侍",
|
||||
"15418": "竭泽",
|
||||
"15419": "鹮穿之喙",
|
||||
"15424": "烈阳之嗣",
|
||||
"15425": "静谧之曲",
|
||||
"15426": "筑云",
|
||||
"15427": "测距规",
|
||||
"15501": "天空之翼",
|
||||
"15502": "阿莫斯之弓",
|
||||
"15503": "终末嗟叹之诗",
|
||||
"15507": "冬极白星",
|
||||
"15508": "若水",
|
||||
"15509": "飞雷之弦振",
|
||||
"15511": "猎人之径",
|
||||
"15512": "最初的大魔术",
|
||||
"15513": "白雨心弦",
|
||||
"20001": "(test)竿测试",
|
||||
"10002": "(test)穿模测试",
|
||||
"10003": "(test)穿模测试",
|
||||
"10004": "(test)穿模测试",
|
||||
"10005": "(test)穿模测试",
|
||||
"10006": "(test)穿模测试",
|
||||
"10008": "(test)穿模测试"
|
||||
}
|
@ -1,11 +1,47 @@
|
||||
from typing import Dict, Optional
|
||||
|
||||
from .GS_MAP_PATH import (
|
||||
alias_data,
|
||||
avatarId2Name,
|
||||
avatarId2Star_data,
|
||||
avatarName2Element,
|
||||
weaponId2Name_data,
|
||||
avatarId2SkillList_data,
|
||||
enName_to_avatarId_data,
|
||||
)
|
||||
|
||||
|
||||
async def weapon_id_to_name(weapon_id: str) -> str:
|
||||
if weapon_id in weaponId2Name_data:
|
||||
return weaponId2Name_data[weapon_id]
|
||||
else:
|
||||
return '未知'
|
||||
|
||||
|
||||
async def name_to_weapon_id(weapon_name: str) -> str:
|
||||
for _id in weaponId2Name_data:
|
||||
if weapon_name == weaponId2Name_data[_id]:
|
||||
return _id
|
||||
else:
|
||||
return '11509'
|
||||
|
||||
|
||||
async def avatar_id_to_skill_groupId(
|
||||
avatar_id: str,
|
||||
) -> Optional[Dict[str, str]]:
|
||||
if avatar_id in avatarId2SkillList_data:
|
||||
return avatarId2SkillList_data[avatar_id]
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
async def name_to_element(name: str) -> str:
|
||||
if name in avatarName2Element:
|
||||
return avatarName2Element[name]
|
||||
else:
|
||||
return 'Cryo'
|
||||
|
||||
|
||||
async def avatar_id_to_name(avatar_id: str) -> str:
|
||||
char_name = avatarId2Name[avatar_id]
|
||||
return char_name
|
||||
|
@ -83,6 +83,7 @@ async def download_file(
|
||||
name: str,
|
||||
sess: Optional[ClientSession] = None,
|
||||
) -> Optional[Tuple[str, int, str]]:
|
||||
logger.info(f"开始下载: [{name}] - {url}")
|
||||
if sess is None:
|
||||
sess = ClientSession()
|
||||
try:
|
||||
|
Loading…
x
Reference in New Issue
Block a user