summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRitabrata Das <[email protected]>2025-02-21 19:26:06 +0530
committerRitabrata Das <[email protected]>2025-02-21 19:26:06 +0530
commitd420f7d5a1606c657576aa8aa02a4ad1ea1beec7 (patch)
tree05a2be8fa07c3f71b75da4e769510b3446cee9dd
parentbac0338396377a96805026bd0b8059a715647839 (diff)
Very premetive implementation of radar
-rw-r--r--lib/PacketManager/packets/FSNETCMD_AIRPLANESTATE.py2
-rw-r--r--plugins/radar.py60
2 files changed, 47 insertions, 15 deletions
diff --git a/lib/PacketManager/packets/FSNETCMD_AIRPLANESTATE.py b/lib/PacketManager/packets/FSNETCMD_AIRPLANESTATE.py
index 3ebf8d6..8c5aec7 100644
--- a/lib/PacketManager/packets/FSNETCMD_AIRPLANESTATE.py
+++ b/lib/PacketManager/packets/FSNETCMD_AIRPLANESTATE.py
@@ -235,7 +235,7 @@ class FSNETCMD_AIRPLANESTATE: #11
buffer = pack("IfI", 11, remote_time, player_id)
buffer += pack("H", packet_version)
if packet_version == 4 or packet_version == 5:
- buffer += pack("fffhhhhhhhhh", *position, *atti, *velocity, *atti_velocity)
+ buffer += pack("3f9H", *position, *atti, *velocity, *atti_velocity)
buffer += pack("hhhh", smoke_oil, fuel, payload, 0)
buffer += pack("BB", flight_state, int(vgw*255))
buffer += pack("BB", int(spoiler*15)<<4 | int(landing_gear*15), int(flap*15)<<4 | int(brake*15))
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