diff options
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/radar.py | 60 |
1 files changed, 46 insertions, 14 deletions
diff --git a/plugins/radar.py b/plugins/radar.py index ca9fd40..cacc6c4 100644 --- a/plugins/radar.py +++ b/plugins/radar.py @@ -4,6 +4,8 @@ original WW3 server. """ import math from lib.PacketManager.packets import FSNETCMD_AIRPLANESTATE +from lib.YSchat import send +import struct import traceback ENABLED = True @@ -18,23 +20,46 @@ class Plugin: 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): - decode = FSNETCMD_AIRPLANESTATE(data) - if decode.player_id == player.aircraft.id: - return True - else: - try: - print(decode.packet_version) - print(*decode.position, *decode.atti, *decode.velocity, *decode.atti_velocity) - message_to_client.append(FSNETCMD_AIRPLANESTATE.encode(decode.remote_time, decode.player_id, decode.packet_version, [0.0,0.0,0.0], decode.atti, decode.velocity, decode.atti_velocity, - decode.smoke_oil, decode.fuel, decode.payload, decode.flight_state, decode.vgw, decode.spoiler, decode.landing_gear, decode.flap, decode.brake, - decode.flags, decode.gun_ammo, decode.rocket_ammo, decode.aam, decode.agm, decode.bomb, decode.life, decode.g_value, decode.throttle, decode.elev, decode.ail, decode.rud, - decode.trim, decode.thrust_vector, decode.bomb_bay_info, True)) - except: - traceback.print_exc() - return False + # 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 @@ -44,3 +69,10 @@ 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 |
