Difficult-Rocket/Difficult_Rocket/main.py

128 lines
3.4 KiB
Python
Raw Normal View History

2021-09-08 23:38:34 +08:00
# -------------------------------
# Difficult Rocket
2023-01-20 14:08:12 +08:00
# Copyright © 2020-2023 by shenjackyuanjie 3695888@qq.com
2021-09-08 23:38:34 +08:00
# All rights reserved
# -------------------------------
2021-02-16 00:15:29 +08:00
"""
2020-12-05 21:24:54 +08:00
writen by shenjackyuanjie
2021-09-08 23:38:34 +08:00
mail: 3695888@qq.com
github: @shenjackyuanjie
gitee: @shenjackyuanjie
2021-02-16 00:15:29 +08:00
"""
2020-12-05 21:24:54 +08:00
2021-01-25 12:22:55 +08:00
import time
import logging
2023-05-14 20:23:20 +08:00
import traceback
import logging.config
import multiprocessing
2023-04-09 03:21:11 +08:00
from io import StringIO
2023-04-24 23:08:43 +08:00
from pathlib import Path
2023-06-22 13:34:14 +08:00
from typing import List, Optional, Dict
2023-04-09 03:21:11 +08:00
from Difficult_Rocket.utils import tools
from Difficult_Rocket.api.types import Options
2023-05-14 20:23:20 +08:00
from Difficult_Rocket.utils.translate import tr
from Difficult_Rocket.runtime import DR_runtime
2023-06-22 13:34:14 +08:00
from Difficult_Rocket.mod.loader import ModManager
from Difficult_Rocket.utils.thread import new_thread
2023-05-14 20:23:20 +08:00
from Difficult_Rocket.crash import write_info_to_cache
from Difficult_Rocket import client, server, DR_status
2020-12-05 21:24:54 +08:00
2022-08-12 21:07:36 +08:00
class Console(Options):
name = 'python stdin console'
running: bool = False
caches: List[str] = []
@new_thread('python console', daemon=True, log_thread=True)
def main(self):
while self.running:
try:
get_str = input('>>>')
except (EOFError, KeyboardInterrupt):
get_str = 'stop'
self.caches.append(get_str)
if get_str == 'stop':
self.running = False
break
def start(self):
self.running = True
self.main()
def stop(self):
self.running = False
def get_command(self) -> Optional[str]:
return self.caches.pop(0) if self.caches else None
2023-06-18 15:42:35 +08:00
def new_command(self) -> None:
return None
2023-05-14 20:42:18 +08:00
class Game(Options):
name = 'MainGame'
client: client.Client
server: server.Server
console: Console
2023-05-14 20:42:18 +08:00
console_class: Console = Console
main_config: Dict
logger: logging.Logger
2023-06-22 13:34:14 +08:00
mod_manager: ModManager
def dispatch_mod_event(self, event_name: str, *args, **kwargs) -> None:
self.mod_manager.dispatch_event(event_name, *args, **kwargs)
def init_mods(self) -> None:
"""验证/加载 mod"""
2023-06-22 13:34:14 +08:00
from Difficult_Rocket.mod import loader as mod_loader
mod_loader.logger = logging.getLogger('mod_manager')
self.mod_manager = ModManager()
mod_class = self.mod_manager.load_mods()
self.mod_manager.init_mods(mod_class)
self.dispatch_mod_event('on_load', game=self)
2023-05-14 20:42:18 +08:00
def init_console(self) -> None:
2023-05-14 20:56:19 +08:00
self.console = self.console_class()
2023-05-14 20:42:18 +08:00
self.console.start()
def start(self):
self.server.run()
if DR_status.use_multiprocess:
2023-05-14 20:42:18 +08:00
try:
game_process = multiprocessing.Process(target=self.client.start, name='pyglet app')
game_process.start()
game_process.join()
except Exception:
return -1
else:
return 1
else:
self.client.start()
2023-05-14 20:23:20 +08:00
def log_env(self) -> None:
2023-06-22 13:34:14 +08:00
self.logger.info(f'\n{self.as_markdown()}')
2023-05-14 20:23:20 +08:00
def setup(self) -> None:
self.client = client.Client(game=self, net_mode='local')
self.server = server.Server(net_mode='local')
def init(self, **kwargs) -> bool:
2023-06-22 13:34:14 +08:00
self.logger = logging.getLogger('main')
2023-05-14 20:23:20 +08:00
self.load_file()
self.setup()
self.log_env()
return True
def load_file(self) -> bool:
"""加载文件"""
self.init_mods()
2023-05-14 20:23:20 +08:00
self.init_console()
return True