From 822b966a0caf6491c2ab4234d925b48bf343775d Mon Sep 17 00:00:00 2001 From: vulcan-dev Date: Fri, 3 Feb 2023 04:13:09 +0000 Subject: [PATCH 1/2] Added basic event functionality --- KISSMultiplayer/lua/ge/extensions/network.lua | 19 +++++++++++++++++++ kissmp-server/src/lib.rs | 6 ++++++ kissmp-server/src/lua.rs | 12 ++++++++++++ shared/src/lib.rs | 1 + 4 files changed, 38 insertions(+) diff --git a/KISSMultiplayer/lua/ge/extensions/network.lua b/KISSMultiplayer/lua/ge/extensions/network.lua index 8445be7..c415694 100644 --- a/KISSMultiplayer/lua/ge/extensions/network.lua +++ b/KISSMultiplayer/lua/ge/extensions/network.lua @@ -11,6 +11,7 @@ local current_download = nil local socket = require("socket") local messagepack = require("lua/common/libs/Lua-MessagePack/MessagePack") local ping_send_time = 0 +local events = {} M.players = {} M.socket = socket @@ -61,6 +62,7 @@ local function disconnect(data) M.connection.connected = false M.connection.tcp:close() M.players = {} + events = {} kissplayers.players = {} kissplayers.player_transforms = {} kissplayers.players_in_cars = {} @@ -117,6 +119,21 @@ local function handle_lua(data) end end +local function trigger_event(data) + local event = data[1] + local args = data[2] + if events[event] then + events[event](args) + end +end + +local function register_event(event, callback) + if events[event] then + log("W", "network", "Event "..tostring(event).." is already registered!") + end + events[event] = callback +end + local function handle_vehicle_lua(data) local id = data[1] local lua = data[2] @@ -153,6 +170,7 @@ local function onExtensionLoaded() message_handlers.ResetVehicle = vehiclemanager.reset_vehicle message_handlers.Chat = handle_chat message_handlers.SendLua = handle_lua + message_handlers.TriggerEvent = trigger_event message_handlers.PlayerInfoUpdate = handle_player_info message_handlers.VehicleMetaUpdate = vehiclemanager.update_vehicle_meta message_handlers.Pong = handle_pong @@ -429,6 +447,7 @@ end M.get_client_id = get_client_id M.connect = connect M.disconnect = disconnect +M.register_event = register_event M.cancel_download = cancel_download M.send_data = send_data M.onUpdate = onUpdate diff --git a/kissmp-server/src/lib.rs b/kissmp-server/src/lib.rs index 3df0a98..b4a80c0 100644 --- a/kissmp-server/src/lib.rs +++ b/kissmp-server/src/lib.rs @@ -60,6 +60,12 @@ impl Connection { pub async fn send_lua(&mut self, lua: String) { let _ = self.ordered.send(ServerCommand::SendLua(lua.clone())).await; } + pub async fn trigger_event(&mut self, event: String, data: String) { + let _ = self + .ordered + .send(ServerCommand::TriggerEvent(event.clone(), data.clone())) + .await; + } } pub struct Server { diff --git a/kissmp-server/src/lua.rs b/kissmp-server/src/lua.rs index 5f4bf02..044ab8c 100644 --- a/kissmp-server/src/lua.rs +++ b/kissmp-server/src/lua.rs @@ -13,6 +13,7 @@ pub enum LuaCommand { ChatMessageBroadcast(String), RemoveVehicle(u32), SendLua(u32, String), + TriggerEvent(u32, String, String), SendVehicleLua(u32, String), Kick(u32, String), SpawnVehicle(VehicleData, Option), @@ -194,6 +195,12 @@ impl rlua::UserData for LuaConnection { sender.0.send(LuaCommand::SendLua(this.id, lua)).unwrap(); Ok(()) }); + methods.add_method("triggerEvent", |lua_ctx, this, (event, data): (String, String)| { + let globals = lua_ctx.globals(); + let sender: MpscChannelSender = globals.get("MPSC_CHANNEL_SENDER")?; + sender.0.send(LuaCommand::TriggerEvent(this.id, event, data)).unwrap(); + Ok(()) + }); } } @@ -286,6 +293,11 @@ impl Server { conn.send_lua(lua.clone()).await; } } + TriggerEvent(id, event, data) => { + if let Some(conn) = self.connections.get_mut(&id) { + conn.trigger_event(event.clone(), data.clone()).await; + } + } SendVehicleLua(id, lua) => { for (_, client) in &mut self.connections { let _ = client diff --git a/shared/src/lib.rs b/shared/src/lib.rs index 3da3b4b..92ec84f 100644 --- a/shared/src/lib.rs +++ b/shared/src/lib.rs @@ -94,6 +94,7 @@ pub enum ServerCommand { Chat(String, Option), TransferFile(String), SendLua(String), + TriggerEvent(String, String), PlayerInfoUpdate(ClientInfoPublic), VehicleMetaUpdate(VehicleMeta), PlayerDisconnected(u32), From 077b260883500c0e1853bae5781f8569c4267a94 Mon Sep 17 00:00:00 2001 From: vulcan-dev Date: Fri, 3 Feb 2023 04:30:56 +0000 Subject: [PATCH 2/2] Client can now call server events --- KISSMultiplayer/lua/ge/extensions/network.lua | 13 +++++++++++-- kissmp-server/src/events.rs | 10 ++++++++++ shared/src/lib.rs | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/KISSMultiplayer/lua/ge/extensions/network.lua b/KISSMultiplayer/lua/ge/extensions/network.lua index c415694..7197c98 100644 --- a/KISSMultiplayer/lua/ge/extensions/network.lua +++ b/KISSMultiplayer/lua/ge/extensions/network.lua @@ -119,7 +119,7 @@ local function handle_lua(data) end end -local function trigger_event(data) +local function client_trigger_event(data) local event = data[1] local args = data[2] if events[event] then @@ -170,7 +170,7 @@ local function onExtensionLoaded() message_handlers.ResetVehicle = vehiclemanager.reset_vehicle message_handlers.Chat = handle_chat message_handlers.SendLua = handle_lua - message_handlers.TriggerEvent = trigger_event + message_handlers.TriggerEvent = client_trigger_event message_handlers.PlayerInfoUpdate = handle_player_info message_handlers.VehicleMetaUpdate = vehiclemanager.update_vehicle_meta message_handlers.Pong = handle_pong @@ -205,6 +205,14 @@ local function send_data(raw_data, reliable) M.connection.tcp:send(data) end +local function trigger_event(name, args) + if M.connection.connected then + send_data({ + TriggerEvent = {name, args} + }, true) + end +end + local function sanitize_addr(addr) -- Trim leading and trailing spaces that might occur during a copy/paste local sanitized = addr:gsub("^%s*(.-)%s*$", "%1") @@ -448,6 +456,7 @@ M.get_client_id = get_client_id M.connect = connect M.disconnect = disconnect M.register_event = register_event +M.trigger_event = trigger_event M.cancel_download = cancel_download M.send_data = send_data M.onUpdate = onUpdate diff --git a/kissmp-server/src/events.rs b/kissmp-server/src/events.rs index ec611d0..54a1380 100644 --- a/kissmp-server/src/events.rs +++ b/kissmp-server/src/events.rs @@ -122,6 +122,16 @@ impl Server { } } } + TriggerEvent(event, data) => { + self.lua.context(|lua_ctx| { + let _ = crate::lua::run_hook::<(u32, String), ()>( + lua_ctx, + String::from(event), + (client_id, data), + ); + }); + + } VehicleUpdate(data) => { if let Some(server_id) = self.get_server_id_from_game_id(client_id, data.vehicle_id) diff --git a/shared/src/lib.rs b/shared/src/lib.rs index 92ec84f..01ce956 100644 --- a/shared/src/lib.rs +++ b/shared/src/lib.rs @@ -70,6 +70,7 @@ pub enum ClientCommand { ResetVehicle(VehicleReset), Chat(String), RequestMods(Vec), + TriggerEvent(String, String), VehicleMetaUpdate(VehicleMeta), VehicleChanged(u32), CouplerAttached(CouplerAttached),