Refactor battle & fix name for avatar_manager
This commit is contained in:
80
game_server/game/battle/battle_manager.py
Normal file
80
game_server/game/battle/battle_manager.py
Normal file
@@ -0,0 +1,80 @@
|
||||
import numpy as np
|
||||
from game_server.resource.configdb.stage_config import StageConfig
|
||||
from game_server.resource import ResourceManager
|
||||
from rail_proto.lib import (
|
||||
BattleEndStatus,
|
||||
PVEBattleResultCsReq,
|
||||
SceneCastSkillCsReq,
|
||||
SceneCastSkillScRsp,
|
||||
SceneBattleInfo,
|
||||
SceneMonsterWave,
|
||||
SceneMonster,
|
||||
SceneEntityInfo
|
||||
)
|
||||
|
||||
class BattleManager:
|
||||
def __init__(self, player):
|
||||
self.player = player
|
||||
self.player.next_battle_id += 1
|
||||
self.battle_id: int = self.player.next_battle_id
|
||||
self.round_limit: int = 0
|
||||
self.stage_id: int = 0
|
||||
self.battle_end_status: BattleEndStatus = BattleEndStatus.BATTLE_END_NONE
|
||||
|
||||
# list & dict
|
||||
self.stages: list[StageConfig] = []
|
||||
self.entity_monster: list[SceneEntityInfo] = []
|
||||
#self.buffs: list[MazeBuff] = []
|
||||
self.battle_result: PVEBattleResultCsReq | None = None
|
||||
|
||||
|
||||
def GetBattleLineup(self):
|
||||
return [
|
||||
self.player.avatar_manager.get(avatar_id).ToBattleProto(index,self.player)
|
||||
for index, avatar_id in enumerate(self.player.lineup_manager.get(self.player.data.cur_lineup, None).avatar_list)
|
||||
]
|
||||
|
||||
def GetBattleMonster(self):
|
||||
return [
|
||||
SceneMonsterWave(
|
||||
battle_stage_id=monster_list.StageID,
|
||||
battle_wave_id=index,
|
||||
monster_list=[
|
||||
SceneMonster(
|
||||
monster_id=id
|
||||
)
|
||||
for monster_dict in monster_list.MonsterList
|
||||
for monster, id in monster_dict.items()
|
||||
if id > 0
|
||||
]
|
||||
)
|
||||
for index, monster_list in enumerate(self.stages)
|
||||
]
|
||||
|
||||
def EnterBattle(self, msg: SceneCastSkillCsReq, targets: list[int]) -> SceneCastSkillScRsp:
|
||||
self.stages: list[StageConfig] = []
|
||||
for entity_id in targets:
|
||||
entity_data = self.player.scene_manager.entities.get(entity_id)
|
||||
if entity_data:
|
||||
stage = ResourceManager.instance().find_by_index(StageConfig, entity_data.npc_monster.event_id * 10)
|
||||
if not stage:
|
||||
stage = ResourceManager.instance().find_by_index(StageConfig, entity_data.npc_monster.event_id)
|
||||
if stage:
|
||||
self.stages.append(stage)
|
||||
self.entity_monster.append(entity_data)
|
||||
if self.stages:
|
||||
self.stage_id = self.stages[0].StageID
|
||||
return SceneCastSkillScRsp(
|
||||
retcode=0,
|
||||
cast_entity_id=msg.cast_entity_id,
|
||||
battle_info=SceneBattleInfo(
|
||||
rounds_limit=self.round_limit,
|
||||
world_level=self.player.data.world_level,
|
||||
logic_random_seed=np.random.randint(1, np.iinfo(np.int32).max, dtype=np.int32),
|
||||
stage_id=self.stage_id,
|
||||
battle_id=self.battle_id,
|
||||
battle_avatar_list=self.GetBattleLineup(),
|
||||
monster_wave_list=self.GetBattleMonster()
|
||||
)
|
||||
)
|
||||
return SceneCastSkillScRsp()
|
||||
@@ -17,11 +17,11 @@ async def execute(session:PlayerSession, text):
|
||||
for avatar in avatars:
|
||||
if avatar.AvatarID == 1224 or avatar.AvatarID >= 7000:
|
||||
continue
|
||||
if session.player.avatar_mananger.get(avatar.AvatarID):
|
||||
if session.player.avatar_manager.get(avatar.AvatarID):
|
||||
continue
|
||||
data = session.player.add_avatar(avatar.AvatarID)
|
||||
if data:
|
||||
session.player.avatar_mananger[data.avatar_id] = data
|
||||
session.player.avatar_manager[data.avatar_id] = data
|
||||
sync = True
|
||||
|
||||
if text == "lightcones":
|
||||
|
||||
@@ -3,6 +3,7 @@ from database.player.player_data import PlayerData,players_collection
|
||||
from database.avatar.avatar_data import AvatarData,get_all_avatars_by_uid,avatars_collection
|
||||
from database.lineup.lineup_data import LineupData,get_all_lineup_by_uid,lineups_collection
|
||||
from database.inventory.inventory_data import InventoryData,get_all_items_by_uid,items_collection
|
||||
from game_server.game.battle.battle_manager import BattleManager
|
||||
from game_server.game.scene.scene_manager import SceneManager
|
||||
from typing import Optional
|
||||
from rail_proto.lib import (
|
||||
@@ -14,11 +15,17 @@ from utils.logger import Error
|
||||
|
||||
|
||||
class PlayerManager(BaseModel):
|
||||
class Config:
|
||||
arbitrary_types_allowed = True
|
||||
|
||||
data : PlayerData = PlayerData()
|
||||
avatar_mananger: dict[int,AvatarData] = {}
|
||||
avatar_manager: dict[int,AvatarData] = {}
|
||||
lineup_manager: dict[int,LineupData] = {}
|
||||
inventory_manager: dict[int,InventoryData] = {}
|
||||
scene_manager: SceneManager = None
|
||||
battle_manager: BattleManager = None
|
||||
|
||||
next_battle_id: int = 0
|
||||
|
||||
def init_default(self):
|
||||
self.add_all_avatars()
|
||||
@@ -41,10 +48,10 @@ class PlayerManager(BaseModel):
|
||||
uid=self.data.uid,
|
||||
avatar_id=self.data.cur_basic_type
|
||||
).add_avatar()
|
||||
self.avatar_mananger[self.data.cur_basic_type] = avatar
|
||||
self.avatar_manager[self.data.cur_basic_type] = avatar
|
||||
|
||||
for avatar in avatars:
|
||||
self.avatar_mananger[avatar.avatar_id] = avatar
|
||||
self.avatar_manager[avatar.avatar_id] = avatar
|
||||
|
||||
def add_all_lineups(self):
|
||||
lineups = get_all_lineup_by_uid(uid=self.data.uid)
|
||||
@@ -65,7 +72,7 @@ class PlayerManager(BaseModel):
|
||||
self.inventory_manager[item.unique_id] = item
|
||||
|
||||
def add_avatar(self,avatar_id:int) -> Optional[AvatarData]:
|
||||
avatar = self.avatar_mananger.get(avatar_id)
|
||||
avatar = self.avatar_manager.get(avatar_id)
|
||||
if avatar:
|
||||
return None
|
||||
|
||||
@@ -106,7 +113,7 @@ class PlayerManager(BaseModel):
|
||||
|
||||
def PlayerSyncProto(self) -> PlayerSyncScNotify:
|
||||
avatars = []
|
||||
for avatar_id,avatar in self.avatar_mananger.items():
|
||||
for avatar_id,avatar in self.avatar_manager.items():
|
||||
avatars.append(avatar.ToProto())
|
||||
|
||||
lightcones = []
|
||||
@@ -139,7 +146,7 @@ class PlayerManager(BaseModel):
|
||||
|
||||
def save_all_avatars_bulk(self):
|
||||
operations = []
|
||||
for avatar in self.avatar_mananger.values():
|
||||
for avatar in self.avatar_manager.values():
|
||||
avatar_data = avatar.model_dump()
|
||||
avatar_data["uid"] = avatar.uid
|
||||
query = {"uid": avatar.uid, "avatar_id": avatar.avatar_id}
|
||||
|
||||
@@ -5,7 +5,6 @@ from game_server.resource.configdb.maze_plane import MazePlaneData
|
||||
from game_server.resource.configdb.map_entrance import MapEntranceData
|
||||
from game_server.game.motion.motion_info import Motion
|
||||
from rail_proto.lib import (
|
||||
SceneEntityGroupInfo,
|
||||
SceneInfo,
|
||||
SceneEntityInfo,
|
||||
SceneEntityGroupInfo,
|
||||
@@ -25,7 +24,6 @@ class SceneManager(BaseModel):
|
||||
teleport_id: int = 0
|
||||
entity_group_list: list[SceneEntityGroupInfo] = []
|
||||
entities: dict[int,SceneEntityInfo] = {}
|
||||
battle_monster: list[SceneEntityInfo] = []
|
||||
|
||||
def ToProto(self,session) -> SceneInfo:
|
||||
prop_entity_id = 10
|
||||
|
||||
Reference in New Issue
Block a user