init
This commit is contained in:
16
game_server/game/chat/command/__init__.py
Normal file
16
game_server/game/chat/command/__init__.py
Normal file
@@ -0,0 +1,16 @@
|
||||
import importlib
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
folder = "game_server/game/chat/command"
|
||||
sys.path.append(os.path.dirname(folder))
|
||||
|
||||
for filename in os.listdir(folder):
|
||||
if filename.endswith(".py") and filename != "__init__.py":
|
||||
module_name = filename[:-3]
|
||||
module_path = f"game_server.game.chat.command.{module_name}"
|
||||
try:
|
||||
importlib.import_module(module_path)
|
||||
except Exception as e:
|
||||
print(f"Error importing module '{module_path}': {e}")
|
||||
60
game_server/game/chat/command/give.py
Normal file
60
game_server/game/chat/command/give.py
Normal file
@@ -0,0 +1,60 @@
|
||||
from game_server.game.chat.decorators import Command
|
||||
from game_server.net.session import PlayerSession
|
||||
from game_server.resource import ResourceManager
|
||||
from game_server.resource.configdb.equipment_config import EquipmentConfig
|
||||
from game_server.resource.configdb.relic_config import RelicConfigData
|
||||
from game_server.resource.configdb.relic_main_affix_config import RelicMainAffixConfigData
|
||||
from game_server.resource.configdb.relic_sub_affix_config import RelicSubAffixConfigData
|
||||
from database.inventory.inventory_data import SubAffix
|
||||
|
||||
@Command(
|
||||
prefix="give",
|
||||
usage="/give",
|
||||
)
|
||||
async def execute(session:PlayerSession, item_id, param1=None, param2=None, param3=None, param4=None, param5=None):
|
||||
try:
|
||||
sync = False
|
||||
lightcones = ResourceManager.instance().find_by_index(EquipmentConfig,item_id)
|
||||
relics = ResourceManager.instance().find_by_index(RelicConfigData,item_id)
|
||||
|
||||
if lightcones:
|
||||
rank = 1
|
||||
if param1 and param1.startswith("r") and len(param1) == 2:
|
||||
rank_value = param1[1]
|
||||
if rank_value.isdigit() and 1 <= int(rank_value) <= 5:
|
||||
rank = int(rank_value)
|
||||
elif rank_value.isdigit() and int(rank_value) > 5:
|
||||
rank = 5
|
||||
item = session.player.add_lightcone(item_id, rank)
|
||||
if item:
|
||||
session.player.inventory_manager[item.unique_id] = item
|
||||
sync = True
|
||||
elif relics:
|
||||
main_stat = 0
|
||||
main_property = ""
|
||||
main_affix_group = ResourceManager.instance().find_all_by_index(RelicMainAffixConfigData, relics.MainAffixGroup)
|
||||
sub_affix_list = []
|
||||
|
||||
if param1 and param1.startswith("s") and len(param1) == 2 and param1[1].isdigit():
|
||||
main_affix = next((affix for affix in main_affix_group if affix.AffixID == int(param1[1])))
|
||||
if main_affix:
|
||||
main_stat = main_affix.AffixID
|
||||
main_property = main_affix.Property
|
||||
|
||||
for param in [param2, param3, param4, param5]:
|
||||
if param and len(param) >= 3 and ":" in param:
|
||||
parts = param.split(":")
|
||||
if len(parts) == 2 and all(part.isdigit() for part in parts):
|
||||
sub_affix_data = ResourceManager.instance().find_all_by_index(RelicSubAffixConfigData, relics.SubAffixGroup)
|
||||
for affix in sub_affix_data:
|
||||
if affix.AffixID == int(parts[0]) and affix.Property != main_property:
|
||||
sub_affix_list.append(SubAffix(id=int(parts[0]), count=int(parts[1]), step=int(parts[1]) * 2))
|
||||
item = session.player.add_relic(item_id,main_stat,sub_affix_list)
|
||||
if item:
|
||||
session.player.inventory_manager[item.unique_id] = item
|
||||
sync = True
|
||||
if sync:
|
||||
await session.notify(session.player.PlayerSyncProto())
|
||||
return "GIVE"
|
||||
except Exception as e:
|
||||
print(e)
|
||||
48
game_server/game/chat/command/giveall.py
Normal file
48
game_server/game/chat/command/giveall.py
Normal file
@@ -0,0 +1,48 @@
|
||||
from game_server.game.chat.decorators import Command
|
||||
from game_server.net.session import PlayerSession
|
||||
from game_server.resource import ResourceManager
|
||||
from game_server.resource.configdb.avatar_config import AvatarConfig
|
||||
from game_server.resource.configdb.equipment_config import EquipmentConfig
|
||||
from game_server.resource.configdb.relic_config import RelicConfigData
|
||||
|
||||
@Command(
|
||||
prefix="giveall",
|
||||
usage="/giveall",
|
||||
)
|
||||
async def execute(session:PlayerSession, text):
|
||||
try:
|
||||
sync = False
|
||||
if text == "avatars":
|
||||
avatars = ResourceManager.instance().values(AvatarConfig)
|
||||
for avatar in avatars:
|
||||
if avatar.AvatarID == 1224 or avatar.AvatarID >= 7000:
|
||||
continue
|
||||
if session.player.avatar_mananger.get(avatar.AvatarID):
|
||||
continue
|
||||
data = session.player.add_avatar(avatar.AvatarID)
|
||||
if data:
|
||||
session.player.avatar_mananger[data.avatar_id] = data
|
||||
sync = True
|
||||
|
||||
if text == "lightcones":
|
||||
lightcones = ResourceManager.instance().values(EquipmentConfig)
|
||||
for lightcone in lightcones:
|
||||
item = session.player.add_lightcone(lightcone.EquipmentID)
|
||||
if item:
|
||||
session.player.inventory_manager[item.unique_id] = item
|
||||
sync = True
|
||||
|
||||
if text == "relics":
|
||||
relics = ResourceManager.instance().values(RelicConfigData)
|
||||
for relic in relics:
|
||||
item = session.player.add_relic(relic.ID)
|
||||
if item:
|
||||
session.player.inventory_manager[item.unique_id] = item
|
||||
sync = True
|
||||
|
||||
if sync:
|
||||
await session.notify(session.player.PlayerSyncProto())
|
||||
|
||||
return "GIVEALL"
|
||||
except Exception as e:
|
||||
print(e)
|
||||
53
game_server/game/chat/command_handler.py
Normal file
53
game_server/game/chat/command_handler.py
Normal file
@@ -0,0 +1,53 @@
|
||||
from utils.logger import Info
|
||||
from game_server.game.chat.decorators import command_registry
|
||||
from game_server.net.session import PlayerSession
|
||||
import game_server.game.chat.command # noqa: F401
|
||||
|
||||
|
||||
class CommandHandler:
|
||||
def load_commands(self):
|
||||
registered_commands = ", ".join(
|
||||
item.prefix for item in command_registry.values() if not item.is_alias
|
||||
)
|
||||
|
||||
Info(
|
||||
f"[BOOT] [CommandHandler] Registered {len(command_registry)} game commands => {registered_commands}"
|
||||
)
|
||||
|
||||
def parse_command(self, content: str):
|
||||
content = content.lstrip("/")
|
||||
parts = content.split(maxsplit=1)
|
||||
if len(parts) < 2:
|
||||
return parts[0], ""
|
||||
|
||||
return parts[0], parts[1]
|
||||
|
||||
def print_help(self):
|
||||
result = "Available commands:\n"
|
||||
for index, (_, func) in enumerate(command_registry.items()):
|
||||
result += f"{index+1}) {func.usage}\n\n"
|
||||
return result
|
||||
|
||||
async def handle_command(self, session: PlayerSession, content: str):
|
||||
if content == "/help":
|
||||
return self.print_help()
|
||||
|
||||
command_label, args = self.parse_command(content)
|
||||
command_func = command_registry.get(command_label)
|
||||
|
||||
if command_func is not None:
|
||||
func_args_cnt = command_func.__code__.co_argcount - 1
|
||||
args_list = args.split()[:func_args_cnt]
|
||||
|
||||
if args_list and args_list[0] == "help":
|
||||
return f"Usage: {command_func.usage}"
|
||||
|
||||
try:
|
||||
return await command_func(session, *args_list)
|
||||
except TypeError:
|
||||
return f"Usage: {command_func.usage}"
|
||||
|
||||
return None
|
||||
|
||||
|
||||
handler = CommandHandler()
|
||||
21
game_server/game/chat/decorators.py
Normal file
21
game_server/game/chat/decorators.py
Normal file
@@ -0,0 +1,21 @@
|
||||
from typing import Dict, Type
|
||||
|
||||
|
||||
command_registry: Dict[str, Type] = {}
|
||||
|
||||
|
||||
def Command(prefix: str, usage: str, aliases: list = list()):
|
||||
def decorator(func):
|
||||
func.usage = usage
|
||||
func.prefix = prefix
|
||||
func.is_alias = False
|
||||
command_registry[prefix] = func
|
||||
|
||||
# Register alias if exist
|
||||
for alias in aliases:
|
||||
func.is_alias = True
|
||||
command_registry[alias] = func
|
||||
|
||||
return func
|
||||
|
||||
return decorator
|
||||
Reference in New Issue
Block a user