Events
The Events system lets mods listen to 60+ game events and emit custom cross-mod events.
Global Events
Use the Events namespace for mod-level event listening:
typescript
import { Events } from "@hotbunny/hackhub-content-sdk";
Events.on("Terminal.NmapScan", (data) => {
console.log(`Player scanned ${data.ip}`);
});Events.on() returns an unsubscribe function:
typescript
const unsub = Events.on("Terminal.Ping", (data) => {
console.log(`Pinged ${data.ip}`);
});
// later...
unsub();Quest-Scoped Events
Inside quests, always use this.Events instead of the global Events. Listeners registered through this.Events are automatically cleaned up when the quest completes or is abandoned.
typescript
@RegisterQuest
class MyQuest extends Quest {
// ...
OnStart() {
this.Events.on("Terminal.NmapScan", (data) => {
// automatically removed on complete/abandon
});
}
}See the Quests guide for more details.
Custom Events
Emit and listen to custom events for cross-mod communication:
typescript
Events.emit("MyMod.ScoreUpdated", { score: 100 });
Events.on("MyMod.ScoreUpdated", (data) => {
console.log(`Score: ${data.score}`);
});You can optionally register event names for discoverability:
typescript
Events.register("MyMod.ScoreUpdated");Game Events Reference
Terminal
| Event | Payload |
|---|---|
Terminal.NmapScan | { ip, ports } |
Terminal.Nslookup | { domain, ip } |
Terminal.Ping | { ip } |
Terminal.InstallPackage | { name } |
Terminal.SSH.Connected | { ip, username } |
Terminal.SSH.FileDownload | { ip, filename } |
Terminal.Cd | { path } |
Terminal.Ls | { path } |
Terminal.Openssl | { file } |
Terminal.SSH.Shutdown | { ip } |
Terminal.Lynx.Search | { query } |
Terminal.Lynx.Lookup | { query, results } |
Terminal.Mxlookup | { domain } |
Terminal.Ifconfig | { } |
Network & Scanning
| Event | Payload |
|---|---|
Terminal.Hydra | { ip, username, password } |
Terminal.Whois | { domain } |
Terminal.FTP.Connect | { ip } |
Terminal.Dig | { domain } |
Terminal.Dirhunter | { ip, directories } |
Terminal.Geoip | { ip } |
Terminal.Cat | { filename } |
Subfinder.Results | { domain, subdomains } |
Nuclei.Results | { target, vulnerabilities } |
Exploitation
| Event | Payload |
|---|---|
Metasploit.Msfconsole | { } |
Metasploit.Search | { query } |
Metasploit.Use | { module } |
Metasploit.ShowOptions | { module } |
Metasploit.SetOption | { key, value } |
Metasploit.Event | { type } |
Metasploit.Rootgrab | { ip } |
Meterpreter.Connected | { ip } |
Meterpreter.Download | { ip, file } |
Hashcat.Event | { hash } |
John.Decrypt.Hash | { hash } |
Fern.FindPassword | { ssid, password } |
Bettercap
| Event | Payload |
|---|---|
Bettercap.Open | { } |
Bettercap.Close | { } |
Bettercap.NetProbe | { } |
Bettercap.NetShow | { devices } |
Bettercap.WifiRecon | { networks } |
Bettercap.WifiDeAuth | { ssid } |
Files & Browser
| Event | Payload |
|---|---|
Files.Open | { filename } |
Files.Transfer | { filename, direction } |
Files.Deleted | { filename } |
Explorer.Event | { path } |
Browser.WebsiteOpened | { host } |
Browser.Meta | { url } |
Communication
| Event | Payload |
|---|---|
Mail.Received | { from, subject } |
Mail.Read | { id } |
Mail.Mailbox.Opened | { } |
Mail.Account.Created | { email } |
Mail.Account.LoggedIn | { email } |
Social
| Event | Payload |
|---|---|
Twotter.Account.Created | { username } |
Twotter.Account.Login | { username } |
Twotter.Account.Logout | { username } |
Twotter.Post.Seen | { postId } |
Twotter.Post | { content } |
Twotter.Profile.Seen | { username } |
Kisscord.FriendAdded | { userId } |
Kisscord.Messaging | { contactId } |
WeeChat.Connected | { host } |
WeeChat.Disconnected | { host } |
WeeChat.Message | { host, content } |
Other
| Event | Payload |
|---|---|
Bank.Transfer | { amount, from, to } |
Bank.Account.Created | { iban } |
Bank.Logout | { } |
Quest.Claimed | { questName } |
Database.Connected | { ip } |
Database.DataUpdate | { table } |
Sqlmap.ListTables | { ip, tables } |
Sqlmap.DumpTable | { ip, table } |
Network.PortChanges | { ip, ports } |
Network.UserActivity | { ip, username } |
Network.WifiConnected | { ssid } |
PFSense.Login | { ip } |
PFSense.Changes | { ip } |
Process.Killed | { name, pid } |
Wireshark.Started | { } |
Wireshark.Stopped | { } |
Python3.ExecFile | { filename } |
BCC.News.Opened | { } |
Remote.Connection.Established | { ip } |
Remote.Connection.Disconnected | { ip } |
INFO
Requires the events permission in your manifest.json.
