Skip to content
This repository has been archived by the owner on Sep 18, 2024. It is now read-only.

Commit

Permalink
<jx3>[feat]add yinlongjue dps calculator;[feat]fix wufang calculator
Browse files Browse the repository at this point in the history
  • Loading branch information
HornCopper committed Sep 7, 2024
1 parent 63af4f6 commit e54e71b
Show file tree
Hide file tree
Showing 4 changed files with 338 additions and 4 deletions.
27 changes: 25 additions & 2 deletions src/plugins/jx3/calculator/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@

from .universe import (
dj_calculator, # 毒经
wf_calculator # 无方
wf_calculator, # 无方
ylj_calculator, # 隐龙诀
)

from .wf import *
Expand Down Expand Up @@ -57,4 +58,26 @@ async def _(event: GroupMessageEvent, args: Message = CommandArg()):
await calc_wf.finish(data[0])
elif isinstance(data, str):
data = get_content_local(data)
await calc_wf.finish(ms.image(data))
await calc_wf.finish(ms.image(data))

calc_ylj = on_command("jx3_calculator_lyj", aliases={"凌雪计算器"}, priority=5) # 目前先对无方的计算器进行响应,后续尽可能多地支持

@calc_ylj.handle()
async def _(event: GroupMessageEvent, args: Message = CommandArg()):
if args.extract_plain_text() == "":
return
arg = args.extract_plain_text().split(" ")
if len(arg) not in [1, 2]:
await calc_ylj.finish("唔……参数不正确哦,请检查后重试~")
if len(arg) == 1:
server = None
id = arg[0]
elif len(arg) == 2:
server = arg[0]
id = arg[1]
data = await ylj_calculator(server, id, str(event.group_id))
if isinstance(data, list):
await calc_ylj.finish(data[0])
elif isinstance(data, str):
data = get_content_local(data)
await calc_ylj.finish(ms.image(data))
3 changes: 2 additions & 1 deletion src/plugins/jx3/calculator/universe.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
from .dj import generate_calculator_img_dujing as dj_calculator
from .wf import generate_calculator_img_wufang as wf_calculator
from .wf import generate_calculator_img_wufang as wf_calculator
from .ylj import generate_calculator_img_yinlongjue as ylj_calculator
2 changes: 1 addition & 1 deletion src/plugins/jx3/calculator/wf.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ async def generate_calculator_img_wufang(server: Optional[str], name: str, group
role_data = await get_player_local_data(role_name=name, server_name=server)
if role_data.format_jx3api()["code"] != 200:
return [PROMPT.PlayerNotExist]
data = await get_calculated_data("唯我独尊", "生菜卷烤肉", group_id, "无方")
data = await get_calculated_data(server, name, group_id, "无方")
if not data:
return ["唔……无法计算玩家数据!请检查装备、属性、职业!"]
stake_data = data["data"]["木桩计算结果"]
Expand Down
310 changes: 310 additions & 0 deletions src/plugins/jx3/calculator/ylj.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,310 @@
# 隐龙诀

from typing import Tuple, Literal, Optional, List, Union
from jinja2 import Template
from pathlib import Path

from src.constant.jx3 import color_list

from src.tools.basic.server import Zone_mapping, server_mapping
from src.tools.utils.request import get_api, post_url
from src.tools.utils.path import ASSETS, CACHE, VIEWS
from src.tools.utils.file import read, write
from src.tools.generate import generate, get_uuid
from src.tools.basic.prompts import PROMPT

from src.plugins.jx3.detail.detail import get_tuilan_data
from src.plugins.jx3.bind.role import get_player_local_data
from src.plugins.jx3.attributes.api import get_personal_kf

import json

msgbox_yinlongjue = """
<div class="element">
<div class="cell-title"><span>理论DPS</span></div>
<div class="cell">{{ dps }}</div>
</div>"""

template_calculator_yinlongjue = """
<tr>
<td class="short-column">{{ skill }}</td>
<td class="short-column">
<div class="progress-bar" style="margin: 0 auto;">
<div class="progress" style="width: {{ display }};"></div>
<span class="progress-text">{{ percent }}</span>
</div>
</td>
<td class="short-column">{{ count }}</td>
<td class="short-column">{{ value }}</td>
</tr>"""

def generate_params(
loop_name: str,
loop_skill: List[str],
attrs: dict,
input_enchant: List[bool],
set_list: List[Optional[str]],
special_equip: List[Optional[str]]
) -> dict:
enchant: List[Union[int, str]] = [12206, 12205, 12202, 12204, 12203]
for num in range(5):
if not input_enchant[num]:
enchant[num] = ""
params = {
"playerReqDto":
{
"attributeReqDto": attrs,
"extraPointList": loop_skill,
"recipeList":
[
4996,
4997,
4985,
4986,
4987,
4988,
5004,
5005,
5006,
5001,
5002,
5065,
5069,
5070,
5071,
5010,
5011,
5019,
5050,
5051
],
"setList": set_list,
"equipmentList": special_equip,
"enchant2List": enchant,
"position": "",
"pzEquipmentReqDtoList": [],
"stone": None,
"isWuJie": False
},
"enemyReqDto":
{
"sectName": "muZhuang124",
"deBuffReqDtoList":
[
{
"code": "chengLongJian",
"enable": False,
"num": 1,
"coverage": 0.33
},
{
"code": "longYin",
"enable": False,
"num": 1,
"coverage": 1
},
{
"code": "qiuSu",
"enable": False,
"num": 1,
"coverage": 1
},
{
"code": "xuRuo",
"enable": False,
"num": 1,
"coverage": 1
}
]
},
"loopReqDto":
{
"computeStrategy": "commonComputeStrategyImpl",
"loopCode": loop_name
}
}
return params

async def get_loop(loop_name: Literal["橙武遗恨", "猴王遗恨", "遗恨保百节", "猴王特效", "猴王"] = "遗恨保百节") -> Tuple[Optional[str], Optional[List[str]]]:
kw = {
"橙武遗恨": "lxgCWYiHenLoop",
"猴王遗恨": "lxgQiWangYiHenLoop",
"遗恨保百节": "lxgBaoBaiJieYiHenLoop",
"猴王特效": "lxgQiWangHouWangLoop",
"猴王循环": "lxgHouWangLoop"
}[loop_name]
data = await get_api("http://www.j3lxg.cn/j3dps/api/public/v1/compute/getLoop")
for loop in data["data"]:
if loop["code"] == kw:
return kw, loop["extraPointList"]
return None, None

async def get_tuilan_raw_data(server: str, uid: str) -> dict:
param = {
"zone": Zone_mapping(server),
"server": server,
"game_role_id": uid
}
equip_data = await get_tuilan_data("https://m.pvp.xoyo.com/mine/equip/get-role-equip", param)
return equip_data

class JX3Attributes:
map = {
"基础攻击力": (lambda percent: percent, "jcgj"),
"会心": (lambda percent: percent/100*78622.5, "jchx"),
"会心效果": (lambda percent: (percent-175)/100*27513.75, "jchxxg"),
"破防": (lambda percent: percent/100*78622.5, "jcpf"),
"无双": (lambda percent: percent/100*75809.25, "jcws"),
"破招": (lambda percent: percent, "jcpz"),
"身法": (lambda percent: percent, "jcsf")
}
def __init__(self, data: dict):
self.data: dict = data

@property
def weapon_damage(self) -> Tuple[int, int]:
equips: list = self.data["data"]["Equips"]
for equip in equips:
if equip["Icon"]["Kind"] == "武器" and equip["Icon"]["SubKind"] != "投掷囊":
base_damage = equip[f"Base1Type"]["Base1Min"]
delta_damage = equip[f"Base2Type"]["Base2Min"]
return int(base_damage), int(base_damage) + int(delta_damage)
raise ValueError("Cannot find weapon!")


@property
def panel(self):
panel: list = self.data["data"]["PersonalPanel"]
min_weapon, max_weapon = self.weapon_damage
new_dict = {
"jcld": 41,
"wqshMin": int(min_weapon),
"wqshMax": int(max_weapon)
}
for attr in panel:
if attr["name"] in list(self.map):
func, key = self.map[attr["name"]]
value = func(attr["value"])
new_dict[key] = value
return new_dict

@property
def special(self):
equip_list: list = self.data["data"]["Equips"]
result = []
equip_map = {
"天地间": "39855",
"变星霜": "38791",
"雁无意": "37720",
"空野": "37247",
"山河同渡": "38072",
"煞·山河同渡": "38072",
"天峰里": "35776",
"影壁孤": "34761",
"鬓间黄泉": "37099"
}
for equip in equip_list:
if equip["Name"] in ["天地间", "变星霜", "雁无意", "空野", "煞·山河同渡", "天峰里", "影壁孤"] or (equip["Name"] == "山河同渡" and equip["Quality"] == "12500") or (equip["Name"] == "鬓间黄泉" and equip["Quality"] == "11650"):
result.append(equip_map[equip["Name"]])
return result

@property
def effect(self) -> List[Optional[str]]:
equip_list: list = self.data["data"]["Equips"]
skill_event_handler_activated = False
set_equipment_recipe_activated = False

for equip in equip_list:
if "SetListMap" in equip and "Set" in equip:
equipped_set_pieces = len(equip["SetListMap"])

for effect in equip["Set"]:
set_num = int(effect.get("SetNum", 0))

if effect["Desc"] == "atSkillEventHandler" and equipped_set_pieces >= set_num:
skill_event_handler_activated = True

if effect["Desc"] == "atSetEquipmentRecipe" and equipped_set_pieces >= set_num:
set_equipment_recipe_activated = True

if skill_event_handler_activated and set_equipment_recipe_activated:
return ["5037", "5038", "1927"]
if set_equipment_recipe_activated:
return ["5037", "5038"]
if skill_event_handler_activated:
return ["1927"]
return []

@property
def enchant(self):
enchant_ = []
for place in ["帽子", "上衣", "腰带", "护臂", "鞋"]:
flag = False
for equip in self.data["data"]["Equips"]:
if equip["Icon"]["SubKind"] == place:
if "WPermanentEnchant" in equip:
enchant_.append(True)
flag = True
else:
enchant_.append(False)
flag = True
if not flag:
enchant_.append(False)
return enchant_

async def generate_calculator_img_yinlongjue(server: Optional[str], name: str, group_id: str = ""):
server = server_mapping(server, group_id)
if not server:
return [PROMPT.ServerNotExist]
role_data = await get_player_local_data(role_name=name, server_name=server)
role = role_data.format_jx3api()
if role["code"] != 200:
return [PROMPT.PlayerNotExist]
data = await get_tuilan_raw_data(server, role["data"]["roleId"])
kf_name = await get_personal_kf(data["data"]["Kungfu"]["KungfuID"])
if kf_name != "隐龙诀":
return False
instance = JX3Attributes(data)
loop_name, loop_skill = await get_loop()
if not isinstance(loop_name, str) or not isinstance(loop_skill, list):
return False
params = generate_params(
loop_name=loop_name,
loop_skill=loop_skill,
attrs=instance.panel,
input_enchant=instance.enchant,
set_list=instance.effect,
special_equip=instance.special
)
data = await post_url("http://121.41.84.37/j3dps/api/public/v1/compute/dps", json=params)
data = json.loads(data)
tables = []
for skill_data in data["data"]["mergeSkillDpsBoList"]:
tables.append(
Template(template_calculator_yinlongjue).render(**{
"skill": skill_data["skillType"].replace("dot", "(DOT)"),
"display": str(round(skill_data["proportion"]/data["data"]["mergeSkillDpsBoList"][0]["proportion"]*100, 2)) + "%",
"percent": str(round(skill_data["proportion"], 2)) + "%",
"count": str(skill_data["num"]),
"value": str(int(skill_data["damage"]))
})
)
html = Template(read(VIEWS + "/jx3/calculator/calculator.html")).render(**{
"font": ASSETS + "/font/custom.ttf",
"yozai": ASSETS + "/font/Yozai-Medium.ttf",
"msgbox": Template(msgbox_yinlongjue).render(**{
"dps": str(int(data["data"]["dps"]))
}),
"tables": "\n".join(tables),
"school": "隐龙诀",
"color": color_list["隐龙诀"],
"server": server,
"name": name,
"calculator": "【雾海寻龙】凌雪阁DPS计算器 by @猜猜<br>当前循环:遗恨保百节"
})
final_html = CACHE + "/" + get_uuid() + ".html"
write(final_html, html)
final_path = await generate(final_html, False, ".total", False)
if not isinstance(final_path, str):
return
return Path(final_path).as_uri()

0 comments on commit e54e71b

Please sign in to comment.