summaryrefslogtreecommitdiff
path: root/lib/PacketManager/packets
diff options
context:
space:
mode:
authorSkipper <[email protected]>2025-02-14 21:47:55 +0000
committerSkipper <[email protected]>2025-02-14 21:47:55 +0000
commit17ad19c30478bb9361cb872d4e9bd4cd424edf49 (patch)
tree2825197d40c3f1788322661887425b501a2898e7 /lib/PacketManager/packets
parentf664470829ea834de36194a311f08f691005ee01 (diff)
Added custom aircraft list plugin
Diffstat (limited to 'lib/PacketManager/packets')
-rw-r--r--lib/PacketManager/packets/FSNETCMD_LIST.py70
-rw-r--r--lib/PacketManager/packets/__init__.py4
2 files changed, 72 insertions, 2 deletions
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"]