Hooks
This document describes the hooks available in the Broadcasts module for managing class and faction broadcast systems.
ClassBroadcastLogged
Purpose
Called when a class broadcast is logged to the server logs.
Parameters
client(Player): The player who sent the broadcast.message(string): The broadcast message content.classList(table): Array of class names that received the broadcast.
Realm
Server.
When Called
This hook is triggered after:
- The broadcast has been sent to all target players
- The broadcast has been logged via lia.log.add()
Example Usage
-- Track broadcast statistics
hook.Add("ClassBroadcastLogged", "TrackBroadcastStats", function(client, message, classList)
local char = client:getChar()
if char then
local broadcasts = char:getData("class_broadcasts_sent", 0)
char:setData("class_broadcasts_sent", broadcasts + 1)
-- Track message length
local avgLength = char:getData("avg_broadcast_length", 0)
local newAvg = (avgLength * broadcasts + #message) / (broadcasts + 1)
char:setData("avg_broadcast_length", newAvg)
end
end)
-- Send to external logging system
hook.Add("ClassBroadcastLogged", "ExternalLogging", function(client, message, classList)
local data = {
type = "class_broadcast",
sender = client:SteamID(),
sender_name = client:Name(),
message = message,
targets = classList,
timestamp = os.time()
}
http.Post("https://your-logging-service.com/broadcasts", data, function(response)
print("Class broadcast logged to external system")
end)
end)
-- Notify administrators of broadcasts
hook.Add("ClassBroadcastLogged", "NotifyAdmins", function(client, message, classList)
for _, admin in player.Iterator() do
if admin:IsAdmin() then
admin:notify(client:Name() .. " sent class broadcast to " .. table.concat(classList, ", ") .. ": " .. message)
end
end
end)
ClassBroadcastMenuClosed
Purpose
Called when the class broadcast selection menu is closed.
Parameters
client(Player): The player who closed the menu.selectedOptions(table): Array of selected class options.
Realm
Server.
When Called
This hook is triggered when: - The player makes their selection from the class broadcast menu - Before the broadcast is processed
Example Usage
-- Track menu usage
hook.Add("ClassBroadcastMenuClosed", "TrackMenuUsage", function(client, selectedOptions)
local char = client:getChar()
if char then
local menuUses = char:getData("broadcast_menu_uses", 0)
char:setData("broadcast_menu_uses", menuUses + 1)
-- Track selection patterns
local selections = char:getData("class_selections", {})
for _, option in ipairs(selectedOptions) do
selections[option] = (selections[option] or 0) + 1
end
char:setData("class_selections", selections)
end
end)
-- Validate selections
hook.Add("ClassBroadcastMenuClosed", "ValidateSelections", function(client, selectedOptions)
if #selectedOptions == 0 then
client:notify("No classes selected!")
return false
end
if #selectedOptions > 5 then
client:notify("Too many classes selected! Maximum 5 allowed.")
return false
end
end)
-- Log menu closure
hook.Add("ClassBroadcastMenuClosed", "LogMenuClosure", function(client, selectedOptions)
lia.log.add(client, "classBroadcastMenuClosed", #selectedOptions .. " classes selected")
end)
ClassBroadcastMenuOpened
Purpose
Called when the class broadcast selection menu is opened.
Parameters
client(Player): The player who opened the menu.options(table): Array of available class options.
Realm
Server.
When Called
This hook is triggered when:
- The classbroadcast command is executed
- Before the menu is displayed to the client
Example Usage
-- Track menu opening
hook.Add("ClassBroadcastMenuOpened", "TrackMenuOpening", function(client, options)
local char = client:getChar()
if char then
char:setData("last_broadcast_menu", os.time())
char:setData("available_classes", #options)
end
lia.log.add(client, "classBroadcastMenuOpened", #options .. " classes available")
end)
-- Filter available options
hook.Add("ClassBroadcastMenuOpened", "FilterOptions", function(client, options)
local char = client:getChar()
if char and char:getData("restricted_classes", false) then
-- Remove restricted classes from options
local restricted = char:getData("restricted_class_list", {})
for i = #options, 1, -1 do
for _, restrictedClass in ipairs(restricted) do
if string.find(options[i], restrictedClass) then
table.remove(options, i)
break
end
end
end
end
end)
-- Apply menu restrictions
hook.Add("ClassBroadcastMenuOpened", "ApplyRestrictions", function(client, options)
-- Check cooldown
local lastBroadcast = client:getData("last_class_broadcast", 0)
if os.time() - lastBroadcast < 300 then -- 5 minute cooldown
client:notify("Please wait before sending another class broadcast!")
return false
end
end)
ClassBroadcastSent
Purpose
Called when a class broadcast has been successfully sent to all target players.
Parameters
client(Player): The player who sent the broadcast.message(string): The broadcast message content.classList(table): Array of class names that received the broadcast.
Realm
Server.
When Called
This hook is triggered after: - The broadcast has been sent to all target players - Before the success notification is sent to the client
Example Usage
-- Apply post-send effects
hook.Add("ClassBroadcastSent", "PostSendEffects", function(client, message, classList)
-- Play success sound
client:EmitSound("buttons/button14.wav", 75, 100)
-- Apply screen effect
client:ScreenFade(SCREENFADE.IN, Color(0, 255, 0, 10), 1, 0)
-- Create particle effect
local effect = EffectData()
effect:SetOrigin(client:GetPos() + Vector(0, 0, 50))
effect:SetMagnitude(1)
effect:SetScale(1)
util.Effect("Explosion", effect)
end)
-- Track successful broadcasts
hook.Add("ClassBroadcastSent", "TrackSuccessfulBroadcasts", function(client, message, classList)
local char = client:getChar()
if char then
local successful = char:getData("successful_class_broadcasts", 0)
char:setData("successful_class_broadcasts", successful + 1)
-- Track reach
local totalReach = char:getData("total_class_reach", 0)
char:setData("total_class_reach", totalReach + #classList)
end
end)
-- Award achievements
hook.Add("ClassBroadcastSent", "BroadcastAchievements", function(client, message, classList)
local char = client:getChar()
if char then
local broadcasts = char:getData("successful_class_broadcasts", 0)
if broadcasts == 1 then
client:notify("Achievement: First Class Broadcast!")
elseif broadcasts == 10 then
client:notify("Achievement: Class Communicator!")
elseif broadcasts == 50 then
client:notify("Achievement: Class Broadcast Master!")
end
end
end)
FactionBroadcastLogged
Purpose
Called when a faction broadcast is logged to the server logs.
Parameters
client(Player): The player who sent the broadcast.message(string): The broadcast message content.factionList(table): Array of faction names that received the broadcast.
Realm
Server.
When Called
This hook is triggered after:
- The broadcast has been sent to all target players
- The broadcast has been logged via lia.log.add()
Example Usage
-- Track faction broadcast statistics
hook.Add("FactionBroadcastLogged", "TrackFactionBroadcastStats", function(client, message, factionList)
local char = client:getChar()
if char then
local broadcasts = char:getData("faction_broadcasts_sent", 0)
char:setData("faction_broadcasts_sent", broadcasts + 1)
-- Track faction reach
for _, faction in ipairs(factionList) do
local factionReach = char:getData("faction_reach_" .. faction, 0)
char:setData("faction_reach_" .. faction, factionReach + 1)
end
end
end)
-- Send to external monitoring
hook.Add("FactionBroadcastLogged", "ExternalMonitoring", function(client, message, factionList)
local data = {
type = "faction_broadcast",
sender = client:SteamID(),
sender_name = client:Name(),
message = message,
targets = factionList,
timestamp = os.time()
}
http.Post("https://your-monitoring-service.com/faction-broadcasts", data, function(response)
print("Faction broadcast sent to monitoring system")
end)
end)
-- Alert high-priority factions
hook.Add("FactionBroadcastLogged", "AlertHighPriorityFactions", function(client, message, factionList)
local highPriorityFactions = {"police", "government", "military"}
for _, faction in ipairs(factionList) do
for _, priorityFaction in ipairs(highPriorityFactions) do
if string.find(string.lower(faction), priorityFaction) then
lia.log.add(client, "highPriorityFactionBroadcast", faction, message)
break
end
end
end
end)
FactionBroadcastMenuClosed
Purpose
Called when the faction broadcast selection menu is closed.
Parameters
client(Player): The player who closed the menu.selectedOptions(table): Array of selected faction options.
Realm
Server.
When Called
This hook is triggered when: - The player makes their selection from the faction broadcast menu - Before the broadcast is processed
Example Usage
-- Track faction menu usage
hook.Add("FactionBroadcastMenuClosed", "TrackFactionMenuUsage", function(client, selectedOptions)
local char = client:getChar()
if char then
local menuUses = char:getData("faction_broadcast_menu_uses", 0)
char:setData("faction_broadcast_menu_uses", menuUses + 1)
-- Track faction selection patterns
local selections = char:getData("faction_selections", {})
for _, option in ipairs(selectedOptions) do
selections[option] = (selections[option] or 0) + 1
end
char:setData("faction_selections", selections)
end
end)
-- Validate faction selections
hook.Add("FactionBroadcastMenuClosed", "ValidateFactionSelections", function(client, selectedOptions)
if #selectedOptions == 0 then
client:notify("No factions selected!")
return false
end
-- Check for conflicting factions
local conflictingFactions = {"police", "criminal"}
local hasPolice = false
local hasCriminal = false
for _, option in ipairs(selectedOptions) do
if string.find(string.lower(option), "police") then hasPolice = true end
if string.find(string.lower(option), "criminal") then hasCriminal = true end
end
if hasPolice and hasCriminal then
client:notify("Cannot broadcast to both police and criminal factions!")
return false
end
end)
-- Log faction menu closure
hook.Add("FactionBroadcastMenuClosed", "LogFactionMenuClosure", function(client, selectedOptions)
lia.log.add(client, "factionBroadcastMenuClosed", #selectedOptions .. " factions selected")
end)
FactionBroadcastMenuOpened
Purpose
Called when the faction broadcast selection menu is opened.
Parameters
client(Player): The player who opened the menu.options(table): Array of available faction options.
Realm
Server.
When Called
This hook is triggered when:
- The factionbroadcast command is executed
- Before the menu is displayed to the client
Example Usage
-- Track faction menu opening
hook.Add("FactionBroadcastMenuOpened", "TrackFactionMenuOpening", function(client, options)
local char = client:getChar()
if char then
char:setData("last_faction_broadcast_menu", os.time())
char:setData("available_factions", #options)
end
lia.log.add(client, "factionBroadcastMenuOpened", #options .. " factions available")
end)
-- Filter faction options based on player permissions
hook.Add("FactionBroadcastMenuOpened", "FilterFactionOptions", function(client, options)
local char = client:getChar()
if char then
local faction = char:getFaction()
-- Remove own faction from options (can't broadcast to self)
for i = #options, 1, -1 do
if string.find(options[i], faction) then
table.remove(options, i)
end
end
-- Check for restricted factions
local restrictedFactions = char:getData("restricted_factions", {})
for i = #options, 1, -1 do
for _, restricted in ipairs(restrictedFactions) do
if string.find(options[i], restricted) then
table.remove(options, i)
break
end
end
end
end
end)
-- Apply faction-specific restrictions
hook.Add("FactionBroadcastMenuOpened", "ApplyFactionRestrictions", function(client, options)
local char = client:getChar()
if char then
local faction = char:getFaction()
-- Check faction-specific cooldowns
local lastBroadcast = char:getData("last_faction_broadcast", 0)
local cooldown = 600 -- 10 minutes for faction broadcasts
if os.time() - lastBroadcast < cooldown then
client:notify("Please wait before sending another faction broadcast!")
return false
end
end
end)
FactionBroadcastSent
Purpose
Called when a faction broadcast has been successfully sent to all target players.
Parameters
client(Player): The player who sent the broadcast.message(string): The broadcast message content.factionList(table): Array of faction names that received the broadcast.
Realm
Server.
When Called
This hook is triggered after: - The broadcast has been sent to all target players - Before the success notification is sent to the client
Example Usage
-- Apply post-send effects for faction broadcasts
hook.Add("FactionBroadcastSent", "PostFactionSendEffects", function(client, message, factionList)
-- Play faction-specific sound
client:EmitSound("buttons/button15.wav", 75, 100)
-- Apply faction-specific screen effect
local char = client:getChar()
if char then
local faction = char:getFaction()
local color = Color(255, 255, 255, 10)
if faction == "police" then
color = Color(0, 0, 255, 10)
elseif faction == "criminal" then
color = Color(255, 0, 0, 10)
end
client:ScreenFade(SCREENFADE.IN, color, 1, 0)
end
end)
-- Track successful faction broadcasts
hook.Add("FactionBroadcastSent", "TrackSuccessfulFactionBroadcasts", function(client, message, factionList)
local char = client:getChar()
if char then
local successful = char:getData("successful_faction_broadcasts", 0)
char:setData("successful_faction_broadcasts", successful + 1)
-- Track cross-faction communication
local ownFaction = char:getFaction()
local crossFaction = false
for _, faction in ipairs(factionList) do
if faction ~= ownFaction then
crossFaction = true
break
end
end
if crossFaction then
char:setData("cross_faction_broadcasts", char:getData("cross_faction_broadcasts", 0) + 1)
end
end
end)
-- Award faction-specific achievements
hook.Add("FactionBroadcastSent", "FactionBroadcastAchievements", function(client, message, factionList)
local char = client:getChar()
if char then
local broadcasts = char:getData("successful_faction_broadcasts", 0)
if broadcasts == 1 then
client:notify("Achievement: First Faction Broadcast!")
elseif broadcasts == 5 then
client:notify("Achievement: Faction Communicator!")
elseif broadcasts == 25 then
client:notify("Achievement: Faction Broadcast Leader!")
end
end
end)
PreClassBroadcastSend
Purpose
Called before a class broadcast is sent to target players.
Parameters
client(Player): The player who is sending the broadcast.message(string): The broadcast message content.classList(table): Array of class names that will receive the broadcast.
Realm
Server.
When Called
This hook is triggered when:
- All validations have passed
- Before the broadcast is sent to target players
- Before ClassBroadcastSent hook
Example Usage
-- Filter broadcast content
hook.Add("PreClassBroadcastSend", "FilterBroadcastContent", function(client, message, classList)
-- Check for inappropriate content
local filteredWords = {"spam", "scam", "hack"}
for _, word in ipairs(filteredWords) do
if string.find(string.lower(message), word) then
client:notify("Your broadcast contains inappropriate content!")
return false
end
end
-- Check message length
if #message > 200 then
client:notify("Broadcast message too long! Maximum 200 characters.")
return false
end
end)
-- Apply pre-send effects
hook.Add("PreClassBroadcastSend", "PreSendEffects", function(client, message, classList)
-- Notify target classes about incoming broadcast
for _, ply in player.Iterator() do
if ply:getChar() then
local charClass = ply:getChar():getClass()
for _, className in ipairs(classList) do
if lia.class.list[charClass] and lia.class.list[charClass].name == className then
ply:notify("Incoming class broadcast from " .. client:Name() .. "!")
break
end
end
end
end
end)
-- Track pre-send statistics
hook.Add("PreClassBroadcastSend", "TrackPreSendStats", function(client, message, classList)
local char = client:getChar()
if char then
char:setData("last_class_broadcast", os.time())
char:setData("last_broadcast_message", message)
char:setData("last_broadcast_targets", classList)
end
end)
PreFactionBroadcastSend
Purpose
Called before a faction broadcast is sent to target players.
Parameters
client(Player): The player who is sending the broadcast.message(string): The broadcast message content.factionList(table): Array of faction names that will receive the broadcast.
Realm
Server.
When Called
This hook is triggered when:
- All validations have passed
- Before the broadcast is sent to target players
- Before FactionBroadcastSent hook
Example Usage
-- Filter faction broadcast content
hook.Add("PreFactionBroadcastSend", "FilterFactionBroadcastContent", function(client, message, factionList)
-- Check for sensitive content
local sensitiveWords = {"classified", "secret", "confidential"}
for _, word in ipairs(sensitiveWords) do
if string.find(string.lower(message), word) then
client:notify("Cannot use sensitive words in faction broadcasts!")
return false
end
end
-- Check for faction-specific restrictions
local char = client:getChar()
if char then
local faction = char:getFaction()
-- Police can't broadcast to criminal factions
if faction == "police" then
for _, targetFaction in ipairs(factionList) do
if string.find(string.lower(targetFaction), "criminal") then
client:notify("Police cannot broadcast to criminal factions!")
return false
end
end
end
end
end)
-- Apply pre-send effects for faction broadcasts
hook.Add("PreFactionBroadcastSend", "PreFactionSendEffects", function(client, message, factionList)
-- Notify target factions about incoming broadcast
for _, ply in player.Iterator() do
if ply:getChar() then
local charFaction = ply:getChar():getFaction()
for _, factionName in ipairs(factionList) do
if lia.faction.indices[charFaction] and lia.faction.indices[charFaction].name == factionName then
ply:notify("Incoming faction broadcast from " .. client:Name() .. "!")
break
end
end
end
end
end)
-- Track pre-send statistics for faction broadcasts
hook.Add("PreFactionBroadcastSend", "TrackPreFactionSendStats", function(client, message, factionList)
local char = client:getChar()
if char then
char:setData("last_faction_broadcast", os.time())
char:setData("last_faction_broadcast_message", message)
char:setData("last_faction_broadcast_targets", factionList)
end
end)