aboutsummaryrefslogtreecommitdiff
path: root/lib/PacketManager
diff options
context:
space:
mode:
authorSkipper <[email protected]>2025-02-10 12:47:24 +0000
committerSkipper <[email protected]>2025-02-10 12:47:24 +0000
commit079a638c619e516908ec8d86fc311d9af499a4ae (patch)
treeefda905ca28d71093c6a6b1c0907037645816a27 /lib/PacketManager
parent313338fc498c089da5860ba6b5b0673be848c45b (diff)
Some updates to packets
Various updates, added smoke function to airplanestate, which modifies the incoming packet to make the client smoke, needs to be taken with WEAPONCONFIG.addSmoke Added in placeholder classes for Player and Aircraft
Diffstat (limited to 'lib/PacketManager')
-rw-r--r--lib/PacketManager/PacketManager.py4
-rw-r--r--lib/PacketManager/packets/FSNETCMD_AIRPLANESTATE.py55
-rw-r--r--lib/PacketManager/packets/FSNETCMD_MISSILELAUNCH.py57
-rw-r--r--lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py2
-rw-r--r--lib/PacketManager/packets/FSNETCMD_WEAPONCONFIG.py2
5 files changed, 95 insertions, 25 deletions
diff --git a/lib/PacketManager/PacketManager.py b/lib/PacketManager/PacketManager.py
index f019369..489b46a 100644
--- a/lib/PacketManager/PacketManager.py
+++ b/lib/PacketManager/PacketManager.py
@@ -1,5 +1,5 @@
from struct import unpack, pack
-from PacketManager.packets import MESSAGE_TYPES, FSWEAPON_DICT, GUIDEDWEAPONS
+from lib.PacketManager.packets.constants import MESSAGE_TYPES, FSWEAPON_DICT, GUIDEDWEAPONS
class PacketManager:
@@ -9,4 +9,6 @@ class PacketManager:
def get_packet_type(self, data: bytes):
#Returns the message type of that packet.
+ if len(data) < 4:
+ return None
return MESSAGE_TYPES[unpack("<I", data[:4])[0]] \ No newline at end of file
diff --git a/lib/PacketManager/packets/FSNETCMD_AIRPLANESTATE.py b/lib/PacketManager/packets/FSNETCMD_AIRPLANESTATE.py
index 7a1bf53..071db5e 100644
--- a/lib/PacketManager/packets/FSNETCMD_AIRPLANESTATE.py
+++ b/lib/PacketManager/packets/FSNETCMD_AIRPLANESTATE.py
@@ -70,12 +70,15 @@ class FSNETCMD_AIRPLANESTATE: #11
if self.packet_version == 4 or self.packet_version == 5:
self.position = list(unpack("fff", self.buffer[14:26]))
- self.atti = list(map(lambda x: x / (pi / 32768.0),
- unpack("hhh", self.buffer[26:32])))
+ # self.atti = list(unpack("HHH", self.buffer[26:32]))
+ self.atti = list(map(lambda x: x * (pi / 32768.0),
+ unpack("HHH", self.buffer[26:32])))
+ print(self.atti)
+
self.velocity = list(map(lambda x: x/10,
- unpack("hhh", self.buffer[32:38])))
- self.atti_velocity = list(map(lambda x: x / (pi / 32768.0),
- unpack("hhh", self.buffer[38:44])))
+ unpack("HHH", self.buffer[32:38])))
+ self.atti_velocity = list(map(lambda x: x * (pi / 32768.0),
+ unpack("HHH", self.buffer[38:44])))
self.smoke_oil = unpack("h", self.buffer[44:46])[0]
self.fuel = unpack("I", self.buffer[46:50])[0]
@@ -97,12 +100,13 @@ class FSNETCMD_AIRPLANESTATE: #11
self.flags["ab"] = bool(flags & 1) # Last bit
self.flags["firing"] = bool(flags &8)
self.flags["smoke"] = 0
-
if flags & 2:
+
self.flags["smoke"] = (flags >> 8) & 255 # bitshift 8 to the right,
#then mask with 255
if self.flags["smoke"] == 0:
self.flags["smoke"] = 255 # Need to review what this actuall does!
+
if flags & 16:
self.flags["beacon"] = True
if flags & 32:
@@ -133,14 +137,15 @@ class FSNETCMD_AIRPLANESTATE: #11
else:
self.position = list(unpack("fff", self.buffer[16:28]))
- self.atti = list(map(lambda x: x / (pi / 32768.0),
- unpack("hhh", self.buffer[28:34])))
+ self.atti = list(map(lambda x: x * (pi / 32768.0),
+ unpack("HHH", self.buffer[28:34])))
+
self.velocity = list(map(lambda x: x/10,
- unpack("hhh", self.buffer[34:40])))
+ unpack("HHH", self.buffer[34:40])))
self.atti_velocity = list(map(lambda x: x / (pi / 32768.0),
- unpack("hhh", self.buffer[40:46])))
+ unpack("HHH", self.buffer[40:46])))
self.g_value = unpack("h", self.buffer[46:48])[0]/100.0
self.gun_ammo, self.aam, self.agm, self.bomb, self.smoke_oil = unpack("hhhhh", self.buffer[48:58])
@@ -183,6 +188,36 @@ class FSNETCMD_AIRPLANESTATE: #11
self.thrust_vector["reverser"] = unpack("B", self.buffer[96:97])[0]/255.0
self.bomb_bay_info = unpack("B", self.buffer[97:98])[0]/255.0
+ def smoke(self):
+ if self.packet_version == 4 or self.packet_version == 5:
+ flag = unpack('h',self.buffer[56:58])[0]
+ flag &= ~((1<<8)|2)
+ flag |= (1<<8) |2
+ flag |= (1<<9)
+ flag |= (1<<10)
+ packet = self.buffer[:56] + pack('h',flag) + self.buffer[58:]
+ return pack('I',len(packet)) + packet
+ else:
+ flag = unpack('h',self.buffer[74:75])[0]
+
+ flag &= ~((255<<8)|2)
+ flag |= (255<<8) | 2
+ print(flag)
+ packet = self.buffer[:74] + pack('h',flag) + self.buffer[76:]
+ return pack('I',len(packet)) + packet
+
+ def stop_firing(self):
+ if self.packet_version == 4 or self.packet_version == 5:
+ flag = unpack('h',self.buffer[56:58])[0]
+ flag &= ~(8)
+ packet = self.buffer[:56] + pack('h',flag) + self.buffer[58:]
+ return pack('I',len(packet)) + packet
+ else:
+ flag = unpack('h',self.buffer[74:75])[0]
+ flag &= ~(8)
+ packet = self.buffer[:74] + pack('h',flag) + self.buffer[76:]
+ return pack('I',len(packet)) + packet
+
@staticmethod
def get_life(buffer:bytes):
version = unpack("h", buffer[12:14])[0]
diff --git a/lib/PacketManager/packets/FSNETCMD_MISSILELAUNCH.py b/lib/PacketManager/packets/FSNETCMD_MISSILELAUNCH.py
index 4059773..ad03128 100644
--- a/lib/PacketManager/packets/FSNETCMD_MISSILELAUNCH.py
+++ b/lib/PacketManager/packets/FSNETCMD_MISSILELAUNCH.py
@@ -1,5 +1,8 @@
from struct import pack, unpack
from .constants import FSWEAPON_DICT, GUIDEDWEAPONS
+from lib.Aircraft import Aircraft
+from math import pi
+import random
class FSNETCMD_MISSILELAUNCH: #20
"""
@@ -24,33 +27,52 @@ class FSNETCMD_MISSILELAUNCH: #20
self.decode()
def decode(self):
+ print(self.buffer)
+ # _ = unpack("I", self.buffer[:4])[0] #Packet type
+ # IH # 6
+ # fff # 12
+ # fff # 12
+ # ffH #10
+ # II # 8
self.weapon_type = unpack("H", self.buffer[4:6])[0]
self.position = list(unpack("fff", self.buffer[6:18]))
self.atti = list(unpack("fff", self.buffer[18:30]))
- self.velocity, self.life_remaining, self.power = unpack("ffH", self.buffer[30:38])
- self.fired_by_aircraft = bool(unpack("I", self.buffer[38:42])[0])
- self.fired_by = unpack("I", self.buffer[42:46])[0]
+ self.velocity, self.life_remaining, self.power = unpack("ffH", self.buffer[30:40])
+ self.fired_by_aircraft = unpack("I", self.buffer[40:44])[0]
+ self.fired_by = unpack("I", self.buffer[44:48])[0]
if self.weapon_type in FSWEAPON_DICT:
self.weapon_type = FSWEAPON_DICT[self.weapon_type]
if self.weapon_type in GUIDEDWEAPONS:
- self.v_max, self.mobility, self.radar = unpack("fff", self.buffer[46:58])
- self.fired_at_aircraft = bool(unpack("I", self.buffer[58:62])[0])
- self.fired_at = unpack("I", self.buffer[62:66])[0]
+ self.v_max, self.mobility, self.radar = unpack("fff", self.buffer[48:60])
+ self.fired_at_aircraft = bool(unpack("I", self.buffer[60:64])[0])
+ self.fired_at = unpack("I", self.buffer[64:68])[0]
elif self.weapon_type == "FSWEAPON_FLARE":
- self.v_max = unpack("f", self.buffer[46:50])[0]
+ self.v_max = unpack("f", self.buffer[48:52])[0]
+
+
@staticmethod
def encode(weapon_type, position, atti, velocity, life_remaining, power,
- fired_by_aircraft, fired_by, v_max=None, mobility=None,
- radar=None, fired_at_aircraft=None, fired_at=None, with_size:bool=False):
+ fired_by_aircraft, fired_by, v_max=1000, mobility=0,
+ radar=0, fired_at_aircraft=False, fired_at=0, with_size:bool=False):
if weapon_type in FSWEAPON_DICT and isinstance(weapon_type,int):
weapon_type_name = FSWEAPON_DICT[weapon_type]
else:
weapon_type_name = weapon_type
weapon_type = list(FSWEAPON_DICT.keys())[list(FSWEAPON_DICT.values()).index(weapon_type)]
- buffer = pack("I",20)+pack("Hfff", weapon_type, *position)+pack("fff", *atti)+pack("ffH", velocity, life_remaining, power)
- buffer += pack("I",fired_by_aircraft)+pack("I",fired_by)
+ buffer = pack("I",20) #Packet type 0:4
+
+ buffer += pack("H", weapon_type) #Weapon type 4:6
+ buffer += pack("f", position[0]) #6:10
+ buffer += pack("f", position[1]) #10:14
+ buffer += pack("f", position[2]) #Position #14:18
+ buffer += pack("f", atti[0]) #18:22
+ buffer += pack("f", atti[1]) #22:26
+ buffer += pack("f", atti[2]) #Attitude #26:30
+ buffer += pack("ffH", velocity, life_remaining, power) #Velocity, life remaining, power #30:40
+ buffer += pack("II",fired_by_aircraft,fired_by) #Fired by aircraft, fired by #40:48
+ print(buffer)
if weapon_type_name in GUIDEDWEAPONS:
buffer += pack("fff", v_max, mobility, radar)
if isinstance(fired_at_aircraft, bool):
@@ -61,4 +83,15 @@ class FSNETCMD_MISSILELAUNCH: #20
if with_size:
return pack("I",len(buffer))+buffer
- return buffer \ No newline at end of file
+ return buffer
+
+ @staticmethod
+ def drop_bombs(aircraft:Aircraft):
+ position = aircraft.position
+ atti = aircraft.attitude
+ # atti = [(value*(32768/ pi)) for value in atti]
+ atti[2] =0
+ weapon_type = random.randint(0,13)
+ packet = FSNETCMD_MISSILELAUNCH.encode(weapon_type, position=position, atti=atti, velocity=20, life_remaining=30000, power=999, fired_by_aircraft=0, fired_by=aircraft.id, v_max=1000, with_size=True)
+ print(packet)
+ return packet \ No newline at end of file
diff --git a/lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py b/lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py
index 4ff987d..f524b9f 100644
--- a/lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py
+++ b/lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py
@@ -18,7 +18,7 @@ class FSNETCMD_TEXTMESSAGE: #32
@staticmethod
def encode(message:str, with_size:bool=False):
- buffer = pack("I",32)+message.encode("utf-8")+b"\x00"
+ buffer = pack("III",32,0,0)+message.encode("utf-8")+b"\x00"
if with_size:
return pack("I",len(buffer))+buffer
return buffer
diff --git a/lib/PacketManager/packets/FSNETCMD_WEAPONCONFIG.py b/lib/PacketManager/packets/FSNETCMD_WEAPONCONFIG.py
index b6acf82..aa4876b 100644
--- a/lib/PacketManager/packets/FSNETCMD_WEAPONCONFIG.py
+++ b/lib/PacketManager/packets/FSNETCMD_WEAPONCONFIG.py
@@ -52,4 +52,4 @@ class FSNETCMD_WEAPONCONFIG:
@staticmethod
def addSmoke(aircraft_id:int):
- return FSNETCMD_WEAPONCONFIG.encode(aircraft_id, {32:[66,66,66]}, True)
+ return FSNETCMD_WEAPONCONFIG.encode(aircraft_id, {32:[66,66,66],33:[66,66,66],34:[66,66,66]}, True)