diff options
| author | Ritabrata Das <[email protected]> | 2025-02-19 22:42:23 +0530 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-02-19 22:42:23 +0530 |
| commit | 86cc54fd0cf49ce05191620798b566fa9c49ff94 (patch) | |
| tree | 0a5b09502d5f63c21e8b05921b4769c3b6a335cf /plugins | |
| parent | 19a97cd1dcee60ab1b6a5871902e9f2590a8f73f (diff) | |
| parent | 2546a64a649464868bd1332d4308018c9beffb3b (diff) | |
Merge pull request #7 from the-indian-dev/dev
Add mid air refueling
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/refuel.py | 93 | ||||
| -rw-r--r-- | plugins/smoke_on_damage/Plugin.py | 6 |
2 files changed, 97 insertions, 2 deletions
diff --git a/plugins/refuel.py b/plugins/refuel.py new file mode 100644 index 0000000..1b33031 --- /dev/null +++ b/plugins/refuel.py @@ -0,0 +1,93 @@ +""" +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 = 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): + 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('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 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 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) + 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 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: + refuelers[player] = [decode.fuel, decode.position, refuelers[player][2]] + 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 + + @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) + 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..ed7fcf7 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 @@ -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: |
