From 17ad19c30478bb9361cb872d4e9bd4cd424edf49 Mon Sep 17 00:00:00 2001 From: Skipper Date: Fri, 14 Feb 2025 21:47:55 +0000 Subject: Added custom aircraft list plugin --- lib/PacketManager/packets/FSNETCMD_LIST.py | 70 ++++++++++++++++++++++++++++++ lib/PacketManager/packets/__init__.py | 4 +- 2 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 lib/PacketManager/packets/FSNETCMD_LIST.py (limited to 'lib/PacketManager') diff --git a/lib/PacketManager/packets/FSNETCMD_LIST.py b/lib/PacketManager/packets/FSNETCMD_LIST.py new file mode 100644 index 0000000..d6cb83c --- /dev/null +++ b/lib/PacketManager/packets/FSNETCMD_LIST.py @@ -0,0 +1,70 @@ +from struct import unpack, pack +class FSNETCMD_LIST: #44 + def __init__(self, buffer:bytes, should_decode:bool=True): + self.buffer = buffer + self.list_type = None + self.num_of_items = 0 + self.list = [] + if should_decode: + self.decode() + + def decode(self): + packet_type = unpack('I', self.buffer[:4])[0] + self.list_type = unpack('B', self.buffer[4:5])[0] + self.num_of_items = unpack('B', self.buffer[5:6])[0] + #Then there is a spacer. + _ = unpack('BB', self.buffer[6:8]) + self.list = self.buffer[8:].split(b'\x00')[:-1] + + @staticmethod + def encode(list_type:int=1, list_buffer:bytes=b'', num_of_items:int=0, with_size:bool=False): + #Max length of the packet is 1024 bytes. + # 8+1 bytes for the header, leaving 1015 bytes for the list. + buffer = pack('IBBBB', 44, list_type, num_of_items, 0, 0) + buffer += list_buffer + if with_size: + return pack("I", len(buffer)) + buffer + return buffer + + +class List_Constructor: + """Takes a list of aircraft, and constructes a list of FSNETCMD_LIST packets for sending. + If sending custom lists to clients, the client FSNETCMD_LIST reply must be blocked from the server + and the server FSNETCMD_LIST command must also be blocked. + """ + def __init__(self, aircraftList:list, with_size:bool=True): + self.aircraftList = aircraftList + self.packet_list = [] + self.num_of_packets = 0 + self.with_size = with_size + self.construct_packets() + + def construct_packets(self): + packet = b'' + packet_length = 0 + for aircraft in self.aircraftList: + aircraft = aircraft.replace(' ', '_') + aircraft = aircraft.encode() + b'\x00' + if self.check_fit(packet, aircraft) and packet_length<32: + packet += aircraft + packet_length += 1 + else: + packet = FSNETCMD_LIST.encode(1,packet, packet_length,self.with_size) + self.packet_list.append(packet) + packet = b'' + packet += aircraft + self.num_of_packets += 1 + packet_length = 1 + #Append whatever is left over. + if len(packet) > 0: + packet = FSNETCMD_LIST.encode(1,packet, packet_length,self.with_size) + self.packet_list.append(packet) + self.num_of_packets += 1 + + def check_fit(self, packet, aircraft): + if len(packet) + len(aircraft) + 1 > 1015: + return False + return True + + def get_packets(self): + return self.packet_list diff --git a/lib/PacketManager/packets/__init__.py b/lib/PacketManager/packets/__init__.py index 250be0d..1139ab5 100644 --- a/lib/PacketManager/packets/__init__.py +++ b/lib/PacketManager/packets/__init__.py @@ -41,7 +41,7 @@ from .FSNETCMD_WEAPONCONFIG import FSNETCMD_WEAPONCONFIG #from .FSNETCMD_CTRLSHOWUSERNAME import FSNETCMD_CTRLSHOWUSERNAME #from .FSNETCMD_CONFIRMEXISTENCE import FSNETCMD_CONFIRMEXISTENCE #from .FSNETCMD_CONFIGSTRING import FSNETCMD_CONFIGSTRING -#from .FSNETCMD_LIST import FSNETCMD_LIST +from .FSNETCMD_LIST import FSNETCMD_LIST, List_Constructor #from .FSNETCMD_GNDCMD import FSNETCMD_GNDCMD #from .FSNETCMD_REPORTSCORE import FSNETCMD_REPORTSCORE #from .FSNETCMD_SERVER_FORCE_JOIN import FSNETCMD_SERVER_FORCE_JOIN @@ -64,4 +64,4 @@ __all__ = ["FSNETCMD_LOGON", "FSNETCMD_LOGOFF", "FSNETCMD_ERROR", "FSNETCMD_MISSILELAUNCH", "FSNETCMD_GETDAMAGE", "FSNETCMD_WEAPONCONFIG", "FSNETCMD_AIRCMD", "FSNETCMD_TEXTMESSAGE", "FSNETCMD_ENVIRONMENT", - "FSNETCMD_SKYCOLOR", "FSNETCMD_FOGCOLOR"] + "FSNETCMD_SKYCOLOR", "FSNETCMD_FOGCOLOR", "FSNETCMD_LIST", "List_Constructor"] -- cgit v1.2.3