diff options
| -rw-r--r-- | lib/PacketManager/packets/FSNETCMD_JOINREQUEST.py | 4 | ||||
| -rw-r--r-- | lib/Player.py | 1 | ||||
| -rw-r--r-- | plugins/refuel.py | 45 | ||||
| -rw-r--r-- | proxy.py | 3 |
4 files changed, 33 insertions, 20 deletions
diff --git a/lib/PacketManager/packets/FSNETCMD_JOINREQUEST.py b/lib/PacketManager/packets/FSNETCMD_JOINREQUEST.py index 7796599..f24c94a 100644 --- a/lib/PacketManager/packets/FSNETCMD_JOINREQUEST.py +++ b/lib/PacketManager/packets/FSNETCMD_JOINREQUEST.py @@ -7,7 +7,7 @@ class FSNETCMD_JOINREQUEST: #8 """ def __init__(self, buffer:bytes, should_decode:bool=True): self.buffer = buffer - self.iff = None + self.iff = 0 # The IFF sent is 1 subtracted from the selected value by the player self.aircraft = None self.start_pos = None #It's the STP name self.fuel = None @@ -26,4 +26,4 @@ class FSNETCMD_JOINREQUEST: #8 start_pos.encode(), 1, fuel, smoke) if with_size: return pack("I",len(buffer))+buffer - return buffer
\ No newline at end of file + return buffer diff --git a/lib/Player.py b/lib/Player.py index 7f54914..1d39a56 100644 --- a/lib/Player.py +++ b/lib/Player.py @@ -12,6 +12,7 @@ class Player: self.ip = "" self.streamWriterObject = streamWriterObject self.is_a_bot = True # We check if they are still present after LOGIN packet, then they're not a bot + self.iff = 0 def set_aircraft(self, aircraft:Aircraft): self.aircraft = aircraft diff --git a/plugins/refuel.py b/plugins/refuel.py index 1b33031..12af66a 100644 --- a/plugins/refuel.py +++ b/plugins/refuel.py @@ -23,6 +23,7 @@ class Plugin: self.plugin_manager.register_command('refuel', self.refuel) self.plugin_manager.register_command('refueler', self.refueler) self.plugin_manager.register_hook('on_flight_data', self.on_flight_data) + self.plugin_manager.register_hook('on_unjoin', self.on_unjoin) def refueler(self, full_message, player, message_to_client, message_to_server): if player in refueling: @@ -32,7 +33,7 @@ class Plugin: a = YSchat.message("You are no more refueling!") refuelers.pop(player) else: - a = YSchat.message(f"You are now refueling other players! To refuel the plane must be within {REFUEL_RADIUS}m") + a = YSchat.message(f"You are now refueling other players! To refuel the plane must be within {REFUEL_RADIUS}m and have same IFF") refuelers[player] = [0, [], False] message_to_client.append(a) @@ -46,7 +47,7 @@ class Plugin: a = YSchat.message("You are no more refueling!") refueling.pop(player) else: - a = YSchat.message(f"You can now be refueled by other players! To refuel the plane must be within {REFUEL_RADIUS}m") + a = YSchat.message(f"You can now be refueled by other players! To refuel the plane must be within {REFUEL_RADIUS}m and have same IFF") refueling[player] = [0, []] message_to_client.append(a) @@ -54,23 +55,24 @@ class Plugin: decode = FSNETCMD_AIRPLANESTATE(data) if player in refueling: for refueler in refuelers: - refueling[player] = [decode.fuel, decode.position] - if self.in_range(refuelers[refueler][1], decode.position): - refuelers[refueler][2] = True - max_lim = int((player.aircraft.initial_config['WEIGFUEL'])[:-2]) - if decode.fuel < max_lim: - a = FSNETCMD_AIRCMD.set_command(player.aircraft.id, "INITFUEL", f"{decode.fuel+FUEL_RATE}kg", True) - message_to_client.append(a) - elif decode.fuel >= max_lim: - a = YSchat.message("The plane is full!") - refuelers[refueler][2] = False # No longer refueling - message_to_client.append(a) + if refueler.iff == player.iff: + refueling[player] = [decode.fuel, decode.position] + if self.in_range(refuelers[refueler][1], decode.position): + refuelers[refueler][2] = True + max_lim = int((player.aircraft.initial_config['WEIGFUEL'])[:-2]) + if decode.fuel < max_lim: + a = FSNETCMD_AIRCMD.set_command(player.aircraft.id, "INITFUEL", f"{decode.fuel+FUEL_RATE}kg", True) + message_to_client.append(a) + elif decode.fuel >= max_lim: + a = YSchat.message("The plane is full!") + refuelers[refueler][2] = False # No longer refueling + message_to_client.append(a) - if refuelers[refueler][0] < FUEL_RATE: - a = YSchat.message("The refueler ran out of fuel!") - message_to_client.append(a) - else: - refuelers[refueler][2] = False # No longer refueling + if refuelers[refueler][0] < FUEL_RATE: + a = YSchat.message("The refueler ran out of fuel!") + message_to_client.append(a) + else: + refuelers[refueler][2] = False # No longer refueling elif player in refuelers: @@ -80,6 +82,13 @@ class Plugin: message_to_client.append(a) return True + def on_unjoin(self, data, player, message_to_client, message_to_server): + if player in refuelers: + refuelers.pop(player) + elif player in refueling: + refueling.pop(player) + return True + @staticmethod def in_range(refueler_cord:list, refueled_cord:list): # the plane to be refueled must be below and behind the @@ -130,6 +130,9 @@ async def handle_client(client_reader, client_writer): writer.write(data) continue + elif packet_type == "FSNETCMD_JOINREQUEST": + player.iff = FSNETCMD_JOINREQUEST(packet).iff + 1 + elif packet_type == "FSNETCMD_AIRPLANESTATE": player.aircraft.add_state(FSNETCMD_AIRPLANESTATE(packet)) #TODO: Do we want to convert all this to plugins? Probably not, but there is duplicated functionality # keep_message = plugin_manager.triggar_hook('on_flight_data', packet, player, message_to_client, message_to_server) |
