Turn
notifications into
narratives.
A thought bubble notification system designed for immersive roleplay.
In traditional FiveM servers, notifications often break immersion with meta-gaming information: “Not enough police online” or “You don’t have the required skill level.” These messages force players to acknowledge game mechanics rather than staying in character.
mad-thoughts transforms this experience by displaying notifications as the character’s inner thoughts. When a player encounters a locked door they can’t pick, instead of seeing “Lockpicking skill too low,” they’ll think: “This lock looks too complex for me…”
Purchase on Tebex
https://madcap-scripts.tebex.io/package/mad-thoughts
Preview
Watch the preview video to see mad-thoughts in action, or view the screenshots below.
Documentation
Read the docs for more details.
Features & Benefits
Immersive Thought Bubbles: Displays character thoughts above the player’s head
Rich Customization: Icons, colors, and timing options
Scenario System: Automatic thoughts based on gameplay situations
Message Variety: Random selection prevents repetition
Location Awareness: Thoughts trigger in specific areas
Sequential Thoughts: Create story-driven thought chains
Server-Wide Thoughts: Send thoughts to all connected players
Developer-Friendly: Simple exports for easy implementation
Perfect For:
- Skill check feedback that doesn’t break immersion
- Subtle environmental storytelling
- Replacing meta-gaming notifications with in-character thoughts
- Adding personality and depth to player characters
- Creating a more cinematic and immersive experience
Transform your server’s notification system from immersion-breaking text to character-driven thoughts . Your players will feel more connected to their characters , and your world will feel more authentic and alive.
Scenarios & Locations
The real power of mad-thoughts comes from creating your own custom scenarios and locations. While the resource includes several pre-built examples, you’re encouraged to create ones tailored to your server.
Scenario-Based Thoughts
Scenarios automatically trigger thoughts based on specific conditions that you define. The included examples cover:
- Health status (low health)
- Environmental conditions (rain, thunder, night time)
- Player actions (swimming, running)
- Character needs (hunger, thirst)
Each scenario uses a check function to determine when to trigger, plus the same customization options as regular thoughts (message, icon, color, duration, etc.).
Location-Based Thoughts
Location thoughts appear when players enter areas you’ve defined. The resource includes examples for:
- Hospitals, police stations
- Beaches, mountains, landmarks
- Buildings, neighborhoods
You simply define coordinates and a trigger radius, along with the thought customization (message, icon, color, duration, etc.).
Both scenario and location-based features can be completely customized through the config.lua file or disabled entirely if you prefer to trigger thoughts only through direct exports.
How to Use
Basic Thoughts
-- Basic notification
exports['mad-thoughts']:thought("I can't do this right now...")
-- With duration (10 seconds)
exports['mad-thoughts']:thought("I wonder what that means...", 10)
-- With icon
exports['mad-thoughts']:thought("Something doesn't feel right about this...", 5, "fas fa-question-circle")
-- With icon and color
exports['mad-thoughts']:thought("I need to get out of here!", 8, "fas fa-exclamation", "#e74c3c")
Parameters
- message : The text content of the thought (string)
- duration : How long the thought displays in seconds (number, default: 5)
- icon : Font Awesome icon class (string, default: “fas fa-comment-dots”)
- color : Hex color code for the icon and border (string, default: “#F2F2F2”)
Using predefined types
exports['mad-thoughts']:info("I just remembered where I left my keys...", 5)
exports['mad-thoughts']:success("I finally figured it out!", 5)
exports['mad-thoughts']:warning("This doesn't look safe...", 5)
exports['mad-thoughts']:error("I've made a terrible mistake...", 5)
Predefined types use the following icons and colors:
- info: “fas fa-info-circle” with blue color (#2B78FC)
- success: “fas fa-check-circle” with green color (#06CE6B)
- warning: “fas fa-exclamation-triangle” with orange color (#FB8607)
- error: “fas fa-times-circle” with red color (#fe2436)
Sequential Thoughts
Display multiple thoughts in sequence:
exports['mad-thoughts']:thoughtChain({
{message = "That's strange...", duration = 3},
{message = "I wonder if anyone is here...", duration = 4, icon = "fas fa-question"},
{message = "Better be careful.", duration = 3, color = "#e74c3c"}
}, 4000)
Parameters
- thoughts: Array of thought objects, each with message, duration, icon, and color
- delay: Time between thoughts in milliseconds (default: 3s)
- initialDelay: Optional delay before starting the sequence (default: 0s)
Dynamic Scenario and Location Triggers
The system allows you to dynamically create and remove thought triggers. This is especially useful for:
- Thoughts that appear only during certain jobs/heists, etc
- Temporary areas that should trigger thoughts for a limited time
Registering Custom Scenario
exports['mad-thoughts']:registerScenario('myResourceScenario', {
check = function(ped)
return IsPedAimingFromCover(ped)
end,
message = "Ready, aim, fire...",
duration = 6,
icon = "fas fa-crosshairs",
color = "#FF0000",
cooldown = 30
})
Registering Custom Locations
exports['mad-thoughts']:registerLocation('myResourceLocation', {
coords = vector3(176.52, -954.48, 30.09),
distance = 20.0,
message = "This place looks familiar...",
duration = 5,
icon = "fas fa-building",
color = "#3498db",
cooldown = 300
})
Removing Custom Scenarios & Locations
-- Remove a scenario you previously registered
exports['mad-thoughts']:removeScenario('myResourceScenario')
-- Remove a location you previously registered
exports['mad-thoughts']:removeLocation('myResourceLocation')
Server-Wide Thoughts
You can send thoughts to all connected players:
From a Client Script
-- Send a thought to all players on the server
exports['mad-thoughts']:sendThoughtToAll(
"Everyone should see this message!", -- message
5, -- duration in seconds
"fas fa-bullhorn", -- icon
"#E67E22" -- color (orange)
)
From a Server Script
-- Send a thought directly from a server script
exports['mad-thoughts']:sendThoughtToAll(
"Server announcement as a thought", -- message
5, -- duration in seconds
"fas fa-server", -- icon
"#3498db" -- color (blue)
)
Via Command
-- Basic usage
/globalthought "This is a global announcement"
-- With custom duration (in seconds)
/globalthought "This is a global announcement" "10"
-- With custom icon
/globalthought "This is a global announcement" "10" "fa-solid fa-bell"
-- With custom color
/globalthought "This is a global announcement" "10" "fa-solid fa-bell" "#FF5733"
This command requires the group.admin permission
Common Use Cases
Making NPCs More Immersive
-- When player approaches a mission NPC
exports['mad-thoughts']:thought("I wonder if I should talk to this stranger...", 5)
Skill Check Feedback
-- Instead of "Lockpicking failed"
exports['mad-thoughts']:error("I can't seem to get these tumblers right...", 4)
Environmental Storytelling
-- When entering an abandoned building
exports['mad-thoughts']:thoughtChain({
{message = "This place gives me the creeps...", duration = 4},
{message = "Feels like someone's watching me...", duration = 3, icon = "fas fa-eye"}
}, 3000)
Dependencies
Configuration
The resource comes with a comprehensive config.lua
file that includes:
- Ready-to-use templates for scenarios and locations
- Detailed comments explaining every configuration option
- Example scenarios for common situations (underwater, low health, weather conditions)
- Example locations for popular spots around the map
Debug
The resource includes debug visualizations to help you set up and test your location triggers:
Enable debug mode in your config.lua
:
Debug = true, -- boolean (true/false | default: false)
When debug mode is enabled, you’ll see:
- Visual indicators showing location trigger zones as red spheres
- Location IDs displayed above each zone
This is particularly useful when:
- Setting up new location triggers to ensure they’re in the right place
- Testing the detection radius of your locations
Support
Join our Discord community for support, regular updates and to request new features.
Code is accessible | No |
Subscription-based | No |
Lines (approximately) | 1,249 |
Requirements | ox_lib |
Support | Yes |
My other resources:
mad-drugruns - Drug Manufacturing & Trafficking
mad-perform - Dynamic Street Performance System
mad-magic8ball - Realistic Magic 8-Ball
mad-vendrob v2 - Ultimate Vending Machine Robbery
mad-musicgame - Rhythm-based Mini-game [FREE]
minimal-hud - Minimalistic & Standalone HUD [FREE]
mad-restyles - Restyled Community Resources [FREE]
mad-loot - Advanced Loot Table Generation System [FREE]
mad-cipherheist - Immersive Signal Decryption Heist [FREE]
mad-ccat-heist - Federal Software Heist [FREE]
mad-vendrob v1 - Vending Machine Robbery [FREE]