summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/radar.py78
-rw-r--r--plugins/refuel.py70
-rw-r--r--plugins/smoke_on_damage/Plugin.py4
3 files changed, 131 insertions, 21 deletions
diff --git a/plugins/radar.py b/plugins/radar.py
new file mode 100644
index 0000000..cacc6c4
--- /dev/null
+++ b/plugins/radar.py
@@ -0,0 +1,78 @@
+"""
+This plugin allows you have to Radar features similar to that of
+original WW3 server.
+"""
+import math
+from lib.PacketManager.packets import FSNETCMD_AIRPLANESTATE
+from lib.YSchat import send
+import struct
+import traceback
+
+ENABLED = True
+RADIUS = 500 # in meters, within this range planes with different IFF can see each other on radar
+
+flying_players = {}
+
+class Plugin:
+ def __init__(self):
+ self.plugin_manager = None
+
+ def register(self, plugin_manager):
+ self.plugin_manager = plugin_manager
+ self.plugin_manager.register_hook('on_flight_data_server', self.on_flight_data_server)
+ self.plugin_manager.register_hook('on_flight_data', self.on_flight_data)
+ self.plugin_manager.register_hook('on_unjoin', self.on_unjoin)
+
+ def on_flight_data(self, data, player, message_to_client, message_to_server):
+ flying_players[player.aircraft.id][1] = FSNETCMD_AIRPLANESTATE(data).position
+ return True
+
+ def on_flight_data_server(self, data, player, message_to_client, message_to_server):
+ # TODO : This is very primitive, we need to implement a better way to keep track of players
+ try:
+ if player.aircraft.id not in flying_players and player.aircraft.id != -1:
+ flying_players[player.aircraft.id] = [player, []]
+ elif player.aircraft.id == -1:
+ return True
+
+ decode = FSNETCMD_AIRPLANESTATE(data)
+
+ if decode.player_id == player.aircraft.id:
+ return True
+ elif self.get_player_by_pilotid(int(decode.player_id)).iff == player.iff:
+ return True
+ elif self.in_range(flying_players[player.aircraft.id][1], decode.position):
+ print(flying_players[player.aircraft.id][1], decode.position)
+ print("HERE")
+ return True
+ else:
+ try:
+ position_data = struct.pack("3f", -1, 1000.0, 1000.0)
+ if decode.packet_version == 4 or 5:
+ updated_data = data[:14] + position_data + data[26:]
+ else:
+ updated_data = data[:16] + position_data + data[28:]
+ except:
+ traceback.print_exc()
+
+ player.streamWriterObject.write(send(updated_data))
+ player.streamWriterObject.drain()
+ return False
+ except:
+ traceback.print_exc()
+
+ def on_unjoin(self, data, player, message_to_client, message_to_server):
+ return True
+
+ @staticmethod
+ def in_range(pos1, pos2):
+ # pos1 and pos2 are lists of [x,y,z]
+ dist = math.sqrt((pos1[0] - pos2[0])**2 + (pos1[1] - pos2[1])**2 + (pos1[2] - pos2[2])**2)
+ return dist <= RADIUS
+
+ @staticmethod
+ def get_player_by_pilotid(pilotid:int):
+ for playerid in flying_players:
+ if playerid == pilotid:
+ return flying_players[playerid][0]
+ return None
diff --git a/plugins/refuel.py b/plugins/refuel.py
index e171953..12af66a 100644
--- a/plugins/refuel.py
+++ b/plugins/refuel.py
@@ -3,60 +3,91 @@ 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)
+ 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 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 and have same IFF")
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 and have same IFF")
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 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
+ for refueler in refuelers:
+ 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
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
+
+ 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):
@@ -65,7 +96,6 @@ class Plugin:
# 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:
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: