diff options
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/radar.py | 40 | ||||
| -rw-r--r-- | plugins/refuel.py | 59 |
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) |
