|
"""
|
|
Player management service implementation.
|
|
"""
|
|
|
|
import time
|
|
from typing import Dict, Optional, List
|
|
import uuid
|
|
|
|
from ..interfaces.service_interfaces import IPlayerService
|
|
from ..interfaces.game_interfaces import IGameWorld
|
|
from ..core.player import Player
|
|
|
|
|
|
class PlayerService(IPlayerService):
|
|
"""Service for managing players in the game world."""
|
|
|
|
def __init__(self, game_world: IGameWorld):
|
|
self.game_world = game_world
|
|
|
|
def create_player(self, name: str, player_type: str) -> Player:
|
|
"""Create a new player with given name and type."""
|
|
player = Player(
|
|
id=str(uuid.uuid4()),
|
|
name=name,
|
|
type=player_type,
|
|
x=100,
|
|
y=100,
|
|
level=1,
|
|
hp=100,
|
|
max_hp=100,
|
|
gold=50,
|
|
experience=0,
|
|
last_active=time.time(),
|
|
session_hash="",
|
|
ai_agent_id=""
|
|
)
|
|
return player
|
|
|
|
def get_player(self, player_id: str) -> Optional[Player]:
|
|
"""Get player by ID from the game world."""
|
|
return self.game_world.get_player(player_id)
|
|
|
|
def update_player(self, player: Player) -> bool:
|
|
"""Update player data in the game world."""
|
|
|
|
player.update_activity()
|
|
|
|
|
|
|
|
return True
|
|
|
|
def move_player(self, player_id: str, direction: str) -> bool:
|
|
"""Move player in specified direction."""
|
|
return self.game_world.move_player(player_id, direction)
|
|
|
|
def level_up_player(self, player_id: str) -> bool:
|
|
"""Level up a player if they have enough experience."""
|
|
player = self.get_player(player_id)
|
|
if not player:
|
|
return False
|
|
|
|
if player.can_level_up():
|
|
player.level_up()
|
|
self.update_player(player)
|
|
return True
|
|
|
|
return False
|
|
|
|
def get_all_players(self) -> Dict[str, Player]:
|
|
"""Get all players from the game world."""
|
|
return self.game_world.get_all_players()
|
|
|
|
def add_player_to_world(self, player: Player) -> bool:
|
|
"""Add player to the game world."""
|
|
return self.game_world.add_player(player)
|
|
|
|
def remove_player_from_world(self, player_id: str) -> bool:
|
|
"""Remove player from the game world."""
|
|
return self.game_world.remove_player(player_id)
|
|
|
|
def heal_player(self, player_id: str, amount: int) -> bool:
|
|
"""Heal a player by specified amount."""
|
|
player = self.get_player(player_id)
|
|
if not player:
|
|
return False
|
|
|
|
healed = player.heal(amount)
|
|
self.update_player(player)
|
|
return healed > 0
|
|
|
|
def damage_player(self, player_id: str, amount: int) -> bool:
|
|
"""Damage a player by specified amount."""
|
|
player = self.get_player(player_id)
|
|
if not player:
|
|
return False
|
|
|
|
player.take_damage(amount)
|
|
self.update_player(player)
|
|
return True
|
|
|
|
def get_player_stats(self, player_id: str) -> Dict:
|
|
"""Get formatted player statistics."""
|
|
player = self.get_player(player_id)
|
|
if not player:
|
|
return {}
|
|
|
|
return player.get_stats()
|
|
|
|
def cleanup_inactive_players(self, timeout_seconds: int = 300) -> int:
|
|
"""Remove inactive players and return count removed."""
|
|
all_players = self.get_all_players()
|
|
removed_count = 0
|
|
|
|
for player_id, player in list(all_players.items()):
|
|
if not player.is_active(timeout_seconds):
|
|
if self.remove_player_from_world(player_id):
|
|
removed_count += 1
|
|
|
|
return removed_count
|
|
|