mirror of
https://github.com/MikuLeaks/KianaBH3.git
synced 2025-12-14 13:54:43 +01:00
feat: Implement stigmata standard reroll
This commit is contained in:
@@ -61,6 +61,13 @@ class SaveData:
|
|||||||
"Exp": get_item.exp,
|
"Exp": get_item.exp,
|
||||||
"SlotNum": get_item.slot_num,
|
"SlotNum": get_item.slot_num,
|
||||||
"IsLocked" : get_item.is_locked,
|
"IsLocked" : get_item.is_locked,
|
||||||
|
"RuneLists": [
|
||||||
|
{
|
||||||
|
"RuneId":rune.rune_id,
|
||||||
|
"strengthPercent":rune.strength_percent
|
||||||
|
}
|
||||||
|
for rune in get_item.rune_list
|
||||||
|
],
|
||||||
"EquipAvatarID" : get_item.equip_avatar_id
|
"EquipAvatarID" : get_item.equip_avatar_id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,16 @@ class Weapon:
|
|||||||
is_extracted : bool
|
is_extracted : bool
|
||||||
equip_avatar_id: int
|
equip_avatar_id: int
|
||||||
|
|
||||||
|
@dataclasses.dataclass
|
||||||
|
class RuneList:
|
||||||
|
rune_id : int
|
||||||
|
strength_percent : int
|
||||||
|
|
||||||
|
@dataclasses.dataclass
|
||||||
|
class RuneGroup:
|
||||||
|
unique_id : int
|
||||||
|
rune_list : list[RuneList]
|
||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
class Stigmata:
|
class Stigmata:
|
||||||
item_id : int
|
item_id : int
|
||||||
@@ -24,6 +34,8 @@ class Stigmata:
|
|||||||
promote_times : int
|
promote_times : int
|
||||||
is_locked : bool
|
is_locked : bool
|
||||||
equip_avatar_id : int
|
equip_avatar_id : int
|
||||||
|
rune_list : list[RuneList] = dataclasses.field(default_factory=list)
|
||||||
|
wait_select_rune_group_list: list[RuneGroup] = dataclasses.field(default_factory=list)
|
||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
class InventoryManager:
|
class InventoryManager:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import dataclasses
|
import dataclasses
|
||||||
from database import mongo
|
from database import mongo
|
||||||
from game_server.game.avatar.avatar_manager import AvatarManager,Skill,AvatarSubSkill,AvatarTeamManager
|
from game_server.game.avatar.avatar_manager import AvatarManager,Skill,AvatarSubSkill,AvatarTeamManager
|
||||||
from game_server.game.inventory.inventory_manager import InventoryManager,Material,Weapon,Stigmata
|
from game_server.game.inventory.inventory_manager import InventoryManager,Material,Weapon,Stigmata,RuneList,RuneGroup
|
||||||
from game_server.game.elf.elf_manager import ElfManager,ElfSkill
|
from game_server.game.elf.elf_manager import ElfManager,ElfSkill
|
||||||
from game_server.game.enum.item_type import MainType
|
from game_server.game.enum.item_type import MainType
|
||||||
|
|
||||||
@@ -107,7 +107,14 @@ class Player:
|
|||||||
refine_value=item['RefineValue'],
|
refine_value=item['RefineValue'],
|
||||||
promote_times=item['PromoteTimes'],
|
promote_times=item['PromoteTimes'],
|
||||||
is_locked=item['IsLocked'],
|
is_locked=item['IsLocked'],
|
||||||
equip_avatar_id=item['EquipAvatarID']
|
equip_avatar_id=item['EquipAvatarID'],
|
||||||
|
rune_list=[
|
||||||
|
RuneList(
|
||||||
|
rune_id=rune['RuneId'],
|
||||||
|
strength_percent=rune['strengthPercent']
|
||||||
|
)
|
||||||
|
for rune in item['RuneLists']
|
||||||
|
]
|
||||||
)
|
)
|
||||||
self.inventory.stigmata_items[item['UniqueID']] = stigmata
|
self.inventory.stigmata_items[item['UniqueID']] = stigmata
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,14 @@
|
|||||||
import betterproto
|
import betterproto
|
||||||
from typing import List
|
from typing import List
|
||||||
from game_server.net.session import Session
|
from game_server.net.session import Session
|
||||||
from game_server.resource import ResourceManager
|
|
||||||
from game_server.resource.configdb.weapon_data import WeaponData
|
|
||||||
from game_server.resource.configdb.stigmata_data import StigmataData
|
|
||||||
from lib.proto import (
|
from lib.proto import (
|
||||||
GetEquipmentDataReq,
|
GetEquipmentDataReq,
|
||||||
GetEquipmentDataRsp,
|
GetEquipmentDataRsp,
|
||||||
Material,
|
Material,
|
||||||
Weapon,
|
Weapon,
|
||||||
Stigmata,
|
Stigmata,
|
||||||
|
StigmataRuneGroup,
|
||||||
|
StigmataRune
|
||||||
)
|
)
|
||||||
|
|
||||||
async def handle(session: Session, msg: GetEquipmentDataReq) -> betterproto.Message:
|
async def handle(session: Session, msg: GetEquipmentDataReq) -> betterproto.Message:
|
||||||
@@ -23,7 +22,8 @@ async def handle(session: Session, msg: GetEquipmentDataReq) -> betterproto.Mess
|
|||||||
level=weapon.level,
|
level=weapon.level,
|
||||||
exp=weapon.exp,
|
exp=weapon.exp,
|
||||||
is_protected=weapon.is_locked,
|
is_protected=weapon.is_locked,
|
||||||
is_extracted=weapon.is_extracted
|
is_extracted=weapon.is_extracted,
|
||||||
|
homology_level=3
|
||||||
)
|
)
|
||||||
for id, weapon in session.player.inventory.weapon_items.items()
|
for id, weapon in session.player.inventory.weapon_items.items()
|
||||||
],
|
],
|
||||||
@@ -33,10 +33,30 @@ async def handle(session: Session, msg: GetEquipmentDataReq) -> betterproto.Mess
|
|||||||
id=stigmata.item_id,
|
id=stigmata.item_id,
|
||||||
level=stigmata.level,
|
level=stigmata.level,
|
||||||
exp=stigmata.exp,
|
exp=stigmata.exp,
|
||||||
slot_num=stigmata.slot_num,
|
slot_num=2,
|
||||||
refine_value=stigmata.refine_value,
|
refine_value=stigmata.refine_value,
|
||||||
promote_times=stigmata.promote_times,
|
promote_times=stigmata.promote_times,
|
||||||
is_protected=stigmata.is_locked
|
is_protected=stigmata.is_locked,
|
||||||
|
rune_list=[
|
||||||
|
StigmataRune(
|
||||||
|
rune_id=rune.rune_id,
|
||||||
|
strength_percent=rune.strength_percent
|
||||||
|
)
|
||||||
|
for rune in stigmata.rune_list
|
||||||
|
],
|
||||||
|
wait_select_rune_group_list=[
|
||||||
|
StigmataRuneGroup(
|
||||||
|
unique_id=index,
|
||||||
|
rune_list=[
|
||||||
|
StigmataRune(
|
||||||
|
rune_id=rune.rune_id,
|
||||||
|
strength_percent=rune.strength_percent
|
||||||
|
)
|
||||||
|
for rune in affix.rune_list
|
||||||
|
]
|
||||||
|
)
|
||||||
|
for index,affix in enumerate(stigmata.wait_select_rune_group_list, start=1)
|
||||||
|
]
|
||||||
)
|
)
|
||||||
for id, stigmata in session.player.inventory.stigmata_items.items()
|
for id, stigmata in session.player.inventory.stigmata_items.items()
|
||||||
],
|
],
|
||||||
|
|||||||
74
game_server/packet/handlers/RefineStigmataRuneReq.py
Normal file
74
game_server/packet/handlers/RefineStigmataRuneReq.py
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
import betterproto
|
||||||
|
import random
|
||||||
|
from game_server.net.session import Session
|
||||||
|
from game_server.resource import ResourceManager
|
||||||
|
from game_server.resource.configdb.affix_list import AffixListData
|
||||||
|
from game_server.game.inventory.inventory_manager import RuneList,RuneGroup
|
||||||
|
from lib.proto import (
|
||||||
|
RefineStigmataRuneReq,
|
||||||
|
RefineStigmataRuneRsp,
|
||||||
|
StigmataRuneGroup,
|
||||||
|
StigmataRune,
|
||||||
|
StigmataRefineTimesType,
|
||||||
|
GetEquipmentDataReq
|
||||||
|
)
|
||||||
|
|
||||||
|
def generate_affix_and_percentage(affix_ids):
|
||||||
|
affix_id1, affix_id2 = random.choice(affix_ids), random.choice(affix_ids)
|
||||||
|
percentage1, percentage2 = [
|
||||||
|
random.randint(*r) for r in random.choices(
|
||||||
|
[(20, 50), (50, 70), (80, 100)], weights=[50, 40, 10], k=2
|
||||||
|
)
|
||||||
|
]
|
||||||
|
return {"affix1": affix_id1, "percentage1": percentage1, "affix2": affix_id2, "percentage2": percentage2}
|
||||||
|
|
||||||
|
async def handle(session: Session, msg: RefineStigmataRuneReq) -> betterproto.Message:
|
||||||
|
stigmata_data = session.player.inventory.stigmata_items.get(msg.unique_id)
|
||||||
|
affix_ids = [affix.affixID for affix in ResourceManager.instance().values(AffixListData)]
|
||||||
|
result = []
|
||||||
|
if msg.times_type == StigmataRefineTimesType.STIGMATA_REFINE_TIMES_TEN.value:
|
||||||
|
result = [generate_affix_and_percentage(affix_ids) for _ in range(10)]
|
||||||
|
else:
|
||||||
|
result.append(generate_affix_and_percentage(affix_ids))
|
||||||
|
stigmata_data.wait_select_rune_group_list = []
|
||||||
|
stigmata_data.wait_select_rune_group_list.extend(
|
||||||
|
[
|
||||||
|
RuneGroup(
|
||||||
|
unique_id=index,
|
||||||
|
rune_list=[
|
||||||
|
RuneList(
|
||||||
|
rune_id=affix['affix1'],
|
||||||
|
strength_percent=affix['percentage1']
|
||||||
|
),
|
||||||
|
RuneList(
|
||||||
|
rune_id=affix['affix2'],
|
||||||
|
strength_percent=affix['percentage2']
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
for index, affix in enumerate(result, start=1)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
await session.process_packet(session.create_packet(GetEquipmentDataReq()))
|
||||||
|
|
||||||
|
return RefineStigmataRuneRsp(
|
||||||
|
retcode=0,
|
||||||
|
rune_group_list=[
|
||||||
|
StigmataRuneGroup(
|
||||||
|
unique_id=index,
|
||||||
|
rune_list=[
|
||||||
|
StigmataRune(
|
||||||
|
rune_id=affix['affix1'],
|
||||||
|
strength_percent=affix['percentage1']
|
||||||
|
),
|
||||||
|
StigmataRune(
|
||||||
|
rune_id=affix['affix2'],
|
||||||
|
strength_percent=affix['percentage2']
|
||||||
|
),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
for index, affix in enumerate(result, start=1)
|
||||||
|
],
|
||||||
|
times_type=10 if msg.times_type > 0 else 1
|
||||||
|
)
|
||||||
38
game_server/packet/handlers/SelectNewStigmataRuneReq.py
Normal file
38
game_server/packet/handlers/SelectNewStigmataRuneReq.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
|
||||||
|
import betterproto
|
||||||
|
from game_server.net.session import Session
|
||||||
|
from game_server.game.inventory.inventory_manager import RuneList
|
||||||
|
from game_server.game.enum.data_type import DataType
|
||||||
|
from database import mongo
|
||||||
|
from lib.proto import (
|
||||||
|
SelectNewStigmataRuneReq,
|
||||||
|
SelectNewStigmataRuneRsp,
|
||||||
|
GetEquipmentDataReq
|
||||||
|
)
|
||||||
|
|
||||||
|
async def handle(session: Session, msg: SelectNewStigmataRuneReq) -> betterproto.Message:
|
||||||
|
stigmata_data = session.player.inventory.stigmata_items.get(msg.unique_id)
|
||||||
|
|
||||||
|
if msg.select_unique_id > 0 and msg.is_select:
|
||||||
|
affix_data = [affix for affix in stigmata_data.wait_select_rune_group_list if msg.select_unique_id == affix.unique_id][0]
|
||||||
|
stigmata_data.rune_list = []
|
||||||
|
stigmata_data.rune_list.extend(
|
||||||
|
[
|
||||||
|
RuneList(
|
||||||
|
rune_id=rune.rune_id,
|
||||||
|
strength_percent=rune.strength_percent
|
||||||
|
)
|
||||||
|
for rune in affix_data.rune_list
|
||||||
|
]
|
||||||
|
)
|
||||||
|
mongo.save(session,DataType.STIGMATA,[msg.unique_id])
|
||||||
|
|
||||||
|
stigmata_data.wait_select_rune_group_list = []
|
||||||
|
await session.process_packet(session.create_packet(GetEquipmentDataReq()))
|
||||||
|
|
||||||
|
return SelectNewStigmataRuneRsp(
|
||||||
|
retcode=0,
|
||||||
|
select_unique_id=msg.select_unique_id,
|
||||||
|
is_select=msg.is_select
|
||||||
|
)
|
||||||
|
|
||||||
15
game_server/resource/configdb/affix_list.py
Normal file
15
game_server/resource/configdb/affix_list.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
from dataclasses import dataclass
|
||||||
|
from game_server.resource.base_resource import BaseResource
|
||||||
|
from game_server.resource.decorators import GameResource
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
@GameResource("resources/ExcelOutputAsset/AffixList.json")
|
||||||
|
class AffixListData(BaseResource):
|
||||||
|
affixID: int
|
||||||
|
level: int
|
||||||
|
|
||||||
|
def on_load(self) -> bool:
|
||||||
|
return self.level == 3
|
||||||
|
|
||||||
|
def get_index(self) -> str:
|
||||||
|
return str(self.affixID)
|
||||||
Reference in New Issue
Block a user