171 lines
5.4 KiB
Python
171 lines
5.4 KiB
Python
from database.mongodb import get_collection
|
|
from database.base_database_data import BaseDatabaseData
|
|
from game_server.resource import ResourceManager
|
|
from game_server.resource.configdb.relic_main_affix_config import RelicMainAffixConfigData
|
|
from game_server.resource.configdb.equipment_config import EquipmentConfig
|
|
from game_server.resource.configdb.relic_config import RelicConfigData
|
|
from game_server.game.items.relic_manager import RelicManager
|
|
from game_server.game.enums.avatar.relic_type import RelicTypeEnum
|
|
from typing import List
|
|
from pydantic import BaseModel
|
|
from rail_proto.lib import (
|
|
Equipment,
|
|
Relic,
|
|
BattleRelic,
|
|
RelicAffix,
|
|
PlayerSyncScNotify
|
|
)
|
|
|
|
items_collection = get_collection("items")
|
|
|
|
class SubAffix(BaseModel):
|
|
id: int
|
|
count: int
|
|
step: int
|
|
|
|
class InventoryData(BaseDatabaseData):
|
|
item_id: int
|
|
count: int = 1
|
|
level: int = 1
|
|
exp: int = 0
|
|
promotion: int = 0
|
|
rank: int = 0
|
|
locked: bool = False
|
|
discarded: bool = False
|
|
main_affix: int = 0
|
|
sub_affix: list[SubAffix] = []
|
|
equip_avatar: int = 0
|
|
unique_id: int = 0
|
|
main_type: int = 0
|
|
sub_type: int = 0
|
|
|
|
def add_lightcone(self):
|
|
last_item = items_collection.find_one({"uid": self.uid},sort=[("unique_id", -1)])
|
|
unique_id = last_item["unique_id"] + 1 if last_item else 1
|
|
equipment = ResourceManager.instance().find_by_index(EquipmentConfig, self.item_id)
|
|
if not equipment:
|
|
return None
|
|
|
|
self.level = 80
|
|
self.promotion = 6
|
|
self.main_type = 1
|
|
self.unique_id = unique_id
|
|
|
|
lightcone_data = self.model_dump()
|
|
items_collection.insert_one(lightcone_data)
|
|
return self
|
|
|
|
def add_relic(self):
|
|
last_item = items_collection.find_one({"uid": self.uid}, sort=[("unique_id", -1)])
|
|
unique_id = last_item["unique_id"] + 1 if last_item else 1
|
|
|
|
relic = ResourceManager.instance().find_by_index(RelicConfigData, self.item_id)
|
|
if not relic:
|
|
return None
|
|
|
|
self.level = 15
|
|
self.main_type = 2
|
|
self.sub_type = RelicTypeEnum[relic.Type].value
|
|
|
|
relic_manager = RelicManager()
|
|
main_stat = ""
|
|
get_main_affix = None
|
|
|
|
if self.main_affix > 0:
|
|
relics = ResourceManager.instance().find_by_index(RelicConfigData, self.item_id)
|
|
main_affix_group = ResourceManager.instance().find_all_by_index(RelicMainAffixConfigData, relics.MainAffixGroup)
|
|
main_stat = next(
|
|
(affix.Property for affix in main_affix_group if affix.AffixID == int(self.main_affix))
|
|
)
|
|
elif self.main_affix == 0:
|
|
get_main_affix = relic_manager.GetRandomRelicMainAffix(self.item_id)
|
|
self.main_affix = get_main_affix.AffixID
|
|
|
|
if not main_stat and get_main_affix:
|
|
main_stat = get_main_affix.Property
|
|
|
|
if not self.sub_affix:
|
|
self.sub_affix = relic_manager.GetRandomRelicSubAffix(self.item_id, main_stat, 4)
|
|
|
|
if self.sub_affix and len(self.sub_affix) < 4:
|
|
self.sub_affix.extend(relic_manager.GetRandomRelicSubAffix(self.item_id, main_stat, 4 - len(self.sub_affix), self.sub_affix))
|
|
|
|
self.unique_id = unique_id
|
|
|
|
relic_data = self.model_dump()
|
|
items_collection.insert_one(relic_data)
|
|
|
|
return self
|
|
|
|
def ToProto(self):
|
|
if self.main_type == 1:
|
|
proto = Equipment(
|
|
tid=self.item_id,
|
|
level=self.level,
|
|
rank=self.rank,
|
|
promotion=self.promotion,
|
|
dress_avatar_id=self.equip_avatar,
|
|
unique_id=self.unique_id,
|
|
)
|
|
if self.main_type == 2:
|
|
proto = Relic(
|
|
tid=self.item_id,
|
|
level=self.level,
|
|
dress_avatar_id=self.equip_avatar,
|
|
unique_id=self.unique_id,
|
|
main_affix_id=self.main_affix,
|
|
sub_affix_list=[
|
|
RelicAffix(
|
|
affix_id=affix.id,
|
|
cnt=affix.count,
|
|
step=affix.step
|
|
)
|
|
for affix in self.sub_affix
|
|
]
|
|
)
|
|
return proto
|
|
|
|
def RelicSyncProto(self):
|
|
proto = PlayerSyncScNotify(
|
|
relic_list=[self.ToProto()]
|
|
)
|
|
return proto
|
|
|
|
def LightconeSyncProto(self):
|
|
proto = PlayerSyncScNotify(
|
|
equipment_list=[self.ToProto()]
|
|
)
|
|
return proto
|
|
|
|
def save_item(self):
|
|
item_data = self.model_dump()
|
|
item_data["uid"] = self.uid
|
|
query = {"uid": self.uid, "unique_id": self.unique_id}
|
|
items_collection.update_one(query, {"$set": item_data})
|
|
|
|
def RelicBattleProto(self):
|
|
return BattleRelic(
|
|
id=self.item_id,
|
|
level=self.level,
|
|
main_affix_id=self.main_affix,
|
|
sub_affix_list=[
|
|
RelicAffix(
|
|
affix_id=affix.id,
|
|
cnt=affix.count,
|
|
step=affix.step
|
|
)
|
|
for affix in self.sub_affix
|
|
],
|
|
unique_id=self.unique_id,
|
|
type=self.sub_type
|
|
)
|
|
|
|
|
|
|
|
def get_all_items_by_uid(uid: int) -> List[InventoryData]:
|
|
items_data = items_collection.find({"uid": uid})
|
|
result = []
|
|
for items in items_data:
|
|
del items["_id"]
|
|
result.append(InventoryData(**items))
|
|
return result |