diff --git a/src/core/Client.py b/src/core/Client.py index c4fcb89..6ca5ac8 100644 --- a/src/core/Client.py +++ b/src/core/Client.py @@ -434,10 +434,8 @@ class Client: lua_data = ev.call_lua_event("onVehicleSpawn", self.cid, car_id, car_data[car_data.find("{"):]) if 1 in lua_data: allow = False - ev_data_list = ev.call_event("onCarSpawn", data=car_json, car_id=car_id, player=self) - d2 = await ev.call_async_event("onCarSpawn", data=car_json, car_id=car_id, player=self) - ev_data_list.extend(d2) - for ev_data in ev_data_list: + event_data = await ev.call_as_events("onCarSpawn", data=car_json, car_id=car_id, player=self) + for ev_data in event_data: self.log.debug(ev_data) # TODO: handle event onCarSpawn pass @@ -464,6 +462,9 @@ class Client: "pos": {} } await self._send(pkt, to_all=True, to_self=True) + if self.focus_car == -1: + self._focus_car = car_id + await ev.call_as_events("onCarSpawned", data=car_json, car_id=car_id, player=self) else: await self._send(pkt) des = f"Od:{self.cid}-{car_id}" @@ -482,13 +483,9 @@ class Client: if car_id != -1 and self._cars[car_id]: - ev.call_lua_event("onVehicleDeleted", self.cid, car_id) - admin_allow = False # Delete from admin, for example... - ev_data_list = ev.call_event("onCarDelete", data=self._cars[car_id], car_id=car_id, player=self) - d2 = await ev.call_async_event("onCarDelete", data=self._cars[car_id], car_id=car_id, player=self) - ev_data_list.extend(d2) - for ev_data in ev_data_list: + event_data = await ev.call_as_events("onCarDelete", data=self._cars[car_id], car_id=car_id, player=self) + for ev_data in event_data: self.log.debug(ev_data) # TODO: handle event onCarDelete pass @@ -503,8 +500,9 @@ class Client: self._cars[unicycle_id] = None self._cars[car_id] = None await self._send(f"Od:{self.cid}-{car_id}", to_all=True, to_self=True) + await ev.call_as_events("onCarDeleted", data=self._cars[car_id], car_id=car_id, player=self) + ev.call_lua_event("onVehicleDeleted", self.cid, car_id) self.log.debug(f"Deleted car: car_id={car_id}") - else: self.log.debug(f"Invalid car: car_id={car_id}") @@ -660,26 +658,23 @@ class Client: writer = None to_all = True to_self = True - message = msg - if event is False: - need_send = False - continue - if isinstance(event, str): - to_all = False - message = event - elif isinstance(event, int): - if event == 0: + message = f"{self.nick}: {msg}" + match event: + case False | 0: need_send = False continue - else: - message = event["message"] - to_all = event.get("to_all") - to_self = event.get("to_self") - to_client = event.get("to") - if to_client: - writer = to_client._writer + case {"message": message, **setting}: + message = message + to_all = setting.get("to_all", True) + to_self = setting.get("to_self", True) + to_client = setting.get("to") + if to_client: + writer = to_client._writer + case _: + self.log.error(f"[onChatReceive] Bad data returned from event: {event}") + if config.Options['log_chat']: - self.log.info(f"[local] {message}" if to_all else f"{self.nick}: {msg}") + self.log.info(f"[local] {message}" if not to_all else message) await self._send(f"C:{message}", to_all=to_all, to_self=to_self, writer=writer) need_send = False except KeyError: @@ -695,13 +690,16 @@ class Client: if data is None: self.__alive = False return + if len(data) == 0: + self.__alive = False + return _bytes = False try: data = data.decode() except UnicodeDecodeError: _bytes = True - self.log.error(f"UnicodeDecodeError: {data}") + self.log.error("UnicodeDecodeError") if data[0] in ['V', 'W', 'Y', 'E', 'N']: await self._send(data, to_all=True, to_self=False) diff --git a/src/core/__init__.py b/src/core/__init__.py index 133e01b..211c0dc 100644 --- a/src/core/__init__.py +++ b/src/core/__init__.py @@ -10,7 +10,7 @@ __title__ = 'KuiToi-Server' __description__ = 'BeamingDrive Multiplayer server compatible with BeamMP clients.' __url__ = 'https://github.com/kuitoi/kuitoi-Server' __version__ = '0.4.8' -__build__ = 2676 # Я это считаю лог файлами +__build__ = 2679 # Я это считаю лог файлами __author__ = 'SantaSpeen' __author_email__ = 'admin@anidev.ru' __license__ = "FPA" diff --git a/src/core/core.py b/src/core/core.py index c5746f7..209da2f 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -18,7 +18,7 @@ from core import utils, __version__ from core.Client import Client from core.tcp_server import TCPServer from core.udp_server import UDPServer -from modules import PluginsLoader +from modules import PluginsLoader, PermsSystem def calc_ticks(ticks, duration): @@ -253,7 +253,7 @@ class Core: except Exception as e: self.log.error(f"Error in heartbeat: {e}") - async def kick_cmd(self, args): + async def _cmd_kick(self, args): if not len(args) > 0: return "Usage: kick |: [reason]\nExamples:\n\tkick admin bad boy\n\tkick :0 bad boy" reason = "kicked by console." @@ -295,7 +295,7 @@ class Core: tps = calc_ticks(ticks, d) half = self.target_tps // 2 qw = self.target_tps // 4 - if tps > half+qw: + if tps > half + qw: return f"{tps:.2f}" elif tps > half: return f"{tps:.2f}" @@ -324,7 +324,7 @@ class Core: ticks_60s = deque(maxlen=60 * int(target_tps) + 1) console.add_command("tps", lambda _: self._cmd_tps(ticks_2s, ticks_5s, ticks_30s, ticks_60s), None, "Print TPS", {"tps": None}) - _add_to_sleep = deque([0.0, 0.0, 0.0,], maxlen=3 * int(target_tps)) + _add_to_sleep = deque([0.0, 0.0, 0.0, ], maxlen=3 * int(target_tps)) # _t0 = [] self.log.debug("tick system started") @@ -372,19 +372,26 @@ class Core: except Exception as e: self.log.exception(e) + async def _parse_chat(self, event): + player = event['kwargs']['player'] + message = event['kwargs']['message'] + async def main(self): self.tcp = self.tcp(self, self.server_ip, self.server_port) self.udp = self.udp(self, self.server_ip, self.server_port) + PermsSystem() console.add_command( "list", lambda x: f"Players list: {self.get_clients_list(True)}" ) - console.add_command("kick", self.kick_cmd, "kick - Kick user\n" - "Usage: kick NICK|:{ID} [REASON]\n" - "Examples:\n" - " > kick admin bad boy\n" - " > kick :0 bad boy", + ev.call_event("add_perm_to_alias", "cmd.kick") + console.add_command("kick", self._cmd_kick, "kick - Kick user\n" + "Usage: kick NICK|:{ID} [REASON]\n" + "Examples:\n" + " > kick admin bad boy\n" + " > kick :0 bad boy", "kick user", {"kick": ""}) + ev.register("onChatReceive", self._parse_chat) pl_dir = "plugins" self.log.debug("Initializing PluginsLoaders...") @@ -414,18 +421,19 @@ class Core: self.log.info(i18n.core_mods_loaded.format(len_mods, round(self.mods_list[0] / MB, 2))) self.log.info(i18n.init_ok) - await self.heartbeat(True) - for i in range(int(config.Game["players"] * 4)): # * 4 For down sock and buffer. - self.clients.append(None) + await self.heartbeat(True) # Check + + self.clients = [None] * config.Game["players"] * 4 # * 4 For down sock and buffer. tasks = [] ev.register("serverTick_1s", self._check_alive) ev.register("serverTick_1s", self._send_online) # ev.register("serverTick_5s", self.heartbeat) f_tasks = [self.tcp.start, self.udp._start, console.start, self._tick, self.heartbeat] if config.RCON['enabled']: - console.rcon.version = f"KuiToi {__version__}" - rcon = console.rcon(config.RCON['password'], config.RCON['server_ip'], config.RCON['server_port']) - f_tasks.append(rcon.start) + self.log.warning("RCON not available. yet.") + # console.rcon.version = f"KuiToi {__version__}" + # rcon = console.rcon(config.RCON['password'], config.RCON['server_ip'], config.RCON['server_port']) + # f_tasks.append(rcon.start) for task in f_tasks: tasks.append(asyncio.create_task(task())) t = asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION) diff --git a/src/core/core.pyi b/src/core/core.pyi index bcca1fc..bf897b4 100644 --- a/src/core/core.pyi +++ b/src/core/core.pyi @@ -53,7 +53,8 @@ class Core: async def _cmd_tps(self, ticks_2s, ticks_5s, ticks_30s, ticks_60s) -> str: ... def _tick(self) -> None: ... async def heartbeat(self, test=False) -> None: ... - async def kick_cmd(self, args: list) -> None | str: ... + async def _cmd_kick(self, args: list) -> None | str: ... + async def _parse_chat(self, event): ... async def main(self) -> None: ... def start(self) -> None: ... async def stop(self) -> None: ...