diff options
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/aircraft_replacer.py | 70 | ||||
| -rw-r--r-- | plugins/radar.py | 88 | ||||
| -rw-r--r-- | plugins/refuel.py | 74 |
3 files changed, 204 insertions, 28 deletions
diff --git a/plugins/aircraft_replacer.py b/plugins/aircraft_replacer.py new file mode 100644 index 0000000..f2db5a9 --- /dev/null +++ b/plugins/aircraft_replacer.py @@ -0,0 +1,70 @@ +"""This plugin will replace the aircraft of the player +with the aircraft specified in the plugin. It is a template +for creating plugins that modify the aircraft of the player.""" +from lib.PacketManager.packets import FSNETCMD_ADDOBJECT, FSNETCMD_JOINREQUEST, FSNETCMD_READBACK, FSNETCMD_AIRPLANESTATE +from config import G_LIM +import time + +# CONFIG +ENABLED = False # Enable or disable the plugin + +class Plugin: + def __init__(self): + self.plugin_manager = None + self.first_add_object = False + + def register(self, plugin_manager): + self.plugin_manager = plugin_manager + # self.plugin_manager.register_hook('on_flight_data', self.on_flight_data) + self.plugin_manager.register_hook('on_add_object_server', self.on_add_object_server) + # self.plugin_manager.register_hook('on_flight_data_server', self.on_flight_data_server) + self.plugin_manager.register_hook('on_join_request', self.on_join_request) + + + def on_add_object_server(self, data, player, messages_to_client, *args): + packet = FSNETCMD_ADDOBJECT(data) + #Swap the aircraft and position + if packet.pilot == player.username: + packet.identifier = "EUROFIGHTER_TYPHOON" + messages_to_client.append(packet.to_packet()) + self.first_add_object = True + return False + return True + + # def on_flight_data(self, data, player, messages_to_client, *args): + # packet = FSNETCMD_AIRPLANESTATE(data) + # if packet.player_id == player.aircraft.id: + + # return True + + # def on_flight_data_server(self, data, player, messages_to_client, *args): + # packet = FSNETCMD_AIRPLANESTATE(data) + # if packet.player_id == player.aircraft.id and self.first_add_object: + # packet.position = [0,2000.0,0] + # packet.velocity = [25,0,25] + # messages_to_client.append(packet.to_packet()) + + # self.first_add_object = False + # return False + # return True + + def on_join_request(self, data, player, messages_to_client, message_to_server, *args): + packet = FSNETCMD_JOINREQUEST(data) + #Replace the aircraft: + packet.aircraft = "EUROFIGHTER_TYPHOON" + message_to_server.append(packet.to_packet()) + return False + + # def on_receive(self, data, player, messages_to_client, *args): + # if ENABLED: + # if abs(player.aircraft.last_packet.g_value)> G_LIM: + # if time.time() - player.aircraft.last_over_g_message > INTERVAL: + # player.aircraft.last_over_g_message = time.time() + # damage_packet = FSNETCMD_GETDAMAGE.encode(player.aircraft.id, + # 1, 1, + # player.aircraft.id, + # 1, 11,0, True) + # warning_message = FSNETCMD_TEXTMESSAGE.encode(f"You are exceeding the G Limit for the aircraft!, gValue = {player.aircraft.last_packet.g_value}!",True) + # messages_to_client.append(damage_packet) + # messages_to_client.append(warning_message) + # return True diff --git a/plugins/radar.py b/plugins/radar.py new file mode 100644 index 0000000..7636dc4 --- /dev/null +++ b/plugins/radar.py @@ -0,0 +1,88 @@ +""" +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 = 5000 # in meters, within this range planes with different IFF can see each other. + +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) + #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): + 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): + # 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, []] + return True + elif player.aircraft.id == -1: + return True + + decode = FSNETCMD_AIRPLANESTATE(data) + + if len(flying_players[player.aircraft.id][1]) == 0: + return True + 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): + return True + else: + try: + # This is a really arbitary position thats hard to reach, better would + # be to randomise it for every time the server starts. + position_data = struct.pack("3f", 10e7, 10e7, 10e7) + 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)) + # await player.streamWriterObject.drain() + return False + 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 + 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 diff --git a/plugins/refuel.py b/plugins/refuel.py index 1b33031..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 @@ -23,6 +24,7 @@ class Plugin: 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) + 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 refueling: @@ -32,7 +34,7 @@ class Plugin: 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") + 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) @@ -46,38 +48,19 @@ class Plugin: 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") + 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 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 - + asyncio.create_task(self.refuel_logic(data, player)) + return True - 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) + 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 @@ -91,3 +74,38 @@ class Plugin: 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: + 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) + 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 + k.write(a) + #message_to_client.append(a) + + if refuelers[refueler][0] < FUEL_RATE: + a = YSchat.message("The refueler ran out of fuel!") + k.write(a) + #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) + k.write(a) |
