From d2bd9599c29f9d77a14a7381a2046585f701d4c6 Mon Sep 17 00:00:00 2001 From: Ritabrata Das Date: Mon, 17 Feb 2025 20:52:38 +0530 Subject: Add midair refueling plugin --- plugins/refuel.py | 72 +++++++++++++++++++++++++++++++++++++++ plugins/smoke_on_damage/Plugin.py | 2 +- proxy.py | 5 +++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 plugins/refuel.py diff --git a/plugins/refuel.py b/plugins/refuel.py new file mode 100644 index 0000000..e171953 --- /dev/null +++ b/plugins/refuel.py @@ -0,0 +1,72 @@ +""" +This plugin enables you to perform air to air refueling. +""" +import math +from lib.PacketManager.packets import FSNETCMD_AIRCMD, FSNETCMD_AIRPLANESTATE + +ENABLED = True +REFUEL_RADIUS = 100 # in meters + +refuelers = {} +refueling = {} + +class Plugin: + def __init__(self): + def __init__(self): + self.plugin_manager = None + + def register(self, plugin_manager): + self.plugin_manager = plugin_manager + self.plugin_manager.register_command('refuel', self.refuel) + self.plugin_manager.register_command('k', self.refueler) + self.plugin_manager.register_hook('on_flight_data', self.on_flight_data) + + def refueler(self, full_message, player, message_to_client, message_to_server): + if player in refuelers: + refuelers.pop(player) + else: + refuelers[player] = [0, [], False] + + def refuel(self, full_message, player, message_to_client, message_to_server): + #a = FSNETCMD_AIRCMD.set_command(player.aircraft.id, "INITFUEL", "3750kg", True) + #message_to_client.append(a) + #print(player in refueling) + if player in refueling: + refueling.pop(player) + else: + refueling[player] = [0, []] + + def on_flight_data(self, data, player, message_to_client, message_to_server): + decode = FSNETCMD_AIRPLANESTATE(data) + if player in refueling: + for player in refuelers: + refueling[player] = [decode.fuel, decode.position] + if self.in_range(refuelers[player][1], decode.position): + print("here!") + refuelers[player][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+100}kg", True) + message_to_client.append(a) + else: + refuelers[player][2] = False + + + elif player in refuelers: + refuelers[player] = [decode.fuel, decode.position, refuelers[player][2]] + if decode.fuel-100 > 0 and refuelers[player][2]: + a = FSNETCMD_AIRCMD.set_command(player.aircraft.id, "INITFUEL", f"{decode.fuel-5}kg", True) + message_to_client.append(a) + + @staticmethod + def in_range(refueler_cord:list, refueled_cord:list): + # the plane to be refueled must be below and behind the + # refueler plane, ysf sends cords in list[x, y, z] + # implement this later + # for now we just use distance formula in a 3d space + dist = math.sqrt((refueler_cord[0]-refueled_cord[0])**2 + (refueler_cord[1]-refueled_cord[1])**2 + (refueler_cord[2]-refueled_cord[2])**2) + print(dist) + if dist < REFUEL_RADIUS: + return True + else: + return False diff --git a/plugins/smoke_on_damage/Plugin.py b/plugins/smoke_on_damage/Plugin.py index 08c184b..12effc8 100644 --- a/plugins/smoke_on_damage/Plugin.py +++ b/plugins/smoke_on_damage/Plugin.py @@ -1,4 +1,4 @@ -"""TThis plugin will cause the aircraft to emit smoke if it's health is below a certain threshold. +"""This plugin will cause the aircraft to emit smoke if it's health is below a certain threshold. It is also an example of a plugin as a folder/module. This can be used as a basis for more complex plugins that may need multiple files.""" from lib.PacketManager.packets import FSNETCMD_AIRCMD, FSNETCMD_AIRPLANESTATE, FSNETCMD_TEXTMESSAGE diff --git a/proxy.py b/proxy.py index 9e0566f..37af393 100644 --- a/proxy.py +++ b/proxy.py @@ -117,6 +117,8 @@ async def handle_client(client_reader, client_writer): try: + if packet_type == "FSNETCMD_AIRCMD": + print(FSNETCMD_AIRCMD.decode(packet)) if packet_type == "FSNETCMD_LOGON": # keep_message = plugin_manager.triggar_hook('on_login', packet, player, message_to_client, message_to_server) @@ -186,6 +188,9 @@ async def handle_client(client_reader, client_writer): debug("S2C" + str(packet_type)) debug(data) + #if packet_type == "FSNETCMD_AIRCMD": + # print(FSNETCMD_AIRCMD.decode(packet)) + keep_message = triggerRespectiveHookServer(packet_type, packet, player, message_to_client, message_to_server, plugin_manager) if not keep_message: data = None -- cgit v1.2.3 From 412d75439934201968a701abc043abc63f802dba Mon Sep 17 00:00:00 2001 From: Ritabrata Das Date: Wed, 19 Feb 2025 21:40:54 +0530 Subject: Fix critical bug in smoke plugin --- lib/plugin_manager.py | 7 +++++-- plugins/over_g_damage.py | 2 +- plugins/refuel.py | 4 ++++ plugins/smoke_on_damage/Plugin.py | 4 +++- proxy.py | 3 --- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/plugin_manager.py b/lib/plugin_manager.py index ae4cf0b..07e28e6 100644 --- a/lib/plugin_manager.py +++ b/lib/plugin_manager.py @@ -62,8 +62,11 @@ class PluginManager: if hook_name in self.hooks: for callback in self.hooks[hook_name]: keep = callback(data, *args, **kwargs) - if keep == False: - keep_orignal = False + if type(keep) == bool: + if keep == False: + keep_orignal = False + else: + warning(f"Return value of {callback} is not a boolean") return keep_orignal def trigger_command(self, command:str, player, full_message:str, message_to_client:list, message_to_server:list): diff --git a/plugins/over_g_damage.py b/plugins/over_g_damage.py index 50c1b21..89e295b 100644 --- a/plugins/over_g_damage.py +++ b/plugins/over_g_damage.py @@ -5,7 +5,7 @@ from config import G_LIM import time # CONFIG -ENABLED = True # Enable or disable the plugin +ENABLED = False # Enable or disable the plugin INTERVAL = 0.3 # Interval of second before G Limit check is enforced class Plugin: diff --git a/plugins/refuel.py b/plugins/refuel.py index e171953..bd12a10 100644 --- a/plugins/refuel.py +++ b/plugins/refuel.py @@ -38,6 +38,8 @@ class Plugin: def on_flight_data(self, data, player, message_to_client, message_to_server): decode = FSNETCMD_AIRPLANESTATE(data) + print(player.username, decode.position) + print(refuelers, refueling) if player in refueling: for player in refuelers: refueling[player] = [decode.fuel, decode.position] @@ -57,6 +59,7 @@ class Plugin: if decode.fuel-100 > 0 and refuelers[player][2]: a = FSNETCMD_AIRCMD.set_command(player.aircraft.id, "INITFUEL", f"{decode.fuel-5}kg", True) message_to_client.append(a) + return True @staticmethod def in_range(refueler_cord:list, refueled_cord:list): @@ -64,6 +67,7 @@ class Plugin: # refueler plane, ysf sends cords in list[x, y, z] # implement this later # for now we just use distance formula in a 3d space + print(refueler_cord, refueled_cord) dist = math.sqrt((refueler_cord[0]-refueled_cord[0])**2 + (refueler_cord[1]-refueled_cord[1])**2 + (refueler_cord[2]-refueled_cord[2])**2) print(dist) if dist < REFUEL_RADIUS: diff --git a/plugins/smoke_on_damage/Plugin.py b/plugins/smoke_on_damage/Plugin.py index 12effc8..ed7fcf7 100644 --- a/plugins/smoke_on_damage/Plugin.py +++ b/plugins/smoke_on_damage/Plugin.py @@ -38,7 +38,9 @@ class Plugin: message_to_client.append(FSNETCMD_AIRCMD.set_afterburner(player.aircraft.id, False, True)) - return False + return False + else: + return True def on_weapon_config(self, data, player, message_to_client, message_to_server): if ENABLED: diff --git a/proxy.py b/proxy.py index 37af393..9a60c0c 100644 --- a/proxy.py +++ b/proxy.py @@ -117,9 +117,6 @@ async def handle_client(client_reader, client_writer): try: - if packet_type == "FSNETCMD_AIRCMD": - print(FSNETCMD_AIRCMD.decode(packet)) - if packet_type == "FSNETCMD_LOGON": # keep_message = plugin_manager.triggar_hook('on_login', packet, player, message_to_client, message_to_server) # if not keep_message: -- cgit v1.2.3 From 2546a64a649464868bd1332d4308018c9beffb3b Mon Sep 17 00:00:00 2001 From: Ritabrata Das Date: Wed, 19 Feb 2025 22:36:37 +0530 Subject: Complete mid air refueling --- plugins/over_g_damage.py | 2 +- plugins/refuel.py | 53 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/plugins/over_g_damage.py b/plugins/over_g_damage.py index 89e295b..50c1b21 100644 --- a/plugins/over_g_damage.py +++ b/plugins/over_g_damage.py @@ -5,7 +5,7 @@ from config import G_LIM import time # CONFIG -ENABLED = False # Enable or disable the plugin +ENABLED = True # Enable or disable the plugin INTERVAL = 0.3 # Interval of second before G Limit check is enforced class Plugin: diff --git a/plugins/refuel.py b/plugins/refuel.py index bd12a10..1b33031 100644 --- a/plugins/refuel.py +++ b/plugins/refuel.py @@ -3,61 +3,80 @@ This plugin enables you to perform air to air refueling. """ import math from lib.PacketManager.packets import FSNETCMD_AIRCMD, FSNETCMD_AIRPLANESTATE +from lib import YSchat ENABLED = True -REFUEL_RADIUS = 100 # in meters +REFUEL_RADIUS = 500 +# in meters, recomended to set +100-200m more than +# required range to compensate for distance lag caused by network. +FUEL_RATE = 50 # in kg/s (aprroximately a second, timing is not accurate) refuelers = {} refueling = {} class Plugin: def __init__(self): - def __init__(self): - self.plugin_manager = None + self.plugin_manager = None def register(self, plugin_manager): self.plugin_manager = plugin_manager self.plugin_manager.register_command('refuel', self.refuel) - self.plugin_manager.register_command('k', self.refueler) + self.plugin_manager.register_command('refueler', self.refueler) self.plugin_manager.register_hook('on_flight_data', self.on_flight_data) def refueler(self, full_message, player, message_to_client, message_to_server): - if player in refuelers: + if player in refueling: + a = YSchat.message("You cannot be refueled while being a refueler") + + elif player in refuelers: + 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") refuelers[player] = [0, [], False] + message_to_client.append(a) def refuel(self, full_message, player, message_to_client, message_to_server): #a = FSNETCMD_AIRCMD.set_command(player.aircraft.id, "INITFUEL", "3750kg", True) #message_to_client.append(a) #print(player in refueling) - if player in refueling: + if player in refuelers: + a = YSchat.message("You cannot be a refueler while being refueled") + elif player in refueling: + 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") refueling[player] = [0, []] + message_to_client.append(a) def on_flight_data(self, data, player, message_to_client, message_to_server): decode = FSNETCMD_AIRPLANESTATE(data) - print(player.username, decode.position) - print(refuelers, refueling) if player in refueling: - for player in refuelers: + for refueler in refuelers: refueling[player] = [decode.fuel, decode.position] - if self.in_range(refuelers[player][1], decode.position): - print("here!") - refuelers[player][2] = True + 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+100}kg", True) + 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[player][2] = False + refuelers[refueler][2] = False # No longer refueling elif player in refuelers: refuelers[player] = [decode.fuel, decode.position, refuelers[player][2]] - if decode.fuel-100 > 0 and refuelers[player][2]: - a = FSNETCMD_AIRCMD.set_command(player.aircraft.id, "INITFUEL", f"{decode.fuel-5}kg", True) + if decode.fuel-FUEL_RATE > 0 and refuelers[player][2]: + a = FSNETCMD_AIRCMD.set_command(player.aircraft.id, "INITFUEL", f"{decode.fuel-FUEL_RATE}kg", True) message_to_client.append(a) return True @@ -67,9 +86,7 @@ class Plugin: # refueler plane, ysf sends cords in list[x, y, z] # implement this later # for now we just use distance formula in a 3d space - print(refueler_cord, refueled_cord) dist = math.sqrt((refueler_cord[0]-refueled_cord[0])**2 + (refueler_cord[1]-refueled_cord[1])**2 + (refueler_cord[2]-refueled_cord[2])**2) - print(dist) if dist < REFUEL_RADIUS: return True else: -- cgit v1.2.3