Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions KISSMultiplayer/lua/ge/extensions/network.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 = {}
Expand Down Expand Up @@ -117,6 +119,21 @@ local function handle_lua(data)
end
end

local function client_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]
Expand Down Expand Up @@ -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 = client_trigger_event
message_handlers.PlayerInfoUpdate = handle_player_info
message_handlers.VehicleMetaUpdate = vehiclemanager.update_vehicle_meta
message_handlers.Pong = handle_pong
Expand Down Expand Up @@ -187,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")
Expand Down Expand Up @@ -429,6 +455,8 @@ end
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
Expand Down
10 changes: 10 additions & 0 deletions kissmp-server/src/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
6 changes: 6 additions & 0 deletions kissmp-server/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
12 changes: 12 additions & 0 deletions kissmp-server/src/lua.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<u32>),
Expand Down Expand Up @@ -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(())
});
}
}

Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions shared/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ pub enum ClientCommand {
ResetVehicle(VehicleReset),
Chat(String),
RequestMods(Vec<String>),
TriggerEvent(String, String),
VehicleMetaUpdate(VehicleMeta),
VehicleChanged(u32),
CouplerAttached(CouplerAttached),
Expand All @@ -94,6 +95,7 @@ pub enum ServerCommand {
Chat(String, Option<u32>),
TransferFile(String),
SendLua(String),
TriggerEvent(String, String),
PlayerInfoUpdate(ClientInfoPublic),
VehicleMetaUpdate(VehicleMeta),
PlayerDisconnected(u32),
Expand Down