summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRitabrata Das <[email protected]>2025-02-19 22:42:23 +0530
committerGitHub <[email protected]>2025-02-19 22:42:23 +0530
commit86cc54fd0cf49ce05191620798b566fa9c49ff94 (patch)
tree0a5b09502d5f63c21e8b05921b4769c3b6a335cf
parent19a97cd1dcee60ab1b6a5871902e9f2590a8f73f (diff)
parent2546a64a649464868bd1332d4308018c9beffb3b (diff)
Merge pull request #7 from the-indian-dev/dev
Add mid air refueling
-rw-r--r--lib/plugin_manager.py7
-rw-r--r--plugins/refuel.py93
-rw-r--r--plugins/smoke_on_damage/Plugin.py6
-rw-r--r--proxy.py4
4 files changed, 105 insertions, 5 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/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:
diff --git a/proxy.py b/proxy.py
index 9e0566f..9a60c0c 100644
--- a/proxy.py
+++ b/proxy.py
@@ -117,7 +117,6 @@ async def handle_client(client_reader, client_writer):
try:
-
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:
@@ -186,6 +185,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