aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRitabrata Das <[email protected]>2025-02-15 18:58:01 +0530
committerRitabrata Das <[email protected]>2025-02-15 18:58:01 +0530
commit71216e5082346dc6824b50dd103fb264fb205f3d (patch)
treefca6e2ae31017ef3ba24804ab280b2ec18051384
parent1474f8174ca6d0718963ec018f1acef9e43b5be4 (diff)
Work on plugin apis, add command support
-rw-r--r--README.md7
-rw-r--r--config.py13
-rw-r--r--lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py2
-rw-r--r--lib/Player.py3
-rw-r--r--lib/discordSync.py8
-rw-r--r--lib/plugin_manager.py28
-rw-r--r--lib/triggerCommand.py13
-rw-r--r--lib/triggerRespectiveHook.py127
-rw-r--r--plugins/chat_weather_setter.py54
-rw-r--r--plugins/command_test.py26
-rw-r--r--plugins/over_g_damage.py7
-rw-r--r--plugins/smoke_on_damage/Plugin.py22
-rw-r--r--proxy.py63
13 files changed, 313 insertions, 60 deletions
diff --git a/README.md b/README.md
index 683e67f..d035475 100644
--- a/README.md
+++ b/README.md
@@ -29,6 +29,7 @@ Sakuya AC and G Limiter at 20. It also has all the experimental options turned o
- All features are server side, vanilla client can join
- Supports clients post 20150425 version to join the server (Experimental)
- Easy configuration via `config.py`.
+- Plugin Support
---
@@ -73,10 +74,8 @@ PROXY_PORT = 9000 # Port where the proxy listens
---
## **TODO :memo:**
1. Add more detection rules.
-2. Negative g-values are wrong interpeted
-3. Add more documentation.
-4. Add radar features
-5. Add Plugin API
+2. Radar.
+3. More documentation.
---
## **Contact**
diff --git a/config.py b/config.py
index 4b5daf8..8071653 100644
--- a/config.py
+++ b/config.py
@@ -8,16 +8,25 @@ LOGGING_LEVEL = INFO
# Server Configuration
# Replace with the YSFlight server address
SERVER_HOST = "127.0.0.1"
-SERVER_PORT = 7914 # Please put where the normal YSFlight server is running
+SERVER_PORT = 7915 # Please put where the normal YSFlight server is running
# Port for the proxy server
-PROXY_PORT = 7915
+PROXY_PORT = 9000
# Welcome Message to the playe
# For formatting use {username}
# eg. "Welcome {username} to the server!"
# > Welcome Sakuya to the server!
+
WELCOME_MESSAGE = "Welcome {username} to the server!"
+# Command Prefix for the server
+# When commands are entered in chat, this will be treated
+# as command when it starts with the prefix
+# eg. if PREFIX = "/"
+# /help will be treated as command
+
+PREFIX = "/"
+
# Native YSFlight Server
# Please select the YSFlight server version for the
# local ysflight server
diff --git a/lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py b/lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py
index 1c683a5..4cd0f42 100644
--- a/lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py
+++ b/lib/PacketManager/packets/FSNETCMD_TEXTMESSAGE.py
@@ -6,7 +6,7 @@ class FSNETCMD_TEXTMESSAGE: #32
self.buffer = buffer
self.raw_message = None
self.user = None
- self.message = None
+ self.message = ""
if should_decode:
self.decode()
diff --git a/lib/Player.py b/lib/Player.py
index 747f8cd..7f54914 100644
--- a/lib/Player.py
+++ b/lib/Player.py
@@ -35,3 +35,6 @@ class Player:
})
return True
return False
+
+ def __str__(self):
+ return f"Player {self.username} flying {self.aircraft.name} at {self.aircraft.position}"
diff --git a/lib/discordSync.py b/lib/discordSync.py
index fe5c37b..0a8e8be 100644
--- a/lib/discordSync.py
+++ b/lib/discordSync.py
@@ -89,6 +89,12 @@ async def monitor_channel(channel_id, playerList:list):
playerList.remove(player) # Remove disconnected players
continue
player.streamWriterObject.write(encoded_msg)
- await player.streamWriterObject.drain()
+ try:
+ await player.streamWriterObject.drain()
+ except Exception as e:
+ warning(f"Error while sending message to {player.username}: {e}")
+ if not player.is_a_bot:
+ asyncio.create_task(discord_send_message(channel_id, f"{player.username} has left the server!"))
+ playerList.remove(player)
on_new_message(message)
await asyncio.sleep(1) # Poll every second (adjust as needed)
diff --git a/lib/plugin_manager.py b/lib/plugin_manager.py
index 73c2ac1..ae4cf0b 100644
--- a/lib/plugin_manager.py
+++ b/lib/plugin_manager.py
@@ -1,7 +1,7 @@
import importlib
import os
import sys
-from logging import info
+from logging import info, warning
PLUGIN_DIR = os.path.join(os.path.dirname(__file__), '../plugins')
sys.path.append(PLUGIN_DIR)
@@ -10,6 +10,8 @@ class PluginManager:
def __init__(self):
self.plugins = {}
self.hooks= {}
+ self.commands = {}
+ self.help_message = "List of Available Commands:\n"
self.load_plugins()
def load_plugins(self):
@@ -18,21 +20,20 @@ class PluginManager:
if plugin.endswith('.py') and not plugin.startswith('__'):
plugin_name = plugin[:-3]
plugin_module = importlib.import_module(plugin_name)
- if hasattr(plugin_module, 'Plugin'):
- if plugin_module.ENABLED:
+ if hasattr(plugin_module, 'ENABLED') and plugin_module.ENABLED:
+ if hasattr(plugin_module, 'Plugin'):
plugin_instance = plugin_module.Plugin()
self.register_plugin(plugin_instance)
info(f"Loaded plugin {plugin_name}")
self.plugins[plugin_name] = plugin_instance
elif os.path.isdir(plugin_path) and os.path.exists(os.path.join(plugin_path, '__init__.py')):
plugin_module = importlib.import_module(plugin)
- if hasattr(plugin_module, 'Plugin'):
- if plugin_module.ENABLED:
+ if hasattr(plugin_module, 'ENABLED') and plugin_module.ENABLED:
+ if hasattr(plugin_module, 'Plugin'):
plugin_instance = plugin_module.Plugin()
self.register_plugin(plugin_instance)
info(f"Loaded plugin {plugin}")
self.plugins[plugin] = plugin_instance
-
def register_plugin(self, plugin):
"""Registers the plugin with the plugin manager"""
@@ -44,6 +45,14 @@ class PluginManager:
self.hooks[hook_name] = []
self.hooks[hook_name].append(callback)
+ def register_command(self, command_name, callback):
+ """Registers the command with the plugin manager"""
+ if command_name in self.commands:
+ warning(f"Command {command_name} already registered, Ignoring this registration")
+ else:
+ self.commands[command_name] = callback
+ self.help_message = self.help_message + f"/{command_name}\n"
+
def triggar_hook(self, hook_name, data, *args, **kwargs):
"""Triggars the callbacks for the hook.
If a callback returns False, then the original data is set to None
@@ -56,3 +65,10 @@ class PluginManager:
if keep == False:
keep_orignal = False
return keep_orignal
+
+ def trigger_command(self, command:str, player, full_message:str, message_to_client:list, message_to_server:list):
+ """Triggers the command"""
+ if command in self.commands:
+ self.commands[command](full_message, player, message_to_client, message_to_server)
+ return True
+ return False
diff --git a/lib/triggerCommand.py b/lib/triggerCommand.py
new file mode 100644
index 0000000..d6a6116
--- /dev/null
+++ b/lib/triggerCommand.py
@@ -0,0 +1,13 @@
+from config import *
+from lib import YSchat
+from logging import debug
+
+async def triggerCommand(command, full_message, player, message_to_client, message_to_server, plugin_manager):
+ debug(f"{player.username} triggered command {command}")
+ if command == "help":
+ message_to_client.append(YSchat.message(plugin_manager.help_message))
+ return 0
+
+ h = plugin_manager.trigger_command(command, player, full_message , message_to_client, message_to_server)
+ if not h:
+ message_to_client.append(YSchat.message(f"Command not found, Type {PREFIX}help for all commands."))
diff --git a/lib/triggerRespectiveHook.py b/lib/triggerRespectiveHook.py
new file mode 100644
index 0000000..25801a0
--- /dev/null
+++ b/lib/triggerRespectiveHook.py
@@ -0,0 +1,127 @@
+from logging import debug
+
+def triggerRespectiveHook(packet_type, packet, player, message_to_client, message_to_server, plugin_manager):
+ if packet_type == "FSNETCMD_LOGON":
+ keep_message = plugin_manager.triggar_hook('on_login', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_LOGOFF":
+ keep_message = plugin_manager.triggar_hook('on_logout', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_ERROR":
+ keep_message = plugin_manager.triggar_hook('on_error', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_LOADFIELD":
+ keep_message = plugin_manager.triggar_hook('on_load_field', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_ADDOBJECT":
+ keep_message = plugin_manager.triggar_hook('on_add_object', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_READBACK":
+ keep_message = plugin_manager.triggar_hook('on_readback', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_SMOKECOLOR":
+ keep_message = plugin_manager.triggar_hook('on_smoke_color', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_JOINREQUEST":
+ keep_message = plugin_manager.triggar_hook('on_join_request', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_JOINAPPROVAL":
+ keep_message = plugin_manager.triggar_hook('on_join_approval', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_REJECTJOINREQ":
+ keep_message = plugin_manager.triggar_hook('on_reject_join_request', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_AIRPLANESTATE":
+ keep_message = plugin_manager.triggar_hook('on_flight_data', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_UNJOIN":
+ keep_message = plugin_manager.triggar_hook('on_unjoin', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_REMOVEAIRPLANE":
+ keep_message = plugin_manager.triggar_hook('on_remove_airplane', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_REQUESTTESTAIRPLANE":
+ keep_message = plugin_manager.triggar_hook('on_request_test_airplane', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_KILLSERVER":
+ keep_message = plugin_manager.triggar_hook('on_kill_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_PREPARESIMULATION":
+ keep_message = plugin_manager.triggar_hook('on_prepare_simulation', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_TESTPACKET":
+ keep_message = plugin_manager.triggar_hook('on_test_packet', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_LOCKON":
+ keep_message = plugin_manager.triggar_hook('on_lockon', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_REMOVEGROUND":
+ keep_message = plugin_manager.triggar_hook('on_remove_ground', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_MISSILELAUNCH":
+ keep_message = plugin_manager.triggar_hook('on_missile_launch', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_GETDAMAGE":
+ keep_message = plugin_manager.triggar_hook('on_get_damage', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_WEAPONCONFIG":
+ keep_message = plugin_manager.triggar_hook('on_weapon_config', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_AIRCMD":
+ keep_message = plugin_manager.triggar_hook('on_air_cmd', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_TEXTMESSAGE":
+ keep_message = plugin_manager.triggar_hook('on_chat', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_ENVIRONMENT":
+ keep_message = plugin_manager.triggar_hook('on_environment', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_SKYCOLOR":
+ keep_message = plugin_manager.triggar_hook('on_sky_color', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_FOGCOLOR":
+ keep_message = plugin_manager.triggar_hook('on_fog_color', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_LIST":
+ keep_message = plugin_manager.triggar_hook('on_list', packet, player, message_to_client, message_to_server)
+ else:
+ keep_message = True
+ debug(f"Unknown packet type {packet_type}, C2S")
+
+ return keep_message
+
+def triggerRespectiveHookServer(packet_type, packet, player, message_to_client, message_to_server, plugin_manager):
+ if packet_type == "FSNETCMD_LOGON":
+ keep_message = plugin_manager.triggar_hook('on_login_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_LOGOFF":
+ keep_message = plugin_manager.triggar_hook('on_logout_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_ERROR":
+ keep_message = plugin_manager.triggar_hook('on_error_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_LOADFIELD":
+ keep_message = plugin_manager.triggar_hook('on_load_field_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_ADDOBJECT":
+ keep_message = plugin_manager.triggar_hook('on_add_object_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_READBACK":
+ keep_message = plugin_manager.triggar_hook('on_readback_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_SMOKECOLOR":
+ keep_message = plugin_manager.triggar_hook('on_smoke_color_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_JOINREQUEST":
+ keep_message = plugin_manager.triggar_hook('on_join_request_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_JOINAPPROVAL":
+ keep_message = plugin_manager.triggar_hook('on_join_approval_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_REJECTJOINREQ":
+ keep_message = plugin_manager.triggar_hook('on_reject_join_request_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_AIRPLANESTATE":
+ keep_message = plugin_manager.triggar_hook('on_flight_data_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_UNJOIN":
+ keep_message = plugin_manager.triggar_hook('on_unjoin_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_REMOVEAIRPLANE":
+ keep_message = plugin_manager.triggar_hook('on_remove_airplane_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_REQUESTTESTAIRPLANE":
+ keep_message = plugin_manager.triggar_hook('on_request_test_airplane_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_KILLSERVER":
+ keep_message = plugin_manager.triggar_hook('on_kill_server_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_PREPARESIMULATION":
+ keep_message = plugin_manager.triggar_hook('on_prepare_simulation_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_TESTPACKET":
+ keep_message = plugin_manager.triggar_hook('on_test_packet_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_LOCKON":
+ keep_message = plugin_manager.triggar_hook('on_lockon_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_REMOVEGROUND":
+ keep_message = plugin_manager.triggar_hook('on_remove_ground_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_MISSILELAUNCH":
+ keep_message = plugin_manager.triggar_hook('on_missile_launch_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_GETDAMAGE":
+ keep_message = plugin_manager.triggar_hook('on_get_damage_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_WEAPONCONFIG":
+ keep_message = plugin_manager.triggar_hook('on_weapon_config_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_AIRCMD":
+ keep_message = plugin_manager.triggar_hook('on_air_cmd_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_TEXTMESSAGE":
+ keep_message = plugin_manager.triggar_hook('on_chat_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_ENVIRONMENT":
+ keep_message = plugin_manager.triggar_hook('on_environment_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_SKYCOLOR":
+ keep_message = plugin_manager.triggar_hook('on_sky_color_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_FOGCOLOR":
+ keep_message = plugin_manager.triggar_hook('on_fog_color_server', packet, player, message_to_client, message_to_server)
+ elif packet_type == "FSNETCMD_LIST":
+ keep_message = plugin_manager.triggar_hook('on_list_server', packet, player, message_to_client, message_to_server)
+ else:
+ keep_message = True
+ debug(f"Unknown packet type {packet_type}, S2C")
+
+ return keep_message
diff --git a/plugins/chat_weather_setter.py b/plugins/chat_weather_setter.py
index 4bcdf0b..5b31a38 100644
--- a/plugins/chat_weather_setter.py
+++ b/plugins/chat_weather_setter.py
@@ -11,9 +11,56 @@ class Plugin:
def register(self, plugin_manager):
self.plugin_manager = plugin_manager
- self.plugin_manager.register_hook('on_chat', self.on_chat)
+ #self.plugin_manager.register_hook('on_chat', self.on_chat)
self.plugin_manager.register_hook('on_environment_server', self.on_environment)
+ self.plugin_manager.register_command('fog', self.fog)
+ self.plugin_manager.register_command('sky', self.sky)
+ self.plugin_manager.register_command('time', self.time)
+ self.plugin_manager.register_command('vis', self.visibility)
+ def fog(self, full_message, player, message_to_client, message_to_server):
+ try:
+ args = list(map(int, full_message[4:].split(',')))
+ except:
+ message_to_client.append(FSNETCMD_TEXTMESSAGE.encode("Invalid fog argument, usage /fog r,g,b", True))
+ return
+ fog_colour_packet = FSNETCMD_FOGCOLOR.encode(args[0], args[1], args[2], True)
+ message_to_client.append(fog_colour_packet)
+
+ def sky(self, full_message, player, message_to_client, message_to_server):
+ try:
+ args = list(map(int, full_message[4:].split(',')))
+ except Exception as e:
+ message_to_client.append(FSNETCMD_TEXTMESSAGE.encode("Invalid sky argument, usage /sky r,g,b", True))
+ return True
+ sky_colour_packet = FSNETCMD_SKYCOLOR.encode(args[0], args[1], args[2], True)
+ message_to_client.append(sky_colour_packet)
+ return True
+
+ def time(self, full_message, player, message_to_client, message_to_server):
+ requested = full_message[6:].lower()
+ if requested == 'day' and self.initialWeather:
+ packet = FSNETCMD_ENVIRONMENT.set_time(self.initialWeather.buffer, False, True)
+ self.initialWeather = FSNETCMD_ENVIRONMENT(packet[4:])
+ message_to_client.append(packet)
+
+ elif requested == 'night' and self.initialWeather:
+ packet = FSNETCMD_ENVIRONMENT.set_time(self.initialWeather.buffer, True, True)
+ self.initialWeather = FSNETCMD_ENVIRONMENT(packet[4:])
+ message_to_client.append(packet)
+
+ else:
+ message_to_client.append(FSNETCMD_TEXTMESSAGE.encode("Invalid time argument, usage /time night or /time day", True))
+ return True
+
+ def visibility(self, full_message, player, message_to_client, message_to_server):
+ visibility = int(full_message[4:])
+ returnpacket = FSNETCMD_ENVIRONMENT.set_visibility(self.initialWeather.buffer, visibility, True)
+ self.initialWeather = FSNETCMD_ENVIRONMENT(returnpacket[4:])
+ message_to_client.append(returnpacket)
+ return True
+
+ """
def on_chat(self, data, player, messages_to_client, *args):
if ENABLED:
message = FSNETCMD_TEXTMESSAGE(data).message
@@ -44,9 +91,10 @@ class Plugin:
self.initialWeather = FSNETCMD_ENVIRONMENT(returnpacket[4:])
messages_to_client.append(returnpacket)
return False
+ """
+
def on_environment(self, data, *args):
"""Store the initial weather packet for the server."""
- if ENABLED:
- self.initialWeather = FSNETCMD_ENVIRONMENT(data)
+ self.initialWeather = FSNETCMD_ENVIRONMENT(data)
return True
diff --git a/plugins/command_test.py b/plugins/command_test.py
new file mode 100644
index 0000000..6d8e8af
--- /dev/null
+++ b/plugins/command_test.py
@@ -0,0 +1,26 @@
+"""
+This is an example test command!
+"""
+
+from lib import YSchat
+from time import sleep
+
+ENABLED = False
+
+class Plugin:
+ def __init__(self):
+ self.plugin_manager = None
+
+ def register(self, plugin_manager):
+ self.plugin_manager = plugin_manager
+ self.plugin_manager.register_command('test', self.test)
+ self.plugin_manager.register_command('timer', self.timer)
+
+ def test(self, full_message, player, message_to_client, message_to_server):
+ message_to_client.append(YSchat.message("Test command received"))
+ return True
+
+ def timer(self, full_message, player, message_to_client, message_to_server):
+ sleep(5)
+ message_to_client.append(YSchat.message("Timer ended"))
+ return True
diff --git a/plugins/over_g_damage.py b/plugins/over_g_damage.py
index aa44ca8..50c1b21 100644
--- a/plugins/over_g_damage.py
+++ b/plugins/over_g_damage.py
@@ -3,7 +3,10 @@ it exceeds the g-force limit set in the config file."""
from lib.PacketManager.packets import FSNETCMD_GETDAMAGE, FSNETCMD_TEXTMESSAGE
from config import G_LIM
import time
-ENABLED = True
+
+# CONFIG
+ENABLED = True # Enable or disable the plugin
+INTERVAL = 0.3 # Interval of second before G Limit check is enforced
class Plugin:
def __init__(self):
@@ -16,7 +19,7 @@ class Plugin:
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 > 1: # Only send every second.
+ 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,
diff --git a/plugins/smoke_on_damage/Plugin.py b/plugins/smoke_on_damage/Plugin.py
index e6c57e2..08c184b 100644
--- a/plugins/smoke_on_damage/Plugin.py
+++ b/plugins/smoke_on_damage/Plugin.py
@@ -16,30 +16,30 @@ class Plugin:
self.plugin_manager.register_hook('on_weapon_config', self.on_weapon_config)
def on_flight_data(self, data, player,message_to_client, message_to_server):
- """After the initial incoming flight packet, check whether
+ """After the initial incoming flight packet, check whether
the health is below the threshold, if so add smoke"""
- if ENABLED and SMOKE_PLANE and player.aircraft.life<SMOKE_LIFE:
-
+ if SMOKE_PLANE and player.aircraft.life<SMOKE_LIFE:
+
#Add smoke to the plane
smoke_packet = FSNETCMD_AIRPLANESTATE(data).smoke()
#forward it on to the server
-
+
message_to_server.append(smoke_packet)
-
-
-
+
+
+
if not player.aircraft.damage_engine_warn_sent:
player.aircraft.damage_engine_warn_sent = True
#Warn the player
message = "Your engine has been damaged! You can't turn on your afterburner!"
message_to_client.append(FSNETCMD_TEXTMESSAGE.encode(message,True))
-
+
debug(f"Engine damage warning sent to {player.username}")
-
+
message_to_client.append(FSNETCMD_AIRCMD.set_afterburner(player.aircraft.id, False, True))
-
+
return False
-
+
def on_weapon_config(self, data, player, message_to_client, message_to_server):
if ENABLED:
player.aircraft.just_repaired = True
diff --git a/proxy.py b/proxy.py
index 46bcfa7..9e0566f 100644
--- a/proxy.py
+++ b/proxy.py
@@ -6,7 +6,8 @@ Lisenced under GPLv3
import asyncio
from struct import unpack, pack
from lib.parseFlightData import parseFlightData
-from lib import YSchat, YSviaversion, Player, Aircraft
+from lib import YSchat, YSviaversion, Player, Aircraft, triggerCommand
+from lib.triggerRespectiveHook import triggerRespectiveHook, triggerRespectiveHookServer
from lib.plugin_manager import PluginManager
from lib.PacketManager.PacketManager import PacketManager
from lib.PacketManager.packets import *
@@ -16,9 +17,6 @@ from config import *
if DISCORD_ENABLED: from lib.discordSync import *
import traceback
-# TODO: Remove in Production
-# from random import randint
-
# Configuration
SERVER_HOST = SERVER_HOST
SERVER_PORT = SERVER_PORT
@@ -119,10 +117,11 @@ async def handle_client(client_reader, client_writer):
try:
+
if packet_type == "FSNETCMD_LOGON":
- keep_message = plugin_manager.triggar_hook('on_login', packet, player, message_to_client, message_to_server)
- if not keep_message:
- data = None
+ # keep_message = plugin_manager.triggar_hook('on_login', packet, player, message_to_client, message_to_server)
+ # if not keep_message:
+ # data = None
player.login(FSNETCMD_LOGON(packet))
if player.version != YSF_VERSION and VIA_VERSION:
info(f"ViaVersion enabled : Porting {player.username} from {player.version} to {YSF_VERSION}")
@@ -134,11 +133,11 @@ async def handle_client(client_reader, client_writer):
elif packet_type == "FSNETCMD_AIRPLANESTATE":
player.aircraft.add_state(FSNETCMD_AIRPLANESTATE(packet)) #TODO: Do we want to convert all this to plugins? Probably not, but there is duplicated functionality
- keep_message = plugin_manager.triggar_hook('on_flight_data', packet, player, message_to_client, message_to_server)
- if not keep_message:
- data = None
+ # keep_message = plugin_manager.triggar_hook('on_flight_data', packet, player, message_to_client, message_to_server)
+ # if not keep_message:
+ # data = None
- elif player.aircraft.prev_life < player.aircraft.life and player.aircraft.prev_life != -1 and not player.aircraft.just_repaired:
+ if player.aircraft.prev_life < player.aircraft.life and player.aircraft.prev_life != -1 and not player.aircraft.just_repaired:
cheatingMsg = YSchat.message(f"{HEALTH_HACK_MESSAGE} by {player.username}")
warning(f"Health hack detected for {player.username}, Connected from {player.ip}")
message_to_server.append(cheatingMsg)
@@ -149,24 +148,35 @@ async def handle_client(client_reader, client_writer):
player.aircraft.reset()
elif packet_type == "FSNETCMD_WEAPONCONFIG":
- keep_message = plugin_manager.triggar_hook('on_weapon_config', packet, player, message_to_client, message_to_server)
- if not keep_message:
- data = None
+ #keep_message = plugin_manager.triggar_hook('on_weapon_config', packet, player, message_to_client, message_to_server)
+ #if not keep_message:
+ # data = None
+ pass
elif packet_type == "FSNETCMD_TEXTMESSAGE":
msg = FSNETCMD_TEXTMESSAGE(packet)
- keep_message = plugin_manager.triggar_hook('on_chat', packet, player, message_to_client, message_to_server)
- if not keep_message:
- data = None
+ # keep_message = plugin_manager.triggar_hook('on_chat', packet, player, message_to_client, message_to_server)
+ # if not keep_message:
+ # data = None
+
finalMsg = (f"{player.username} : {msg.message}")
+ if msg.message.startswith(PREFIX):
+ data = None
+ command = msg.message.split(" ")[0][1:]
+ asyncio.create_task(triggerCommand.triggerCommand(command, msg.message, player, message_to_client, message_to_server, plugin_manager))
if DISCORD_ENABLED:
# Make it non blocking!
asyncio.create_task(discord_send_message(CHANNEL_ID, finalMsg))
+
elif packet_type == "FSNETCMD_LIST":
- keep_message = plugin_manager.triggar_hook('on_list', packet, player, message_to_client, message_to_server)
- if not keep_message:
- data = None
+ # keep_message = plugin_manager.triggar_hook('on_list', packet, player, message_to_client, message_to_server)
+ # if not keep_message:
+ # data = None
+ pass
+
+ keep_message = triggerRespectiveHook(packet_type, packet, player, message_to_client, message_to_server, plugin_manager)
+ if not keep_message: data = None
except Exception as e:
warning(f"Error parsing flight data: {e}", exc_info=True)
@@ -176,6 +186,9 @@ async def handle_client(client_reader, client_writer):
debug("S2C" + str(packet_type))
debug(data)
+ keep_message = triggerRespectiveHookServer(packet_type, packet, player, message_to_client, message_to_server, plugin_manager)
+ if not keep_message: data = None
+
#Coming from the server to the client
if packet_type == "FSNETCMD_ADDOBJECT":
if player.check_add_object(FSNETCMD_ADDOBJECT(packet)):
@@ -196,16 +209,6 @@ async def handle_client(client_reader, client_writer):
if DISCORD_ENABLED:
asyncio.create_task(discord_send_message(CHANNEL_ID, f"{player.username} has joined the server!"))
- elif packet_type == "FSNETCMD_ENVIRONMENT":
- keep_message = plugin_manager.triggar_hook('on_environment_server', packet, player, message_to_client, message_to_server)
- if not keep_message:
- data = None
-
- elif packet_type == "FSNETCMD_LIST":
- keep_message = plugin_manager.triggar_hook('on_list_server', packet, player, message_to_client, message_to_server)
- if not keep_message:
- data = None
-
# Forward the packet to the other endpoint if the data packet still exists.
if data:
writer.write(data)