summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/radar.py40
-rw-r--r--plugins/refuel.py59
2 files changed, 58 insertions, 41 deletions
diff --git a/plugins/radar.py b/plugins/radar.py
index cacc6c4..4695f06 100644
--- a/plugins/radar.py
+++ b/plugins/radar.py
@@ -9,7 +9,7 @@ import struct
import traceback
ENABLED = True
-RADIUS = 500 # in meters, within this range planes with different IFF can see each other on radar
+RADIUS = 5000 # in meters, within this range planes with different IFF can see each other.
flying_players = {}
@@ -22,9 +22,19 @@ class Plugin:
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)
+ #self.plugin_manager.register_hook('on_join_request', self.on_join)
+
+ """
+ def on_join(self, data, player, message_to_client, message_to_server):
+ flying_players[player.aircraft.id] = [player, []]
+ return True
+ """
def on_flight_data(self, data, player, message_to_client, message_to_server):
- flying_players[player.aircraft.id][1] = FSNETCMD_AIRPLANESTATE(data).position
+ try:
+ flying_players[player.aircraft.id][1] = FSNETCMD_AIRPLANESTATE(data).position
+ except KeyError:
+ return True
return True
def on_flight_data_server(self, data, player, message_to_client, message_to_server):
@@ -32,22 +42,23 @@ class Plugin:
try:
if player.aircraft.id not in flying_players and player.aircraft.id != -1:
flying_players[player.aircraft.id] = [player, []]
+ return True
elif player.aircraft.id == -1:
return True
decode = FSNETCMD_AIRPLANESTATE(data)
- if decode.player_id == player.aircraft.id:
+ if len(flying_players[player.aircraft.id][1]) == 0:
return True
- elif self.get_player_by_pilotid(int(decode.player_id)).iff == player.iff:
+ elif decode.player_id == player.aircraft.id:
+ return True
+ elif flying_players[decode.player_id][0].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)
+ position_data = struct.pack("3f", 10000, 1000.0, 1000.0)
if decode.packet_version == 4 or 5:
updated_data = data[:14] + position_data + data[26:]
else:
@@ -56,12 +67,16 @@ class Plugin:
traceback.print_exc()
player.streamWriterObject.write(send(updated_data))
- player.streamWriterObject.drain()
+ # await player.streamWriterObject.drain()
return False
- except:
+ except Exception as e:
+ if isinstance(e, KeyError):
+ return True
traceback.print_exc()
def on_unjoin(self, data, player, message_to_client, message_to_server):
+ if player.aircraft.id in flying_players:
+ flying_players.pop(player.aircraft.id)
return True
@staticmethod
@@ -69,10 +84,3 @@ class Plugin:
# 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 12af66a..ff96699 100644
--- a/plugins/refuel.py
+++ b/plugins/refuel.py
@@ -4,6 +4,7 @@ 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
+import asyncio
ENABLED = True
REFUEL_RADIUS = 500
@@ -52,7 +53,31 @@ class Plugin:
message_to_client.append(a)
def on_flight_data(self, data, player, message_to_client, message_to_server):
+ asyncio.create_task(self.refuel_logic(data, player))
+ 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
+ # 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
+
+ async def refuel_logic(self, data, player):
decode = FSNETCMD_AIRPLANESTATE(data)
+ k = player.streamWriterObject
if player in refueling:
for refueler in refuelers:
if refueler.iff == player.iff:
@@ -61,16 +86,19 @@ class Plugin:
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)
+ #a = FSNETCMD_AIRCMD.set_command(player.aircraft.id, "INITFUEL", f"{decode.fuel+FUEL_RATE}kg", True)
+ #message_to_client.append(a)
+ k.write(FSNETCMD_AIRCMD.set_command(player.aircraft.id, "INITFUEL", f"{decode.fuel+FUEL_RATE}kg", True))
elif decode.fuel >= max_lim:
a = YSchat.message("The plane is full!")
refuelers[refueler][2] = False # No longer refueling
- message_to_client.append(a)
+ k.write(a)
+ #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)
+ k.write(a)
+ #message_to_client.append(a)
else:
refuelers[refueler][2] = False # No longer refueling
@@ -79,24 +107,5 @@ class Plugin:
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
-
- 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
- # 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
+ #message_to_client.append(a)
+ k.write(a)