This commit is contained in:
Naruse
2025-04-15 19:36:05 +08:00
parent dd51fb491d
commit ec8972d5d6
121 changed files with 30598 additions and 0 deletions

View 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}")

View 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)

View 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)

View 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()

View 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