diff options
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/radar.py | 78 | ||||
| -rw-r--r-- | plugins/refuel.py | 70 | ||||
| -rw-r--r-- | plugins/smoke_on_damage/Plugin.py | 4 |
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: |
